Slight fixes, add in commit trace flag.
base/traceflags.py: Add new commit rate trace flag. build/SConstruct: Add extra option for efence. cpu/beta_cpu/alpha_full_cpu_impl.hh: Use function calls instead of direct indexing (avoids confusion). cpu/beta_cpu/commit_impl.hh: Add commit rate trace output (might not be worthwhile in the future). cpu/beta_cpu/decode_impl.hh: Remove some older hacks. Fix it so that the isntruction properly sets its next PC to the one calculated by the branch. cpu/beta_cpu/fetch_impl.hh: Remove old commented code. cpu/beta_cpu/iew_impl.hh: Add extra check to ensure that the instruction is valid. cpu/beta_cpu/regfile.hh: Include trace file. --HG-- extra : convert_revision : 4ee1dc88f8a5ed9b65486c6c111a3718a8040e42
This commit is contained in:
parent
2fb632dbda
commit
90d4436351
8 changed files with 23 additions and 31 deletions
|
@ -136,7 +136,8 @@ baseFlags = [
|
||||||
'StoreSet',
|
'StoreSet',
|
||||||
'MemDepUnit',
|
'MemDepUnit',
|
||||||
'DynInst',
|
'DynInst',
|
||||||
'FullCPU'
|
'FullCPU',
|
||||||
|
'CommitRate'
|
||||||
]
|
]
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -114,11 +114,16 @@ def MySqlOpt(env):
|
||||||
def NoFastAllocOpt(env):
|
def NoFastAllocOpt(env):
|
||||||
env.Append(CPPDEFINES = 'NO_FAST_ALLOC')
|
env.Append(CPPDEFINES = 'NO_FAST_ALLOC')
|
||||||
|
|
||||||
|
# Enable efence
|
||||||
|
def EfenceOpt(env):
|
||||||
|
env.Append(LIBS=['efence'])
|
||||||
|
|
||||||
# Configuration options map.
|
# Configuration options map.
|
||||||
options_map = {
|
options_map = {
|
||||||
'MEASURE' : MeasureOpt,
|
'MEASURE' : MeasureOpt,
|
||||||
'MYSQL' : MySqlOpt,
|
'MYSQL' : MySqlOpt,
|
||||||
'NO_FAST_ALLOC' : NoFastAllocOpt
|
'NO_FAST_ALLOC' : NoFastAllocOpt,
|
||||||
|
'EFENCE' : EfenceOpt
|
||||||
}
|
}
|
||||||
|
|
||||||
# The 'local_configs' file can be used to define additional base
|
# The 'local_configs' file can be used to define additional base
|
||||||
|
|
|
@ -127,7 +127,7 @@ AlphaFullCPU<Impl>::copyToXC()
|
||||||
for (int i = 0; i < AlphaISA::NumIntRegs; ++i)
|
for (int i = 0; i < AlphaISA::NumIntRegs; ++i)
|
||||||
{
|
{
|
||||||
renamed_reg = renameMap.lookup(i);
|
renamed_reg = renameMap.lookup(i);
|
||||||
xc->regs.intRegFile[i] = regFile.intRegFile[renamed_reg];
|
xc->regs.intRegFile[i] = regFile.readIntReg(renamed_reg);
|
||||||
DPRINTF(FullCPU, "FullCPU: Copying register %i, has data %lli.\n",
|
DPRINTF(FullCPU, "FullCPU: Copying register %i, has data %lli.\n",
|
||||||
renamed_reg, regFile.intRegFile[renamed_reg]);
|
renamed_reg, regFile.intRegFile[renamed_reg]);
|
||||||
}
|
}
|
||||||
|
@ -136,8 +136,8 @@ AlphaFullCPU<Impl>::copyToXC()
|
||||||
for (int i = 0; i < AlphaISA::NumFloatRegs; ++i)
|
for (int i = 0; i < AlphaISA::NumFloatRegs; ++i)
|
||||||
{
|
{
|
||||||
renamed_reg = renameMap.lookup(i + AlphaISA::FP_Base_DepTag);
|
renamed_reg = renameMap.lookup(i + AlphaISA::FP_Base_DepTag);
|
||||||
xc->regs.floatRegFile.d[i] = regFile.floatRegFile[renamed_reg].d;
|
xc->regs.floatRegFile.d[i] = regFile.readFloatRegDouble(renamed_reg);
|
||||||
xc->regs.floatRegFile.q[i] = regFile.floatRegFile[renamed_reg].q;
|
xc->regs.floatRegFile.q[i] = regFile.readFloatRegInt(renamed_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
xc->regs.miscRegs.fpcr = regFile.miscRegs.fpcr;
|
xc->regs.miscRegs.fpcr = regFile.miscRegs.fpcr;
|
||||||
|
@ -169,15 +169,15 @@ AlphaFullCPU<Impl>::copyFromXC()
|
||||||
renamed_reg, regFile.intRegFile[renamed_reg],
|
renamed_reg, regFile.intRegFile[renamed_reg],
|
||||||
xc->regs.intRegFile[i]);
|
xc->regs.intRegFile[i]);
|
||||||
|
|
||||||
regFile.intRegFile[renamed_reg] = xc->regs.intRegFile[i];
|
regFile.setIntReg(renamed_reg, xc->regs.intRegFile[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then loop through the floating point registers.
|
// Then loop through the floating point registers.
|
||||||
for (int i = 0; i < AlphaISA::NumFloatRegs; ++i)
|
for (int i = 0; i < AlphaISA::NumFloatRegs; ++i)
|
||||||
{
|
{
|
||||||
renamed_reg = renameMap.lookup(i + AlphaISA::FP_Base_DepTag);
|
renamed_reg = renameMap.lookup(i + AlphaISA::FP_Base_DepTag);
|
||||||
regFile.floatRegFile[renamed_reg].d = xc->regs.floatRegFile.d[i];
|
regFile.setFloatRegDouble(renamed_reg, xc->regs.floatRegFile.d[i]);
|
||||||
regFile.floatRegFile[renamed_reg].q = xc->regs.floatRegFile.q[i] ;
|
regFile.setFloatRegInt(renamed_reg, xc->regs.floatRegFile.q[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then loop through the misc registers.
|
// Then loop through the misc registers.
|
||||||
|
|
|
@ -323,6 +323,7 @@ SimpleCommit<Impl>::commitInsts()
|
||||||
head_inst = rob->readHeadInst();
|
head_inst = rob->readHeadInst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DPRINTF(CommitRate, "%i\n", num_committed);
|
||||||
n_committed_dist.sample(num_committed);
|
n_committed_dist.sample(num_committed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -147,7 +147,7 @@ SimpleDecode<Impl>::squash(DynInstPtr &inst)
|
||||||
{
|
{
|
||||||
DPRINTF(Decode, "Decode: Squashing due to incorrect branch prediction "
|
DPRINTF(Decode, "Decode: Squashing due to incorrect branch prediction "
|
||||||
"detected at decode.\n");
|
"detected at decode.\n");
|
||||||
Addr new_PC = inst->nextPC;
|
Addr new_PC = inst->readNextPC();
|
||||||
|
|
||||||
toFetch->decodeInfo.branchMispredict = true;
|
toFetch->decodeInfo.branchMispredict = true;
|
||||||
toFetch->decodeInfo.doneSeqNum = inst->seqNum;
|
toFetch->decodeInfo.doneSeqNum = inst->seqNum;
|
||||||
|
@ -355,10 +355,9 @@ SimpleDecode<Impl>::decode()
|
||||||
|
|
||||||
// Go ahead and compute any PC-relative branches.
|
// Go ahead and compute any PC-relative branches.
|
||||||
|
|
||||||
if (inst->isDirectCtrl() && inst->isUncondCtrl() &&
|
if (inst->isDirectCtrl() && inst->isUncondCtrl()) {
|
||||||
inst->numDestRegs() == 0 && inst->numSrcRegs() == 0) {
|
|
||||||
inst->execute();
|
inst->setNextPC(inst->branchTarget());
|
||||||
inst->setExecuted();
|
|
||||||
|
|
||||||
if (inst->mispredicted()) {
|
if (inst->mispredicted()) {
|
||||||
++decodeBranchMispred;
|
++decodeBranchMispred;
|
||||||
|
|
|
@ -195,22 +195,6 @@ SimpleFetch<Impl>::lookupAndUpdateNextPC(DynInstPtr &inst, Addr &next_PC)
|
||||||
|
|
||||||
predict_taken = branchPred.predict(inst, next_PC);
|
predict_taken = branchPred.predict(inst, next_PC);
|
||||||
|
|
||||||
#if 0
|
|
||||||
predict_taken = branchPred.BPLookup(next_PC)
|
|
||||||
|
|
||||||
DPRINTF(Fetch, "Fetch: Branch predictor predicts taken? %i\n",
|
|
||||||
predict_taken);
|
|
||||||
|
|
||||||
// Only check the BTB if the BP has predicted taken.
|
|
||||||
if (predict_taken && branchPred.BTBValid(next_PC)) {
|
|
||||||
predict_target = branchPred.BTBLookup(next_PC);
|
|
||||||
DPRINTF(Fetch, "Fetch: BTB target is %#x.\n", predict_target);
|
|
||||||
} else {
|
|
||||||
predict_taken = false;
|
|
||||||
DPRINTF(Fetch, "Fetch: BTB does not have a valid entry.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
if (predict_taken) {
|
if (predict_taken) {
|
||||||
++predictedBranches;
|
++predictedBranches;
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,7 +249,6 @@ SimpleIEW<Impl, IQ>::squashDueToBranch(DynInstPtr &inst)
|
||||||
// Prediction was incorrect, so send back inverse.
|
// Prediction was incorrect, so send back inverse.
|
||||||
toCommit->branchTaken = inst->readCalcTarg() !=
|
toCommit->branchTaken = inst->readCalcTarg() !=
|
||||||
(inst->readPC() + sizeof(MachInst));
|
(inst->readPC() + sizeof(MachInst));
|
||||||
// toCommit->globalHist = inst->readGlobalHist();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Impl, class IQ>
|
template<class Impl, class IQ>
|
||||||
|
@ -363,10 +362,11 @@ SimpleIEW<Impl, IQ>::dispatchInsts()
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
} else if (inst->isExecuted()) {
|
} else if (inst->isExecuted()) {
|
||||||
|
assert(0 && "Instruction shouldn't be executed.\n");
|
||||||
DPRINTF(IEW, "IEW: Issue: Executed branch encountered, "
|
DPRINTF(IEW, "IEW: Issue: Executed branch encountered, "
|
||||||
"skipping.\n");
|
"skipping.\n");
|
||||||
|
|
||||||
assert(inst->isDirectCtrl());
|
// assert(inst->isDirectCtrl());
|
||||||
|
|
||||||
inst->setIssued();
|
inst->setIssued();
|
||||||
inst->setCanCommit();
|
inst->setCanCommit();
|
||||||
|
|
|
@ -8,6 +8,8 @@ using namespace std;
|
||||||
#include "arch/alpha/isa_traits.hh"
|
#include "arch/alpha/isa_traits.hh"
|
||||||
#include "cpu/beta_cpu/comm.hh"
|
#include "cpu/beta_cpu/comm.hh"
|
||||||
|
|
||||||
|
#include "base/trace.hh"
|
||||||
|
|
||||||
// This really only depends on the ISA, and not the Impl. It might be nicer
|
// This really only depends on the ISA, and not the Impl. It might be nicer
|
||||||
// to see if I can make it depend on nothing...
|
// to see if I can make it depend on nothing...
|
||||||
// Things that are in the ifdef FULL_SYSTEM are pretty dependent on the ISA,
|
// Things that are in the ifdef FULL_SYSTEM are pretty dependent on the ISA,
|
||||||
|
|
Loading…
Reference in a new issue