inorder: scheduling for nonspec insts
make handling of speculative and nonspeculative insts more explicit
This commit is contained in:
parent
3c417ea23a
commit
085f30ff9c
1 changed files with 39 additions and 21 deletions
|
@ -425,6 +425,8 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
|
|||
}
|
||||
}
|
||||
|
||||
//@todo: schedule non-spec insts to operate on this cycle
|
||||
// as long as all previous insts are done
|
||||
if ( inst->isNonSpeculative() ) {
|
||||
// skip execution of non speculative insts until later
|
||||
} else if ( inst->isMemRef() ) {
|
||||
|
@ -437,11 +439,12 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
|
|||
X.needs(ExecUnit, ExecutionUnit::ExecuteInst);
|
||||
}
|
||||
|
||||
// MEMORY
|
||||
if (!inst->isNonSpeculative()) {
|
||||
if (inst->opClass() == IntMultOp || inst->opClass() == IntDivOp) {
|
||||
X.needs(MDU, MultDivUnit::EndMultDiv);
|
||||
M.needs(MDU, MultDivUnit::EndMultDiv);
|
||||
}
|
||||
|
||||
// MEMORY
|
||||
if ( inst->isLoad() ) {
|
||||
M.needs(DCache, CacheUnit::InitiateReadData);
|
||||
} else if ( inst->isStore() ) {
|
||||
|
@ -451,19 +454,34 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
|
|||
M.needs(AGEN, AGENUnit::GenerateAddr);
|
||||
M.needs(DCache, CacheUnit::InitiateWriteData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// WRITEBACK
|
||||
if (!inst->isNonSpeculative()) {
|
||||
if ( inst->isLoad() ) {
|
||||
W.needs(DCache, CacheUnit::CompleteReadData);
|
||||
} else if ( inst->isStore() ) {
|
||||
W.needs(DCache, CacheUnit::CompleteWriteData);
|
||||
}
|
||||
|
||||
if ( inst->isNonSpeculative() ) {
|
||||
if ( inst->isMemRef() ) fatal("Non-Speculative Memory Instruction");
|
||||
} else {
|
||||
// Finally, Execute Speculative Data
|
||||
if (inst->isMemRef()) {
|
||||
if (inst->isLoad()) {
|
||||
W.needs(AGEN, AGENUnit::GenerateAddr);
|
||||
W.needs(DCache, CacheUnit::InitiateReadData);
|
||||
W.needs(DCache, CacheUnit::CompleteReadData);
|
||||
} else if (inst->isStore()) {
|
||||
if ( inst->numSrcRegs() >= 2 ) {
|
||||
W.needs(RegManager, UseDefUnit::ReadSrcReg, 1);
|
||||
}
|
||||
W.needs(AGEN, AGENUnit::GenerateAddr);
|
||||
W.needs(DCache, CacheUnit::InitiateWriteData);
|
||||
W.needs(DCache, CacheUnit::CompleteWriteData);
|
||||
}
|
||||
} else {
|
||||
W.needs(ExecUnit, ExecutionUnit::ExecuteInst);
|
||||
}
|
||||
}
|
||||
|
||||
W.needs(Grad, GraduationUnit::GraduateInst);
|
||||
|
||||
|
|
Loading…
Reference in a new issue