diff options
Diffstat (limited to 'src/cpu/o3/cpu.cc')
-rw-r--r-- | src/cpu/o3/cpu.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc index 5d92d92dc..ef3b17202 100644 --- a/src/cpu/o3/cpu.cc +++ b/src/cpu/o3/cpu.cc @@ -159,6 +159,7 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params) regFile(params->numPhysIntRegs, params->numPhysFloatRegs, params->numPhysVecRegs, + params->numPhysVecPredRegs, params->numPhysCCRegs, vecMode), @@ -258,6 +259,7 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params) assert(params->numPhysIntRegs >= numThreads * TheISA::NumIntRegs); assert(params->numPhysFloatRegs >= numThreads * TheISA::NumFloatRegs); assert(params->numPhysVecRegs >= numThreads * TheISA::NumVecRegs); + assert(params->numPhysVecPredRegs >= numThreads * TheISA::NumVecPredRegs); assert(params->numPhysCCRegs >= numThreads * TheISA::NumCCRegs); rename.setScoreboard(&scoreboard); @@ -325,6 +327,13 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params) } } + for (RegIndex ridx = 0; ridx < TheISA::NumVecPredRegs; ++ridx) { + PhysRegIdPtr phys_reg = freeList.getVecPredReg(); + renameMap[tid].setEntry(RegId(VecPredRegClass, ridx), phys_reg); + commitRenameMap[tid].setEntry( + RegId(VecPredRegClass, ridx), phys_reg); + } + for (RegIndex ridx = 0; ridx < TheISA::NumCCRegs; ++ridx) { PhysRegIdPtr phys_reg = freeList.getCCReg(); renameMap[tid].setEntry(RegId(CCRegClass, ridx), phys_reg); @@ -538,6 +547,16 @@ FullO3CPU<Impl>::regStats() .desc("number of vector regfile writes") .prereq(vecRegfileWrites); + vecPredRegfileReads + .name(name() + ".pred_regfile_reads") + .desc("number of predicate regfile reads") + .prereq(vecPredRegfileReads); + + vecPredRegfileWrites + .name(name() + ".pred_regfile_writes") + .desc("number of predicate regfile writes") + .prereq(vecPredRegfileWrites); + ccRegfileReads .name(name() + ".cc_regfile_reads") .desc("number of cc regfile reads") @@ -883,6 +902,14 @@ FullO3CPU<Impl>::removeThread(ThreadID tid) freeList.addReg(phys_reg); } + // Unbind Float Regs from Rename Map + for (unsigned preg = 0; preg < TheISA::NumVecPredRegs; preg++) { + PhysRegIdPtr phys_reg = renameMap[tid].lookup( + RegId(VecPredRegClass, preg)); + scoreboard.unsetReg(phys_reg); + freeList.addReg(phys_reg); + } + // Unbind condition-code Regs from Rename Map for (RegId reg_id(CCRegClass, 0); reg_id.index() < TheISA::NumCCRegs; reg_id.index()++) { @@ -1334,6 +1361,24 @@ FullO3CPU<Impl>::readVecElem(PhysRegIdPtr phys_reg) const -> const VecElem& } template <class Impl> +auto +FullO3CPU<Impl>::readVecPredReg(PhysRegIdPtr phys_reg) const + -> const VecPredRegContainer& +{ + vecPredRegfileReads++; + return regFile.readVecPredReg(phys_reg); +} + +template <class Impl> +auto +FullO3CPU<Impl>::getWritableVecPredReg(PhysRegIdPtr phys_reg) + -> VecPredRegContainer& +{ + vecPredRegfileWrites++; + return regFile.getWritableVecPredReg(phys_reg); +} + +template <class Impl> CCReg FullO3CPU<Impl>::readCCReg(PhysRegIdPtr phys_reg) { @@ -1375,6 +1420,15 @@ FullO3CPU<Impl>::setVecElem(PhysRegIdPtr phys_reg, const VecElem& val) template <class Impl> void +FullO3CPU<Impl>::setVecPredReg(PhysRegIdPtr phys_reg, + const VecPredRegContainer& val) +{ + vecPredRegfileWrites++; + regFile.setVecPredReg(phys_reg, val); +} + +template <class Impl> +void FullO3CPU<Impl>::setCCReg(PhysRegIdPtr phys_reg, CCReg val) { ccRegfileWrites++; @@ -1434,6 +1488,26 @@ FullO3CPU<Impl>::readArchVecElem(const RegIndex& reg_idx, const ElemIndex& ldx, } template <class Impl> +auto +FullO3CPU<Impl>::readArchVecPredReg(int reg_idx, ThreadID tid) const + -> const VecPredRegContainer& +{ + PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( + RegId(VecPredRegClass, reg_idx)); + return readVecPredReg(phys_reg); +} + +template <class Impl> +auto +FullO3CPU<Impl>::getWritableArchVecPredReg(int reg_idx, ThreadID tid) + -> VecPredRegContainer& +{ + PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( + RegId(VecPredRegClass, reg_idx)); + return getWritableVecPredReg(phys_reg); +} + +template <class Impl> CCReg FullO3CPU<Impl>::readArchCCReg(int reg_idx, ThreadID tid) { @@ -1488,6 +1562,16 @@ FullO3CPU<Impl>::setArchVecElem(const RegIndex& reg_idx, const ElemIndex& ldx, template <class Impl> void +FullO3CPU<Impl>::setArchVecPredReg(int reg_idx, const VecPredRegContainer& val, + ThreadID tid) +{ + PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( + RegId(VecPredRegClass, reg_idx)); + setVecPredReg(phys_reg, val); +} + +template <class Impl> +void FullO3CPU<Impl>::setArchCCReg(int reg_idx, CCReg val, ThreadID tid) { ccRegfileWrites++; |