cpu: Fix VecElemClass bugs in cpu models
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>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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(); }
|
||||
};
|
||||
|
||||
@@ -1039,6 +1039,7 @@ DefaultRename<Impl>::renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
|
||||
fpRenameLookups++;
|
||||
break;
|
||||
case VecRegClass:
|
||||
case VecElemClass:
|
||||
vecRenameLookups++;
|
||||
break;
|
||||
case CCRegClass:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user