inorder: explicit fault check

Before graduating an instruction, explicitly check fault
by making the fault check it's own separate command
that can be put on an instruction schedule.
This commit is contained in:
Korey Sewell 2011-06-19 21:43:40 -04:00
parent 5f608dd2e9
commit 0bfdf342da
3 changed files with 22 additions and 11 deletions

View file

@ -517,7 +517,7 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
}
}
W.needs(Grad, GraduationUnit::GraduateInst);
W.needs(Grad, GraduationUnit::CheckFault);
for (int idx=0; idx < inst->numDestRegs(); idx++) {
W.needs(RegManager, UseDefUnit::WriteDestReg, idx);
@ -526,6 +526,8 @@ InOrderCPU::createBackEndSked(DynInstPtr inst)
if (inst->isControl())
W.needs(BPred, BranchPredictor::UpdatePredictor);
W.needs(Grad, GraduationUnit::GraduateInst);
// Insert Back Schedule into our cache of
// resource schedules
addToSkedCache(inst, res_sked);

View file

@ -56,6 +56,24 @@ GraduationUnit::execute(int slot_num)
switch (grad_req->cmd)
{
case CheckFault:
{
// Handle Any Faults Before Graduating Instruction
if (inst->fault != NoFault) {
DPRINTF(InOrderGraduation, "[tid:%i]: [sn:%i]: fault %s found for %s\n",
tid, inst->seqNum, inst->fault->name(),
inst->instName());
squashThenTrap(stage_num, inst);
grad_req->done(false);
return;
}
DPRINTF(InOrderGraduation, "[tid:%i] [sn:%i]: No fault found for %s\n",
tid, inst->seqNum, inst->instName());
grad_req->done();
}
break;
case GraduateInst:
{
if (lastNonSpecTick == curTick()) {
@ -65,16 +83,6 @@ GraduationUnit::execute(int slot_num)
return;
}
// Handle Any Faults Before Graduating Instruction
if (inst->fault != NoFault) {
DPRINTF(Fault, "[sn:%i]: fault %s found for %s\n",
inst->seqNum, inst->fault->name(),
inst->instName());
squashThenTrap(stage_num, inst);
grad_req->done(false);
return;
}
DPRINTF(InOrderGraduation,
"[tid:%i]:[sn:%i]: Graduating instruction %s.\n",
tid, inst->seqNum, inst->staticInst->disassemble(inst->instAddr()));

View file

@ -46,6 +46,7 @@ class GraduationUnit : public Resource {
typedef ThePipeline::DynInstPtr DynInstPtr;
enum Command {
CheckFault,
GraduateInst
};