changeset dd3e52966c26 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=dd3e52966c26
description:
        inorder: redefine DynInst FP result type
        Sharing the FP value w/the integer values was giving inconsistent 
results esp. when
        their is a 32-bit integer register matched w/a 64-bit float value

diffstat:

 src/cpu/inorder/cpu.cc                      |  28 +++++++++++++-
 src/cpu/inorder/cpu.hh                      |   6 ---
 src/cpu/inorder/inorder_dyn_inst.cc         |  57 ++++++++++++++++------------
 src/cpu/inorder/inorder_dyn_inst.hh         |  45 ++++++++++++----------
 src/cpu/inorder/reg_dep_map.cc              |  11 +++--
 src/cpu/inorder/resources/execution_unit.cc |  21 ++++++++--
 src/cpu/inorder/resources/use_def.cc        |  15 ++++---
 7 files changed, 116 insertions(+), 67 deletions(-)

diffs (truncated from 504 to 300 lines):

diff -r 76dd3a85e4ae -r dd3e52966c26 src/cpu/inorder/cpu.cc
--- a/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:38 2011 -0400
+++ b/src/cpu/inorder/cpu.cc    Sun Jun 19 21:43:38 2011 -0400
@@ -195,6 +195,7 @@
       timeBuffer(2 , 2),
       removeInstsThisCycle(false),
       activityRec(params->name, NumStages, 10, params->activity),
+      stCondFails(0),
 #if FULL_SYSTEM
       system(params->system),
       physmem(system->physmem),
@@ -206,6 +207,7 @@
       switchCount(0),
       deferRegistration(false/*params->deferRegistration*/),
       stageTracing(params->stageTracing),
