changeset 636adb85b6bd in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=636adb85b6bd
description:
        inorder: use flattenIdx for reg indexing
        - also use "threadId()" instead of readTid() everywhere
        - this will help support more complex ISA indexing

diffstat:

 src/cpu/inorder/cpu.cc               |   31 ++++++-
 src/cpu/inorder/cpu.hh               |   15 ++-
 src/cpu/inorder/reg_dep_map.cc       |   16 +++-
 src/cpu/inorder/reg_dep_map.hh       |    2 +-
 src/cpu/inorder/resources/use_def.cc |  126 ++++++++++++++++++----------------
 src/cpu/inorder/resources/use_def.hh |    1 +
 src/cpu/inorder/thread_context.cc    |   38 +++++++---
 src/cpu/inorder/thread_context.hh    |   26 +++---
 src/cpu/inorder/thread_state.hh      |    4 -
 9 files changed, 151 insertions(+), 108 deletions(-)

diffs (truncated from 637 to 300 lines):

diff -r 2fcd223a253b -r 636adb85b6bd src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:33 2011 -0400
+++ b/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:33 2011 -0400
@@ -1095,40 +1095,59 @@
     return pipelineStage[stage_num];
 }
 
+RegIndex
+InOrderCPU::flattenRegIdx(RegIndex reg_idx, ThreadID tid)
+{
+    if (reg_idx < FP_Base_DepTag) {
+        return isa[tid].flattenIntIndex(reg_idx);
+    } else if (reg_idx < Ctrl_Base_DepTag) {
+        reg_idx -= FP_Base_DepTag;
+        return isa[tid].flattenFloatIndex(reg_idx);
+    } else {
+        return reg_idx -= TheISA::Ctrl_Base_DepTag;
+    }
+}
+
 uint64_t
-InOrderCPU::readIntReg(int reg_idx, ThreadID tid)
+InOrderCPU::readIntReg(RegIndex reg_idx, ThreadID tid)
 {
+    DPRINTF(IntRegs, "[tid:%i]: Reading Int. Reg %i as %x\n",
+            tid, reg_idx, intRegs[tid][reg_idx]);
+
     return intRegs[tid][reg_idx];
 }
 
 FloatReg
-InOrderCPU::readFloatReg(int reg_idx, ThreadID tid)
+InOrderCPU::readFloatReg(RegIndex reg_idx, ThreadID tid)
 {
     return floatRegs.f[tid][reg_idx];
 }
 
 FloatRegBits
-InOrderCPU::readFloatRegBits(int reg_idx, ThreadID tid)
+InOrderCPU::readFloatRegBits(RegIndex reg_idx, ThreadID tid)
 {;
     return floatRegs.i[tid][reg_idx];
 }
 
 void
-InOrderCPU::setIntReg(int reg_idx, uint64_t val, ThreadID tid)
+InOrderCPU::setIntReg(RegIndex reg_idx, uint64_t val, ThreadID tid)
 {
+    DPRINTF(IntRegs, "[tid:%i]: Setting Int. Reg %i to %x\n",
+            tid, reg_idx, val);
+
     intRegs[tid][reg_idx] = val;
 }
 
 
 void
-InOrderCPU::setFloatReg(int reg_idx, FloatReg val, ThreadID tid)
+InOrderCPU::setFloatReg(RegIndex reg_idx, FloatReg val, ThreadID tid)
 {
     floatRegs.f[tid][reg_idx] = val;
 }
 
 
 void
-InOrderCPU::setFloatRegBits(int reg_idx, FloatRegBits val, ThreadID tid)
+InOrderCPU::setFloatRegBits(RegIndex reg_idx, FloatRegBits val, ThreadID tid)
 {
     floatRegs.i[tid][reg_idx] = val;
 }
