arch-arm,cpu: Simplify the RegClass constructor(s).
Replace the two constructors with one that takes the truly mandantory parameters, and then a function to derive a new RegClass with some sort of adjustment, currently by adding custom ops, or setting a non-standard register size. Because the constructor and the modifier function are constexpr, they should fold away and not actually create extra temporary copies of the RegClass in the modifier functions. Change-Id: I8acb755eb28fc8474ec453c51ad205a52eed9a8e Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/50249 Tested-by: kokoro <noreply+kokoro@google.com> Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
This commit is contained in:
@@ -88,11 +88,11 @@ class RegClass
|
||||
RegClassType _type;
|
||||
|
||||
size_t _numRegs;
|
||||
size_t _regBytes;
|
||||
size_t _regBytes = sizeof(RegVal);
|
||||
// This is how much to shift an index by to get an offset of a register in
|
||||
// a register file from the register index, which would otherwise need to
|
||||
// be calculated with a multiply.
|
||||
size_t _regShift;
|
||||
size_t _regShift = ceilLog2(sizeof(RegVal));
|
||||
|
||||
static inline RegClassOps defaultOps;
|
||||
RegClassOps *_ops = &defaultOps;
|
||||
@@ -100,16 +100,26 @@ class RegClass
|
||||
|
||||
public:
|
||||
constexpr RegClass(RegClassType type, size_t num_regs,
|
||||
const debug::Flag &debug_flag, size_t reg_bytes=sizeof(RegVal)) :
|
||||
_type(type), _numRegs(num_regs), _regBytes(reg_bytes),
|
||||
_regShift(ceilLog2(reg_bytes)), debugFlag(debug_flag)
|
||||
const debug::Flag &debug_flag) :
|
||||
_type(type), _numRegs(num_regs), debugFlag(debug_flag)
|
||||
{}
|
||||
constexpr RegClass(RegClassType type, size_t num_regs,
|
||||
RegClassOps &new_ops, const debug::Flag &debug_flag,
|
||||
size_t reg_bytes=sizeof(RegVal)) :
|
||||
RegClass(type, num_regs, debug_flag, reg_bytes)
|
||||
|
||||
constexpr RegClass
|
||||
ops(RegClassOps &new_ops) const
|
||||
{
|
||||
_ops = &new_ops;
|
||||
RegClass reg_class = *this;
|
||||
reg_class._ops = &new_ops;
|
||||
return reg_class;
|
||||
}
|
||||
|
||||
template <class RegType>
|
||||
constexpr RegClass
|
||||
regType() const
|
||||
{
|
||||
RegClass reg_class = *this;
|
||||
reg_class._regBytes = sizeof(RegType);
|
||||
reg_class._regShift = ceilLog2(reg_class._regBytes);
|
||||
return reg_class;
|
||||
}
|
||||
|
||||
constexpr RegClassType type() const { return _type; }
|
||||
|
||||
Reference in New Issue
Block a user