arch,cpu: Keep a RegClass pointer in RegId instead of a RegClassType.
This makes it easy to get access to the RegClass that goes with a register without having to look it up in a separate structure. Change-Id: I4cfff2069d63f3c1c3fb0fea5dee3baf357bd478 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49786 Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -64,6 +64,7 @@ DebugFlag('ExecAsid', 'Format: Include ASID in trace')
|
||||
DebugFlag('ExecFlags', 'Format: Include instruction flags in trace')
|
||||
DebugFlag('Fetch')
|
||||
DebugFlag('HtmCpu', 'Hardware Transactional Memory (CPU side)')
|
||||
DebugFlag('InvalidReg')
|
||||
DebugFlag('O3PipeView')
|
||||
DebugFlag('PCEvent')
|
||||
DebugFlag('Quiesce')
|
||||
|
||||
@@ -84,42 +84,48 @@ PhysRegFile::PhysRegFile(unsigned _numPhysicalIntRegs,
|
||||
|
||||
// The initial batch of registers are the integer ones
|
||||
for (phys_reg = 0; phys_reg < numPhysicalIntRegs; phys_reg++) {
|
||||
intRegIds.emplace_back(IntRegClass, phys_reg, flat_reg_idx++);
|
||||
intRegIds.emplace_back(*reg_classes.at(IntRegClass),
|
||||
phys_reg, flat_reg_idx++);
|
||||
}
|
||||
|
||||
// The next batch of the registers are the floating-point physical
|
||||
// registers; put them onto the floating-point free list.
|
||||
for (phys_reg = 0; phys_reg < numPhysicalFloatRegs; phys_reg++) {
|
||||
floatRegIds.emplace_back(FloatRegClass, phys_reg, flat_reg_idx++);
|
||||
floatRegIds.emplace_back(*reg_classes.at(FloatRegClass),
|
||||
phys_reg, flat_reg_idx++);
|
||||
}
|
||||
|
||||
// The next batch of the registers are the vector physical
|
||||
// registers; put them onto the vector free list.
|
||||
for (phys_reg = 0; phys_reg < numPhysicalVecRegs; phys_reg++) {
|
||||
vecRegIds.emplace_back(VecRegClass, phys_reg, flat_reg_idx++);
|
||||
vecRegIds.emplace_back(*reg_classes.at(VecRegClass), phys_reg,
|
||||
flat_reg_idx++);
|
||||
}
|
||||
// The next batch of the registers are the vector element physical
|
||||
// registers; put them onto the vector free list.
|
||||
for (phys_reg = 0; phys_reg < numPhysicalVecElemRegs; phys_reg++) {
|
||||
vecElemIds.emplace_back(VecElemClass, phys_reg, flat_reg_idx++);
|
||||
vecElemIds.emplace_back(*reg_classes.at(VecElemClass), phys_reg,
|
||||
flat_reg_idx++);
|
||||
}
|
||||
|
||||
// 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++);
|
||||
vecPredRegIds.emplace_back(*reg_classes.at(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++) {
|
||||
ccRegIds.emplace_back(CCRegClass, phys_reg, flat_reg_idx++);
|
||||
ccRegIds.emplace_back(*reg_classes.at(CCRegClass), phys_reg,
|
||||
flat_reg_idx++);
|
||||
}
|
||||
|
||||
// Misc regs have a fixed mapping but still need PhysRegIds.
|
||||
for (phys_reg = 0; phys_reg < reg_classes.at(MiscRegClass)->numRegs();
|
||||
phys_reg++) {
|
||||
miscRegIds.emplace_back(MiscRegClass, phys_reg, 0);
|
||||
miscRegIds.emplace_back(*reg_classes.at(MiscRegClass), phys_reg, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#include "base/debug.hh"
|
||||
#include "base/intmath.hh"
|
||||
#include "base/types.hh"
|
||||
#include "debug/InvalidReg.hh"
|
||||
|
||||
namespace gem5
|
||||
{
|
||||
@@ -132,6 +133,9 @@ class RegClass
|
||||
inline constexpr RegId operator[](RegIndex idx) const;
|
||||
};
|
||||
|
||||
inline constexpr RegClass
|
||||
invalidRegClass(InvalidRegClass, 0, debug::InvalidReg);
|
||||
|
||||
/** Register ID: describe an architectural register with its class and index.
|
||||
* This structure is used instead of just the register index to disambiguate
|
||||
* between different classes of registers. For example, a integer register with
|
||||
@@ -141,7 +145,7 @@ class RegId
|
||||
{
|
||||
protected:
|
||||
static const char* regClassStrings[];
|
||||
RegClassType regClass;
|
||||
const RegClass *_regClass = nullptr;
|
||||
RegIndex regIdx;
|
||||
int numPinnedWrites;
|
||||
|
||||
@@ -149,10 +153,10 @@ class RegId
|
||||
friend class RegClassIterator;
|
||||
|
||||
public:
|
||||
constexpr RegId() : RegId(InvalidRegClass, 0) {}
|
||||
constexpr RegId() : RegId(invalidRegClass, 0) {}
|
||||
|
||||
constexpr RegId(RegClassType reg_class, RegIndex reg_idx)
|
||||
: regClass(reg_class), regIdx(reg_idx), numPinnedWrites(0)
|
||||
constexpr RegId(const RegClass ®_class, RegIndex reg_idx)
|
||||
: _regClass(®_class), regIdx(reg_idx), numPinnedWrites(0)
|
||||
{}
|
||||
|
||||
constexpr operator RegIndex() const
|
||||
@@ -163,7 +167,7 @@ class RegId
|
||||
constexpr bool
|
||||
operator==(const RegId& that) const
|
||||
{
|
||||
return regClass == that.classValue() && regIdx == that.index();
|
||||
return classValue() == that.classValue() && regIdx == that.index();
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
@@ -178,8 +182,8 @@ class RegId
|
||||
constexpr bool
|
||||
operator<(const RegId& that) const
|
||||
{
|
||||
return regClass < that.classValue() ||
|
||||
(regClass == that.classValue() && (regIdx < that.index()));
|
||||
return classValue() < that.classValue() ||
|
||||
(classValue() == that.classValue() && (regIdx < that.index()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -188,14 +192,14 @@ class RegId
|
||||
constexpr bool
|
||||
isRenameable() const
|
||||
{
|
||||
return regClass != MiscRegClass && regClass != InvalidRegClass;
|
||||
return classValue() != MiscRegClass && classValue() != InvalidRegClass;
|
||||
}
|
||||
|
||||
/** @return true if it is of the specified class. */
|
||||
constexpr bool
|
||||
is(RegClassType reg_class) const
|
||||
{
|
||||
return regClass == reg_class;
|
||||
return _regClass->type() == reg_class;
|
||||
}
|
||||
|
||||
/** Index accessors */
|
||||
@@ -203,12 +207,13 @@ class RegId
|
||||
constexpr RegIndex index() const { return regIdx; }
|
||||
|
||||
/** Class accessor */
|
||||
constexpr RegClassType classValue() const { return regClass; }
|
||||
constexpr const RegClass ®Class() const { return *_regClass; }
|
||||
constexpr RegClassType classValue() const { return _regClass->type(); }
|
||||
/** Return a const char* with the register class name. */
|
||||
constexpr const char*
|
||||
className() const
|
||||
{
|
||||
return regClassStrings[regClass];
|
||||
return regClassStrings[classValue()];
|
||||
}
|
||||
|
||||
int getNumPinnedWrites() const { return numPinnedWrites; }
|
||||
@@ -227,7 +232,7 @@ class RegClassIterator
|
||||
RegId id;
|
||||
|
||||
RegClassIterator(const RegClass ®_class, RegIndex idx) :
|
||||
id(reg_class.type(), idx)
|
||||
id(reg_class, idx)
|
||||
{}
|
||||
|
||||
friend class RegClass;
|
||||
@@ -285,7 +290,7 @@ RegClass::end() const
|
||||
constexpr RegId
|
||||
RegClass::operator[](RegIndex idx) const
|
||||
{
|
||||
return RegId(type(), idx);
|
||||
return RegId(*this, idx);
|
||||
}
|
||||
|
||||
template <typename ValueType>
|
||||
@@ -332,20 +337,21 @@ class PhysRegId : private RegId
|
||||
bool pinned;
|
||||
|
||||
public:
|
||||
explicit PhysRegId() : RegId(InvalidRegClass, -1), flatIdx(-1),
|
||||
explicit PhysRegId() : RegId(invalidRegClass, -1), flatIdx(-1),
|
||||
numPinnedWritesToComplete(0)
|
||||
{}
|
||||
|
||||
/** Scalar PhysRegId constructor. */
|
||||
explicit PhysRegId(RegClassType _regClass, RegIndex _regIdx,
|
||||
explicit PhysRegId(const RegClass ®_class, RegIndex _regIdx,
|
||||
RegIndex _flatIdx)
|
||||
: RegId(_regClass, _regIdx), flatIdx(_flatIdx),
|
||||
: RegId(reg_class, _regIdx), flatIdx(_flatIdx),
|
||||
numPinnedWritesToComplete(0), pinned(false)
|
||||
{}
|
||||
|
||||
/** Visible RegId methods */
|
||||
/** @{ */
|
||||
using RegId::index;
|
||||
using RegId::regClass;
|
||||
using RegId::classValue;
|
||||
using RegId::className;
|
||||
using RegId::is;
|
||||
@@ -433,7 +439,7 @@ struct hash<gem5::RegId>
|
||||
{
|
||||
// Extract unique integral values for the effective fields of a RegId.
|
||||
const size_t index = static_cast<size_t>(reg_id.index());
|
||||
const size_t class_num = static_cast<size_t>(reg_id.regClass);
|
||||
const size_t class_num = static_cast<size_t>(reg_id.classValue());
|
||||
|
||||
const size_t shifted_class_num =
|
||||
class_num << (sizeof(gem5::RegIndex) << 3);
|
||||
|
||||
Reference in New Issue
Block a user