+      lastRunningCycle(0),
       instsPerSwitch(0)
 {    
     ThreadID active_threads;
@@ -258,6 +260,9 @@
     }
 
     for (ThreadID tid = 0; tid < numThreads; ++tid) {
+        pc[tid].set(0);
+        lastCommittedPC[tid].set(0);
+
 #if FULL_SYSTEM
         // SMT is not supported in FS mode yet.
         assert(numThreads == 1);
@@ -1170,12 +1175,18 @@
 FloatReg
 InOrderCPU::readFloatReg(RegIndex reg_idx, ThreadID tid)
 {
+    DPRINTF(FloatRegs, "[tid:%i]: Reading Float Reg %i as %x, %08f\n",
+            tid, reg_idx, floatRegs.i[tid][reg_idx], 
floatRegs.f[tid][reg_idx]);
+
     return floatRegs.f[tid][reg_idx];
 }
 
 FloatRegBits
 InOrderCPU::readFloatRegBits(RegIndex reg_idx, ThreadID tid)
-{;
+{
+    DPRINTF(FloatRegs, "[tid:%i]: Reading Float Reg %i as %x, %08f\n",
+            tid, reg_idx, floatRegs.i[tid][reg_idx], 
floatRegs.f[tid][reg_idx]);
+
     return floatRegs.i[tid][reg_idx];
 }
 
@@ -1199,6 +1210,11 @@
 InOrderCPU::setFloatReg(RegIndex reg_idx, FloatReg val, ThreadID tid)
 {
     floatRegs.f[tid][reg_idx] = val;
+    DPRINTF(FloatRegs, "[tid:%i]: Setting Float. Reg %i bits to "
+            "%x, %08f\n",
+            tid, reg_idx,
+            floatRegs.i[tid][reg_idx],
+            floatRegs.f[tid][reg_idx]);
 }
 
 
@@ -1206,6 +1222,11 @@
 InOrderCPU::setFloatRegBits(RegIndex reg_idx, FloatRegBits val, ThreadID tid)
 {
     floatRegs.i[tid][reg_idx] = val;
+    DPRINTF(FloatRegs, "[tid:%i]: Setting Float. Reg %i bits to "
+            "%x, %08f\n",
+            tid, reg_idx,
+            floatRegs.i[tid][reg_idx],
+            floatRegs.f[tid][reg_idx]);
 }
 
 uint64_t
@@ -1257,6 +1278,11 @@
 MiscReg
 InOrderCPU::readMiscReg(int misc_reg, ThreadID tid)
 {
+    DPRINTF(InOrderCPU, "MiscReg: %i\n", misc_reg);
+    DPRINTF(InOrderCPU, "tid: %i\n", tid);
+    DPRINTF(InOrderCPU, "tcBase: %x\n", tcBase(tid));
+    DPRINTF(InOrderCPU, "isa-tid: %x\n", &isa[tid]);
+
     return isa[tid].readMiscReg(misc_reg, tcBase(tid));
 }
 
diff -r 76dd3a85e4ae -r dd3e52966c26 src/cpu/inorder/cpu.hh
--- a/src/cpu/inorder/cpu.hh    Sun Jun 19 21:43:38 2011 -0400
+++ b/src/cpu/inorder/cpu.hh    Sun Jun 19 21:43:38 2011 -0400
@@ -262,17 +262,11 @@
      */
     unsigned fetchPortIdx;
 
-    /** Identifies the resource id that identifies a ITB       */
-    unsigned itbIdx;
-
     /** Identifies the resource id that identifies a data
      * access unit.
      */
     unsigned dataPortIdx;
 
-    /** Identifies the resource id that identifies a DTB       */
-    unsigned dtbIdx;
-
     /** The Pipeline Stages for the CPU */
     PipelineStage *pipelineStage[ThePipeline::NumStages];
 
diff -r 76dd3a85e4ae -r dd3e52966c26 src/cpu/inorder/inorder_dyn_inst.cc
--- a/src/cpu/inorder/inorder_dyn_inst.cc       Sun Jun 19 21:43:38 2011 -0400
+++ b/src/cpu/inorder/inorder_dyn_inst.cc       Sun Jun 19 21:43:38 2011 -0400
@@ -69,8 +69,6 @@
     lqIdx(0), sqIdx(0), instListIt(NULL), onInstList(false)
 {
     for(int i = 0; i < MaxInstSrcRegs; i++) {
-        instSrc[i].integer = 0;
-        instSrc[i].dbl = 0;
         _readySrcRegIdx[i] = false;
         _srcRegIdx[i] = 0;
     }
@@ -124,9 +122,6 @@
 
     nextStage = 0;
 
-    for(int i = 0; i < MaxInstDestRegs; i++)
-        instResult[i].val.integer = 0;
-
     status.reset();
 
     memAddrReady = false;
@@ -355,39 +350,48 @@
 void
 InOrderDynInst::setIntSrc(int idx, uint64_t val)
 {
-    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Source Value %i being set "
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] [src:%i] Int being set "
             "to %#x.\n", threadNumber, seqNum, idx, val);
-    instSrc[idx].integer = val;
+    instSrc[idx].intVal = val;
 }
 
 /** Records an fp register being set to a value. */
 void
 InOrderDynInst::setFloatSrc(int idx, FloatReg val)
 {
-    instSrc[idx].dbl = val;
+    instSrc[idx].fpVal.f = val;
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] [src:%i] FP being set "
+            "to %x, %08f...%08f\n", threadNumber, seqNum, idx,
+            instSrc[idx].fpVal.i, instSrc[idx].fpVal.f, val);
 }
 
 /** Records an fp register being set to an integer value. */
 void
-InOrderDynInst::setFloatRegBitsSrc(int idx, uint64_t val)
+InOrderDynInst::setFloatRegBitsSrc(int idx, FloatRegBits val)
 {
-    instSrc[idx].integer = val;
+    instSrc[idx].fpVal.i = val;
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] [src:%i] FPBits being set "
+            "to %x, %08f...%x\n", threadNumber, seqNum, idx,
+            instSrc[idx].fpVal.i, instSrc[idx].fpVal.f, val);
 }
 
 /** Reads a integer register. */
 IntReg
 InOrderDynInst::readIntRegOperand(const StaticInst *si, int idx, ThreadID tid)
 {
-    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Source Value %i read as %#x.\n",
-            threadNumber, seqNum, idx, instSrc[idx].integer);
-    return instSrc[idx].integer;
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] [src:%i] IntVal read as %#x.\n",
+            threadNumber, seqNum, idx, instSrc[idx].intVal);
+    return instSrc[idx].intVal;
 }
 
 /** Reads a FP register. */
 FloatReg
 InOrderDynInst::readFloatRegOperand(const StaticInst *si, int idx)
 {
-    return instSrc[idx].dbl;
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] [src:%i] FPVal being read "
+            "as %x, %08f.\n", threadNumber, seqNum, idx,
+            instSrc[idx].fpVal.i, instSrc[idx].fpVal.f);
+    return instSrc[idx].fpVal.f;
 }
 
 