diff -r 2fcd223a253b -r 636adb85b6bd src/cpu/inorder/cpu.hh
--- a/src/cpu/inorder/cpu.hh    Sun Jun 19 21:43:33 2011 -0400
+++ b/src/cpu/inorder/cpu.hh    Sun Jun 19 21:43:33 2011 -0400
@@ -80,6 +80,7 @@
     typedef TheISA::FloatReg FloatReg;
     typedef TheISA::FloatRegBits FloatRegBits;
     typedef TheISA::MiscReg MiscReg;
+    typedef TheISA::RegIndex RegIndex;
 
     //DynInstPtr TypeDefs
     typedef ThePipeline::DynInstPtr DynInstPtr;
@@ -509,17 +510,19 @@
     }
 
     /** Register file accessors  */
-    uint64_t readIntReg(int reg_idx, ThreadID tid);
+    uint64_t readIntReg(RegIndex reg_idx, ThreadID tid);
 
-    FloatReg readFloatReg(int reg_idx, ThreadID tid);
+    FloatReg readFloatReg(RegIndex reg_idx, ThreadID tid);
 
-    FloatRegBits readFloatRegBits(int reg_idx, ThreadID tid);
+    FloatRegBits readFloatRegBits(RegIndex reg_idx, ThreadID tid);
 
-    void setIntReg(int reg_idx, uint64_t val, ThreadID tid);
+    void setIntReg(RegIndex reg_idx, uint64_t val, ThreadID tid);
 
-    void setFloatReg(int reg_idx, FloatReg val, ThreadID tid);
+    void setFloatReg(RegIndex reg_idx, FloatReg val, ThreadID tid);
 
-    void setFloatRegBits(int reg_idx, FloatRegBits val,  ThreadID tid);
+    void setFloatRegBits(RegIndex reg_idx, FloatRegBits val,  ThreadID tid);
+
+    RegIndex flattenRegIdx(RegIndex reg_idx, ThreadID tid);
 
     /** Reads a miscellaneous register. */
     MiscReg readMiscRegNoEffect(int misc_reg, ThreadID tid = 0);
diff -r 2fcd223a253b -r 636adb85b6bd src/cpu/inorder/reg_dep_map.cc
--- a/src/cpu/inorder/reg_dep_map.cc    Sun Jun 19 21:43:33 2011 -0400
+++ b/src/cpu/inorder/reg_dep_map.cc    Sun Jun 19 21:43:33 2011 -0400
@@ -64,6 +64,7 @@
 RegDepMap::setCPU(InOrderCPU *_cpu)
 {
     cpu = _cpu;
+
 }
 
 void
@@ -97,10 +98,12 @@
 void
 RegDepMap::insert(unsigned idx, DynInstPtr inst)
 {
-    DPRINTF(RegDepMap, "Inserting [sn:%i] onto dep. list for reg. idx %i.\n",
-            inst->seqNum, idx);
+    TheISA::RegIndex flat_idx = cpu->flattenRegIdx(idx, inst->threadNumber);
 
-    regMap[idx].push_back(inst);
+    DPRINTF(RegDepMap, "Inserting [sn:%i] onto dep. list for reg. idx %i 
(%i).\n",
+            inst->seqNum, idx, flat_idx);
+
+    regMap[flat_idx].push_back(inst);
 
     inst->setRegDepEntry();
 }
@@ -171,7 +174,7 @@
 }
 
 ThePipeline::DynInstPtr
-RegDepMap::canForward(unsigned reg_idx, DynInstPtr inst)
+RegDepMap::canForward(unsigned reg_idx, DynInstPtr inst, unsigned clean_idx)
 {
     std::list<DynInstPtr>::iterator list_it = regMap[reg_idx].begin();
     std::list<DynInstPtr>::iterator list_end = regMap[reg_idx].end();
@@ -184,9 +187,12 @@
         forward_inst = (*list_it);
         list_it++;
     }
