cpu: Fix VecElemClass bugs in cpu models
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 4 Jan 2019 16:20:49 +0000 (16:20 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 25 Jan 2019 12:51:29 +0000 (12:51 +0000)
This patch is:

* Adding a missing VecElemClass entry
* Fixing assertion in rename map which was checking the number of free
  vector registers rather than free vector element registers
* Fixing assertion in read/setVecElemOperand APIs.
* Using the right register index in SimpleThread
* Using VecElem instead of VecReg on O3 readArchVecElem

Change-Id: I265320dcbe35eb47075991301dfc99333c5190c4
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/15598
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/cpu/minor/exec_context.hh
src/cpu/o3/cpu.cc
src/cpu/o3/free_list.hh
src/cpu/o3/rename_impl.hh
src/cpu/o3/rename_map.cc
src/cpu/simple/exec_context.hh

index 76d46e905416a8af56fd40bc5200a417b1f6a22b..b9ed3971f6ea0e4b6444a8372878fb980f252132 100644 (file)
@@ -157,7 +157,7 @@ class ExecContext : public ::ExecContext
     readVecElemOperand(const StaticInst *si, int idx) const override
     {
         const RegId& reg = si->srcRegIdx(idx);
-        assert(reg.isVecReg());
+        assert(reg.isVecElem());
         return thread.readVecElem(reg);
     }
 
@@ -268,7 +268,7 @@ class ExecContext : public ::ExecContext
                       const TheISA::VecElem val) override
     {
         const RegId& reg = si->destRegIdx(idx);
-        assert(reg.isVecReg());
+        assert(reg.isVecElem());
         thread.setVecElem(reg, val);
     }
 
index 7261f0c9eb2309517af0dd72dfcafebfd8698faa..9e1efa179f439417c66ad870fcb1395b50d19577 100644 (file)
@@ -1410,7 +1410,7 @@ FullO3CPU<Impl>::readArchVecElem(const RegIndex& reg_idx, const ElemIndex& ldx,
                                  ThreadID tid) const -> const VecElem&
 {
     PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup(
-                                RegId(VecRegClass, reg_idx, ldx));
+                                RegId(VecElemClass, reg_idx, ldx));
     return readVecElem(phys_reg);
 }
 
index 3ad08ee98846713b4817f85243a16592e5a17768..e7a899cdf7a2f769f6c6ceeb7748749616b50c45 100644 (file)
@@ -234,6 +234,9 @@ class UnifiedFreeList
     /** Returns the number of free vector registers. */
     unsigned numFreeVecRegs() const { return vecList.numFreeRegs(); }
 
+    /** Returns the number of free vector registers. */
+    unsigned numFreeVecElems() const { return vecElemList.numFreeRegs(); }
+
     /** Returns the number of free cc registers. */
     unsigned numFreeCCRegs() const { return ccList.numFreeRegs(); }
 };
index 4331b6d0803362980d99eeb0d45a2d384eba311f..c5be4046492e565bab832582359d742c64f48ce2 100644 (file)
@@ -1039,6 +1039,7 @@ DefaultRename<Impl>::renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
             fpRenameLookups++;
             break;
           case VecRegClass:
+          case VecElemClass:
             vecRenameLookups++;
             break;
           case CCRegClass:
index 1194b550ba262089179dde47a7bdba656ed5673f..d1876a9650f4b41b8af953931771e366fedf8cc1 100644 (file)
@@ -161,7 +161,7 @@ UnifiedRenameMap::switchMode(VecMode newVecMode, UnifiedFreeList* freeList)
         /* The free list should currently be tracking register elems. */
         panic_if(freeList->hasFreeVecRegs(),
                 "The free list is already tracking full Vec");
-        panic_if(freeList->numFreeVecRegs() !=
+        panic_if(freeList->numFreeVecElems() !=
                 regFile->numVecElemPhysRegs() - TheISA::NumFloatRegs,
                 "The free list has lost vector register elements");
         /* To rebuild the arch regs we take the easy road:
index 7db7d20d98dd484837800b58951503905a463c61..cbca341232ce72bd024dc274dcaf0aad8f937b2a 100644 (file)
@@ -317,7 +317,7 @@ class SimpleExecContext : public ExecContext {
     readVecElemOperand(const StaticInst *si, int idx) const override
     {
         numVecRegReads++;
-        const RegId& reg = si->destRegIdx(idx);
+        const RegId& reg = si->srcRegIdx(idx);
         assert(reg.isVecElem());
         return thread->readVecElem(reg);
     }