changeset 2e9141200f78 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=2e9141200f78
description:
        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.

diffstat:

 src/cpu/inorder/cpu.cc                       |   4 +++-
 src/cpu/inorder/resources/graduation_unit.cc |  28 ++++++++++++++++++----------
 src/cpu/inorder/resources/graduation_unit.hh |   1 +
 3 files changed, 22 insertions(+), 11 deletions(-)

diffs (77 lines):

diff -r 8d26dc2d92b2 -r 2e9141200f78 src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:39 2011 -0400
+++ b/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:40 2011 -0400
@@ -517,7 +517,7 @@
         }
     }
 
-    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 @@
     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);
diff -r 8d26dc2d92b2 -r 2e9141200f78 
src/cpu/inorder/resources/graduation_unit.cc
--- a/src/cpu/inorder/resources/graduation_unit.cc      Sun Jun 19 21:43:39 
2011 -0400
+++ b/src/cpu/inorder/resources/graduation_unit.cc      Sun Jun 19 21:43:40 
2011 -0400
@@ -56,6 +56,24 @@
 
     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 @@
                 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()));
diff -r 8d26dc2d92b2 -r 2e9141200f78 
src/cpu/inorder/resources/graduation_unit.hh
--- a/src/cpu/inorder/resources/graduation_unit.hh      Sun Jun 19 21:43:39 
2011 -0400
+++ b/src/cpu/inorder/resources/graduation_unit.hh      Sun Jun 19 21:43:40 
2011 -0400
@@ -46,6 +46,7 @@
     typedef ThePipeline::DynInstPtr DynInstPtr;
 
     enum Command {
+        CheckFault,
         GraduateInst
     };
 
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to