diff options
Diffstat (limited to 'src/cpu/o3/regfile.cc')
-rw-r--r-- | src/cpu/o3/regfile.cc | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/cpu/o3/regfile.cc b/src/cpu/o3/regfile.cc index 2f41e2ac2..cc4bba6b0 100644 --- a/src/cpu/o3/regfile.cc +++ b/src/cpu/o3/regfile.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 ARM Limited + * Copyright (c) 2016-2017 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -52,22 +52,26 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs, unsigned _numPhysicalFloatRegs, unsigned _numPhysicalVecRegs, + unsigned _numPhysicalVecPredRegs, unsigned _numPhysicalCCRegs, VecMode vmode) : intRegFile(_numPhysicalIntRegs), floatRegFile(_numPhysicalFloatRegs), vectorRegFile(_numPhysicalVecRegs), + vecPredRegFile(_numPhysicalVecPredRegs), ccRegFile(_numPhysicalCCRegs), numPhysicalIntRegs(_numPhysicalIntRegs), numPhysicalFloatRegs(_numPhysicalFloatRegs), numPhysicalVecRegs(_numPhysicalVecRegs), numPhysicalVecElemRegs(_numPhysicalVecRegs * NumVecElemPerVecReg), + numPhysicalVecPredRegs(_numPhysicalVecPredRegs), numPhysicalCCRegs(_numPhysicalCCRegs), totalNumRegs(_numPhysicalIntRegs + _numPhysicalFloatRegs + _numPhysicalVecRegs + _numPhysicalVecRegs * NumVecElemPerVecReg + + _numPhysicalVecPredRegs + _numPhysicalCCRegs), vecMode(vmode) { @@ -108,6 +112,12 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs, } } + // The next batch of the registers are the predicate physical + // registers; put them onto the predicate free list. + for (phys_reg = 0; phys_reg < numPhysicalVecPredRegs; phys_reg++) { + vecPredRegIds.emplace_back(VecPredRegClass, phys_reg, flat_reg_idx++); + } + // The rest of the registers are the condition-code physical // registers; put them onto the condition-code free list. for (phys_reg = 0; phys_reg < numPhysicalCCRegs; phys_reg++) { @@ -159,6 +169,13 @@ PhysRegFile::initFreeList(UnifiedFreeList *freeList) else freeList->addRegs(vecElemIds.begin(), vecElemIds.end()); + // The next batch of the registers are the predicate physical + // registers; put them onto the predicate free list. + for (reg_idx = 0; reg_idx < numPhysicalVecPredRegs; reg_idx++) { + assert(vecPredRegIds[reg_idx].index() == reg_idx); + } + freeList->addRegs(vecPredRegIds.begin(), vecPredRegIds.end()); + // The rest of the registers are the condition-code physical // registers; put them onto the condition-code free list. for (reg_idx = 0; reg_idx < numPhysicalCCRegs; reg_idx++) { @@ -191,6 +208,8 @@ PhysRegFile::getRegIds(RegClass cls) -> IdRange return std::make_pair(vecRegIds.begin(), vecRegIds.end()); case VecElemClass: return std::make_pair(vecElemIds.begin(), vecElemIds.end()); + case VecPredRegClass: + return std::make_pair(vecPredRegIds.begin(), vecPredRegIds.end()); case CCRegClass: return std::make_pair(ccRegIds.begin(), ccRegIds.end()); case MiscRegClass: |