changeset e0da7b3c3254 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=e0da7b3c3254
description:
        imported patch squash_from_next_stage

diffstat:

 src/cpu/inorder/cpu.cc                   |  31 ++++++++++++----------
 src/cpu/inorder/cpu.hh                   |  12 ++++++++-
 src/cpu/inorder/pipeline_stage.cc        |   6 +++-
 src/cpu/inorder/reg_dep_map.cc           |  42 ++++++++++++++++++++-----------
 src/cpu/inorder/reg_dep_map.hh           |   6 +---
 src/cpu/inorder/resources/decode_unit.cc |   5 +---
 6 files changed, 62 insertions(+), 40 deletions(-)

diffs (229 lines):

diff -r 89e38e3bbdaa -r e0da7b3c3254 src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:36 2011 -0400
+++ b/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:36 2011 -0400
@@ -1130,6 +1130,7 @@
     return pipelineStage[stage_num];
 }
 
+
 RegIndex
 InOrderCPU::flattenRegIdx(RegIndex reg_idx, RegType &reg_type, ThreadID tid)
 {
@@ -1455,29 +1456,31 @@
 
 
 inline void
-InOrderCPU::squashInstIt(const ListIt &instIt, ThreadID tid)
+InOrderCPU::squashInstIt(const ListIt inst_it, ThreadID tid)
 {
-    if ((*instIt)->threadNumber == tid) {
+    DynInstPtr inst = (*inst_it);
+    if (inst->threadNumber == tid) {
         DPRINTF(InOrderCPU, "Squashing instruction, "
                 "[tid:%i] [sn:%lli] PC %s\n",
-                (*instIt)->threadNumber,
-                (*instIt)->seqNum,
-                (*instIt)->pcState());
+                inst->threadNumber,
+                inst->seqNum,
+                inst->pcState());
 
-        (*instIt)->setSquashed();
+        inst->setSquashed();
+        archRegDepMap[tid].remove(inst);
 
-        if (!(*instIt)->isRemoveList()) {            
+        if (!inst->isRemoveList()) {
             DPRINTF(InOrderCPU, "Pushing instruction [tid:%i] PC %s "
                     "[sn:%lli] to remove list\n",
-                    (*instIt)->threadNumber, (*instIt)->pcState(),
-                    (*instIt)->seqNum);
-            (*instIt)->setRemoveList();        
-            removeList.push(instIt);
+                    inst->threadNumber, inst->pcState(),
+                    inst->seqNum);
+            inst->setRemoveList();
+            removeList.push(inst_it);
         } else {
             DPRINTF(InOrderCPU, "Ignoring instruction removal for [tid:%i]"
                     " PC %s [sn:%lli], already on remove list\n",
-                    (*instIt)->threadNumber, (*instIt)->pcState(),
-                    (*instIt)->seqNum);
+                    inst->threadNumber, inst->pcState(),
+                    inst->seqNum);
         }
     
     }
@@ -1499,7 +1502,7 @@
         ThreadID tid = inst->threadNumber;
 
         // Remove From Register Dependency Map, If Necessary
-        archRegDepMap[tid].remove(inst);
+        // archRegDepMap[tid].remove(inst);
 
         // Clear if Non-Speculative
         if (inst->staticInst &&
diff -r 89e38e3bbdaa -r e0da7b3c3254 src/cpu/inorder/cpu.hh
--- a/src/cpu/inorder/cpu.hh    Sun Jun 19 21:43:36 2011 -0400
+++ b/src/cpu/inorder/cpu.hh    Sun Jun 19 21:43:36 2011 -0400
@@ -547,6 +547,16 @@
 
     void setFloatRegBits(RegIndex reg_idx, FloatRegBits val,  ThreadID tid);
 
+    RegType inline getRegType(RegIndex reg_idx)
+    {
+        if (reg_idx < TheISA::FP_Base_DepTag)
+            return IntType;
+        else if (reg_idx < TheISA::Ctrl_Base_DepTag)
+            return FloatType;
+        else
+            return MiscType;
+    }
+
     RegIndex flattenRegIdx(RegIndex reg_idx, RegType &reg_type, ThreadID tid);
 
     /** Reads a miscellaneous register. */
@@ -617,7 +627,7 @@
     void removeInstsUntil(const InstSeqNum &seq_num,ThreadID tid);
 
     /** Removes the instruction pointed to by the iterator. */
-    inline void squashInstIt(const ListIt &instIt, ThreadID tid);
+    inline void squashInstIt(const ListIt inst_it, ThreadID tid);
 
     /** Cleans up all instructions on the instruction remove list. */
     void cleanUpRemovedInsts();
diff -r 89e38e3bbdaa -r e0da7b3c3254 src/cpu/inorder/pipeline_stage.cc
--- a/src/cpu/inorder/pipeline_stage.cc Sun Jun 19 21:43:36 2011 -0400
+++ b/src/cpu/inorder/pipeline_stage.cc Sun Jun 19 21:43:36 2011 -0400
@@ -351,9 +351,11 @@
                 inst->seqNum, cpu->squashSeqNum[tid]);
     } else {
         InstSeqNum squash_seq_num = inst->squashSeqNum;
+        unsigned squash_stage = (nextStageValid) ? stageNum + 1
+            : stageNum;
 
-        toPrevStages->stageInfo[stageNum][tid].squash = true;
-        toPrevStages->stageInfo[stageNum][tid].doneSeqNum =
+        toPrevStages->stageInfo[squash_stage][tid].squash = true;
+        toPrevStages->stageInfo[squash_stage][tid].doneSeqNum =
             squash_seq_num;
 
         DPRINTF(InOrderStage, "[tid:%i]: Squashing after [sn:%i], "
diff -r 89e38e3bbdaa -r e0da7b3c3254 src/cpu/inorder/reg_dep_map.cc
--- a/src/cpu/inorder/reg_dep_map.cc    Sun Jun 19 21:43:36 2011 -0400
+++ b/src/cpu/inorder/reg_dep_map.cc    Sun Jun 19 21:43:36 2011 -0400
@@ -89,7 +89,7 @@
     DPRINTF(RegDepMap, "Setting Output Dependencies for [sn:%i] "
             ", %s (dest. regs = %i).\n",
             inst->seqNum,
-            inst->staticInst->getName(),
+            inst->instName(),
             dest_regs);
 
     for (int i = 0; i < dest_regs; i++) {
@@ -98,6 +98,10 @@
         TheISA::RegIndex flat_idx = cpu->flattenRegIdx(raw_idx,
                                                        reg_type,
                                                        inst->threadNumber);
+
+        DPRINTF(RegDepMap, "[sn:%i] #%i flattened %i to %i.\n",
+                inst->seqNum, i, raw_idx, flat_idx);
+
         inst->flattenDestReg(i, flat_idx);
         insert(reg_type, flat_idx, inst);
     }
@@ -120,32 +124,40 @@
 RegDepMap::remove(DynInstPtr inst)
 {
     if (inst->isRegDepEntry()) {
-        DPRINTF(RegDepMap, "Removing [sn:%i]'s entries from reg. dep. map.\n",
-                inst->seqNum);
+        int dest_regs = inst->numDestRegs();
 
-        int dest_regs = inst->numDestRegs();
-        for (int i = 0; i < dest_regs; i++)
-            remove(inst->destRegIdx(i), inst);
+        DPRINTF(RegDepMap, "Removing [sn:%i]'s entries from reg. dep. map. for 
"
+                ", %s (dest. regs = %i).\n",
+                inst->seqNum,
+                inst->instName(),
+                dest_regs);
+
+
+        for (int i = 0; i < dest_regs; i++) {
+            InOrderCPU::RegType reg_type = 
cpu->getRegType(inst->destRegIdx(i));
+            remove(reg_type, inst->flattenedDestRegIdx(i), inst);
+        }
     }
 }
 
 void
-RegDepMap::remove(RegIndex idx, DynInstPtr inst)
+RegDepMap::remove(uint8_t reg_type, RegIndex idx, DynInstPtr inst)
 {
-    InOrderCPU::RegType reg_type;
-    TheISA::RegIndex flat_idx = cpu->flattenRegIdx(idx, reg_type,
-                                                   inst->threadNumber);
+    std::list<DynInstPtr>::iterator list_it = regMap[reg_type][idx].begin();
+    std::list<DynInstPtr>::iterator list_end = regMap[reg_type][idx].end();
 
-    std::list<DynInstPtr>::iterator list_it = 
regMap[reg_type][flat_idx].begin();
-    std::list<DynInstPtr>::iterator list_end = 
regMap[reg_type][flat_idx].end();
 
     while (list_it != list_end) {
         if((*list_it) == inst) {
-            regMap[reg_type][flat_idx].erase(list_it);
-            break;
+            DPRINTF(RegDepMap, "Removing [sn:%i] from %s dep. list for "
+                    "reg. idx %i.\n", inst->seqNum, mapNames[reg_type],
+                    idx);
+            regMap[reg_type][idx].erase(list_it);
+            return;
         }
         list_it++;
     }
+    panic("[sn:%i] Did not find entry for %i ", inst->seqNum, idx);
 }
 
 void
@@ -153,7 +165,7 @@
 {
    std::list<DynInstPtr>::iterator list_it = regMap[reg_type][idx].begin();
 
-   DPRINTF(RegDepMap, "[tid:%u]: Removing dependency entry on reg. idx"
+   DPRINTF(RegDepMap, "[tid:%u]: Removing dependency entry on reg. idx "
            "%i for [sn:%i].\n", inst->readTid(), idx, inst->seqNum);
 
    assert(list_it != regMap[reg_type][idx].end());
diff -r 89e38e3bbdaa -r e0da7b3c3254 src/cpu/inorder/reg_dep_map.hh
--- a/src/cpu/inorder/reg_dep_map.hh    Sun Jun 19 21:43:36 2011 -0400
+++ b/src/cpu/inorder/reg_dep_map.hh    Sun Jun 19 21:43:36 2011 -0400
@@ -98,10 +98,8 @@
      */
     void insert(uint8_t reg_type, RegIndex idx, DynInstPtr inst);
 
-    /** Remove a specific instruction and dest. register index from map
-     *  This must be called w/the unflattened registered index
-     */
-    void remove(RegIndex idx, DynInstPtr inst);
+    /** Remove a specific instruction and dest. register index from map */
+    void remove(uint8_t reg_type, RegIndex idx, DynInstPtr inst);
 
     typedef std::vector<std::list<DynInstPtr> > DepMap;
     std::vector<DepMap> regMap;
diff -r 89e38e3bbdaa -r e0da7b3c3254 src/cpu/inorder/resources/decode_unit.cc
--- a/src/cpu/inorder/resources/decode_unit.cc  Sun Jun 19 21:43:36 2011 -0400
+++ b/src/cpu/inorder/resources/decode_unit.cc  Sun Jun 19 21:43:36 2011 -0400
@@ -66,11 +66,8 @@
 
             if (inst->backSked != NULL) {
                 DPRINTF(InOrderDecode,
-                    "[tid:%i]: %s Setting Destination Register(s) for 
[sn:%i].\n",
+                    "[tid:%i]: Back End Schedule created for %s  [sn:%i].\n",
                         tid, inst->instName(), inst->seqNum);
-
-                //inst->printSked();
-
                 decode_req->done();
             } else {
                 DPRINTF(Resource,
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to