@@ -395,7 +399,10 @@
 FloatRegBits
 InOrderDynInst::readFloatRegOperandBits(const StaticInst *si, int idx)
 {
-    return instSrc[idx].integer;
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] [src:%i] FPBits being read "
+            "as %x, %08f.\n", threadNumber, seqNum, idx,
+            instSrc[idx].fpVal.i, instSrc[idx].fpVal.f);
+    return instSrc[idx].fpVal.i;
 }
 
 /** Reads a miscellaneous register. */
@@ -414,8 +421,8 @@
 {
     DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Misc. Reg Source Value %i"
             " read as %#x.\n", threadNumber, seqNum, idx,
-            instSrc[idx].integer);
-    return instSrc[idx].integer;
+            instSrc[idx].intVal);
+    return instSrc[idx].intVal;
 }
 
 
@@ -427,7 +434,7 @@
                        const MiscReg &val)
 {
     instResult[idx].type = Integer;
-    instResult[idx].val.integer = val;
+    instResult[idx].res.intVal = val;
     instResult[idx].tick = curTick();
 
     DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Setting Misc Reg. Operand %i "
@@ -457,7 +464,7 @@
 InOrderDynInst::setIntRegOperand(const StaticInst *si, int idx, IntReg val)
 {
     instResult[idx].type = Integer;
-    instResult[idx].val.integer = val;
+    instResult[idx].res.intVal = val;
     instResult[idx].tick = curTick();
 
     DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Setting Result Int Reg. %i "
@@ -469,13 +476,13 @@
 void
 InOrderDynInst::setFloatRegOperand(const StaticInst *si, int idx, FloatReg val)
 {
-    instResult[idx].val.dbl = val;
+    instResult[idx].res.fpVal.f = val;
     instResult[idx].type = Float;
     instResult[idx].tick = curTick();
 
-    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Setting Result Float Reg. %i "
-            "being set to %#x (result-tick:%i).\n",
-            threadNumber, seqNum, idx, val, instResult[idx].tick);
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Result Float Reg. %i "
+            "being set to %#x, %08f (result-tick:%i).\n",
+            threadNumber, seqNum, idx, val, val, instResult[idx].tick);
 }
 
 /** Sets a FP register as a integer. */
@@ -484,10 +491,10 @@
                               FloatRegBits val)
 {
     instResult[idx].type = Integer;
-    instResult[idx].val.integer = val;
+    instResult[idx].res.fpVal.i = val;
     instResult[idx].tick = curTick();
 
-    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Setting Result Float Reg. %i "
+    DPRINTF(InOrderDynInst, "[tid:%i]: [sn:%i] Result Float Reg. Bits %i "
             "being set to %#x (result-tick:%i).\n",
             threadNumber, seqNum, idx, val, instResult[idx].tick);
 }
diff -r 76dd3a85e4ae -r dd3e52966c26 src/cpu/inorder/inorder_dyn_inst.hh
--- a/src/cpu/inorder/inorder_dyn_inst.hh       Sun Jun 19 21:43:38 2011 -0400
+++ b/src/cpu/inorder/inorder_dyn_inst.hh       Sun Jun 19 21:43:38 2011 -0400
@@ -89,6 +89,8 @@
     // Floating point register type.
     typedef TheISA::FloatReg FloatReg;
     // Floating point register type.
+    typedef TheISA::FloatRegBits FloatRegBits;
+    // Floating point register type.
     typedef TheISA::MiscReg MiscReg;
 
     typedef short int PhysRegIndex;
@@ -207,13 +209,6 @@
     /** How many source registers are ready. */
     unsigned readyRegs;
 
-    /** An instruction src/dest has to be one of these types */
-    union InstValue {
-        uint64_t integer;
-        double dbl;
-    };
-
-    //@TODO: Naming Convention for Enums?
     enum ResultType {
         None,
         Integer,
@@ -221,19 +216,30 @@
         Double
     };
 
+    /** An instruction src/dest has to be one of these types */
+    struct InstValue {
+        IntReg intVal;
+        union {
+            FloatReg f;
+            FloatRegBits i;
+        } fpVal;
+
+        InstValue()
+        {
+            intVal = 0;
+            fpVal.i = 0;
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to