+    DPRINTF(RegDepMap, "[sn:%i] Found potential forwarding value for reg %i 
(%i)"
+            " w/ [sn:%i]\n",
+            inst->seqNum, reg_idx, clean_idx, inst->seqNum);
 
     if (forward_inst) {
-        int dest_reg_idx = forward_inst->getDestIdxNum(reg_idx);
+        int dest_reg_idx = forward_inst->getDestIdxNum(clean_idx);
         assert(dest_reg_idx != -1);
 
         if (forward_inst->isExecuted() &&
diff -r 2fcd223a253b -r 636adb85b6bd src/cpu/inorder/reg_dep_map.hh
--- a/src/cpu/inorder/reg_dep_map.hh    Sun Jun 19 21:43:33 2011 -0400
+++ b/src/cpu/inorder/reg_dep_map.hh    Sun Jun 19 21:43:33 2011 -0400
@@ -82,7 +82,7 @@
     /** Is the current instruction able to get a forwarded value from
      *  another instruction for this destination register?
      */
-    DynInstPtr canForward(unsigned reg_idx, DynInstPtr inst);
+    DynInstPtr canForward(unsigned reg_idx, DynInstPtr inst, unsigned 
clean_idx);
 
     /** find an instruction to forward/bypass a value from */
     DynInstPtr findBypassInst(unsigned idx);
diff -r 2fcd223a253b -r 636adb85b6bd src/cpu/inorder/resources/use_def.cc
--- a/src/cpu/inorder/resources/use_def.cc      Sun Jun 19 21:43:33 2011 -0400
+++ b/src/cpu/inorder/resources/use_def.cc      Sun Jun 19 21:43:33 2011 -0400
@@ -167,48 +167,49 @@
     {
       case ReadSrcReg:
         {
-            int reg_idx = inst->_srcRegIdx[ud_idx];
+            RegIndex reg_idx = inst->_srcRegIdx[ud_idx];
+            RegIndex flat_idx = cpu->flattenRegIdx(reg_idx, tid);
             
-            DPRINTF(InOrderUseDef, "[tid:%i]: Attempting to read source "
-                    "register idx %i (reg #%i).\n",
-                    tid, ud_idx, reg_idx);
+            DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Attempting to read 
source "
+                    "register idx %i (reg #%i, flat#%i).\n",
+                    tid, seq_num, ud_idx, reg_idx, flat_idx);
 
             // Ask register dependency map if it is OK to read from Arch. 
             // Reg. File
-            if (regDepMap[tid]->canRead(reg_idx, inst)) {
+            if (regDepMap[tid]->canRead(flat_idx, inst)) {
                 
                 uniqueRegMap[reg_idx] = true;
 
                 if (inst->seqNum <= outReadSeqNum[tid]) {
                     if (reg_idx < FP_Base_DepTag) {
-                        DPRINTF(InOrderUseDef, "[tid:%i]: Reading Int Reg %i"
-                                "from Register File:%i.\n",
-                                tid, 
-                                reg_idx, 
-                                cpu->readIntReg(reg_idx,inst->readTid()));
+                        DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Reading Int 
Reg %i"
+                                " (%i) from Register File:%i.\n",
+                                tid, seq_num,
+                                reg_idx, flat_idx,
+                                cpu->readIntReg(flat_idx,inst->readTid()));
                         inst->setIntSrc(ud_idx,
-                                        cpu->readIntReg(reg_idx,
+                                        cpu->readIntReg(flat_idx,
                                                         inst->readTid()));
                     } else if (reg_idx < Ctrl_Base_DepTag) {
                         reg_idx -= FP_Base_DepTag;
-                        DPRINTF(InOrderUseDef, "[tid:%i]: Reading Float Reg %i"
-                                "from Register File:%x (%08f).\n",
-                                tid,
-                                reg_idx,
-                                cpu->readFloatRegBits(reg_idx, 
+                        DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Reading 
Float Reg %i"
+                                " (%i) from Register File:%x (%08f).\n",
+                                tid, seq_num,
+                                reg_idx, flat_idx,
+                                cpu->readFloatRegBits(flat_idx,
                                                       inst->readTid()),
-                                cpu->readFloatReg(reg_idx, 
+                                cpu->readFloatReg(flat_idx,
                                                   inst->readTid()));
 
                         inst->setFloatSrc(ud_idx,
-                                          cpu->readFloatReg(reg_idx, 
+                                          cpu->readFloatReg(flat_idx,
                                                             inst->readTid()));
                     } else {
                         reg_idx -= Ctrl_Base_DepTag;
-                        DPRINTF(InOrderUseDef, "[tid:%i]: Reading Misc Reg %i "
-                                "from Register File:%i.\n",
-                                tid, 
-                                reg_idx, 
+                        DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Reading 
Misc Reg %i "
+                                " (%i) from Register File:%i.\n",
+                                tid, seq_num,
+                                reg_idx, flat_idx,
                                 cpu->readMiscReg(reg_idx, 
                                                  inst->readTid()));
                         inst->setIntSrc(ud_idx,
@@ -220,9 +221,9 @@
                     regFileReads++;
                     ud_req->done();
                 } else {
-                    DPRINTF(InOrderUseDef, "[tid:%i]: Unable to read because "
+                    DPRINTF(InOrderUseDef, "[tid:%i]: [sn:%i]: Unable to read 
because "
                             "of [sn:%i] hasnt read it's registers yet.\n", 
-                            tid, outReadSeqNum[tid]);
+                            tid, seq_num, outReadSeqNum[tid]);
                     DPRINTF(InOrderStall, "STALL: [tid:%i]: waiting for "
                             "[sn:%i] to write\n",
                             tid, outReadSeqNum[tid]);
@@ -231,8 +232,9 @@
 
             } else {
                 // Look for forwarding opportunities
-                DynInstPtr forward_inst = regDepMap[tid]->canForward(reg_idx,
-                                                                     inst);
+                DynInstPtr forward_inst = regDepMap[tid]->canForward(flat_idx,
+                                                                     inst,
+                                                                     reg_idx);
 
                 if (forward_inst) {
 
@@ -242,9 +244,9 @@
 
                         if (reg_idx < FP_Base_DepTag) {
                             DPRINTF(InOrderUseDef, "[tid:%i]: Forwarding dest."
-                                    " reg value 0x%x from "
+                                    " reg %i (%i), value 0x%x from "
                                     "[sn:%i] to [sn:%i] source #%i.\n",
-                                    tid, 
+                                    tid, reg_idx, flat_idx,
                                     forward_inst->readIntResult(dest_reg_idx),
                                     forward_inst->seqNum, 
                                     inst->seqNum, ud_idx);
@@ -253,9 +255,9 @@
                                             readIntResult(dest_reg_idx));
                         } else if (reg_idx < Ctrl_Base_DepTag) {
                             DPRINTF(InOrderUseDef, "[tid:%i]: Forwarding dest."
-                                    " reg value 0x%x from "
+                                    " reg %i (%i) value 0x%x from "
                                     "[sn:%i] to [sn:%i] source #%i.\n",
-                                    tid, 
+                                    tid, reg_idx, flat_idx,
                                     
forward_inst->readFloatResult(dest_reg_idx),
                                     forward_inst->seqNum, inst->seqNum, 
ud_idx);
                             inst->setFloatSrc(ud_idx,
@@ -263,9 +265,9 @@
                                               readFloatResult(dest_reg_idx));
                         } else {
                             DPRINTF(InOrderUseDef, "[tid:%i]: Forwarding dest."
-                                    " reg value 0x%x from "
+                                    " reg %i (%i) value 0x%x from "
                                     "[sn:%i] to [sn:%i] source #%i.\n",
-                                    tid, 
+                                    tid, reg_idx, flat_idx,
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to