summaryrefslogtreecommitdiff
path: root/src/cpu/o3/regfile.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/o3/regfile.cc')
-rw-r--r--src/cpu/o3/regfile.cc21
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: