Commit 57ec7dfe by Karl Schimpf

Make RegARM32 a namespace rather than a class.

Cleans up code by removing unnecessary class. BUG=None R=stichnot@chromium.org Review URL: https://codereview.chromium.org/1581803009 .
parent bba77687
...@@ -757,7 +757,7 @@ void InstARM32RegisterStackOp::emitSRegsAsText(const Cfg *Func, ...@@ -757,7 +757,7 @@ void InstARM32RegisterStackOp::emitSRegsAsText(const Cfg *Func,
IsFirst = false; IsFirst = false;
else else
Str << ", "; Str << ", ";
Str << RegARM32::getSRegName(Base + i); Str << RegARM32::getRegName(Base + i);
} }
Str << "}"; Str << "}";
} }
......
...@@ -22,44 +22,11 @@ ...@@ -22,44 +22,11 @@
namespace Ice { namespace Ice {
namespace ARM32 { namespace ARM32 {
namespace RegARM32 {
/// SizeOf is used to obtain the size of an initializer list as a constexpr /// An enum of every register. The enum value may not match the encoding used
/// expression. This is only needed until our C++ library is updated to /// to binary encode register operands in instructions.
/// C++ 14 -- which defines constexpr members to std::initializer_list. enum AllRegisters {
class SizeOf {
SizeOf(const SizeOf &) = delete;
SizeOf &operator=(const SizeOf &) = delete;
public:
constexpr SizeOf() : Size(0) {}
template <typename... T>
explicit constexpr SizeOf(T...)
: Size(__length<T...>::value) {}
constexpr SizeT size() const { return Size; }
private:
template <typename T, typename... U> struct __length {
static constexpr std::size_t value = 1 + __length<U...>::value;
};
template <typename T> struct __length<T> {
static constexpr std::size_t value = 1;
};
const std::size_t Size;
};
class RegARM32 {
private:
RegARM32() = delete;
RegARM32(const RegARM32 &) = delete;
RegARM32 &operator=(const RegARM32 &) = delete;
~RegARM32() = delete;
public:
/// An enum of every register. The enum value may not match the encoding used
/// to binary encode register operands in instructions.
enum AllRegisters {
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
val, val,
...@@ -69,53 +36,53 @@ public: ...@@ -69,53 +36,53 @@ public:
#define X(val, init) val init, #define X(val, init) val init,
REGARM32_TABLE_BOUNDS REGARM32_TABLE_BOUNDS
#undef X #undef X
}; };
/// An enum of GPR Registers. The enum value does match the encoding used to /// An enum of GPR Registers. The enum value does match the encoding used to
/// binary encode register operands in instructions. /// binary encode register operands in instructions.
enum GPRRegister { enum GPRRegister {
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_GPR_TABLE REGARM32_GPR_TABLE
#undef X #undef X
Encoded_Not_GPR = -1 Encoded_Not_GPR = -1
}; };
/// An enum of FP32 S-Registers. The enum value does match the encoding used /// An enum of FP32 S-Registers. The enum value does match the encoding used
/// to binary encode register operands in instructions. /// to binary encode register operands in instructions.
enum SRegister { enum SRegister {
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_FP32_TABLE REGARM32_FP32_TABLE
#undef X #undef X
Encoded_Not_SReg = -1 Encoded_Not_SReg = -1
}; };
/// An enum of FP64 D-Registers. The enum value does match the encoding used /// An enum of FP64 D-Registers. The enum value does match the encoding used
/// to binary encode register operands in instructions. /// to binary encode register operands in instructions.
enum DRegister { enum DRegister {
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_FP64_TABLE REGARM32_FP64_TABLE
#undef X #undef X
Encoded_Not_DReg = -1 Encoded_Not_DReg = -1
}; };
/// An enum of 128-bit Q-Registers. The enum value does match the encoding /// An enum of 128-bit Q-Registers. The enum value does match the encoding
/// used to binary encode register operands in instructions. /// used to binary encode register operands in instructions.
enum QRegister { enum QRegister {
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_VEC128_TABLE REGARM32_VEC128_TABLE
#undef X #undef X
Encoded_Not_QReg = -1 Encoded_Not_QReg = -1
}; };
static constexpr struct TableType { extern struct RegTableType {
const char *Name; const char *Name;
unsigned Encoding : 10; unsigned Encoding : 10;
unsigned CCArg : 6; unsigned CCArg : 6;
...@@ -133,31 +100,15 @@ public: ...@@ -133,31 +100,15 @@ public:
SizeT NumAliases : (NUM_ALIASES_BITS + 1); SizeT NumAliases : (NUM_ALIASES_BITS + 1);
uint16_t Aliases[1 << NUM_ALIASES_BITS]; uint16_t Aliases[1 << NUM_ALIASES_BITS];
#undef NUM_ALIASES_BITS #undef NUM_ALIASES_BITS
} Table[Reg_NUM] = { } RegTable[Reg_NUM];
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
{ \
name, encode, cc_arg, scratch, preserved, stackptr, frameptr, isGPR, \
isInt, isI64Pair, isFP32, isFP64, isVec128, \
(SizeOf alias_init).size(), alias_init \
} \
,
REGARM32_TABLE
#undef X
};
static inline void assertRegisterDefined(int32_t RegNum) { static inline bool isGPRegister(int32_t RegNum) {
(void)RegNum;
assert(RegNum >= 0); assert(RegNum >= 0);
assert(RegNum < Reg_NUM); assert(RegNum < Reg_NUM);
} return RegTable[RegNum].IsGPR;
}
static inline bool isGPRegister(int32_t RegNum) { static constexpr inline SizeT getNumGPRegs() {
assertRegisterDefined(RegNum);
return Table[RegNum].IsGPR;
}
static constexpr SizeT getNumGPRegs() {
return 0 return 0
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
...@@ -165,14 +116,15 @@ public: ...@@ -165,14 +116,15 @@ public:
REGARM32_TABLE REGARM32_TABLE
#undef X #undef X
; ;
} }
static inline GPRRegister getEncodedGPR(int32_t RegNum) { static inline GPRRegister getEncodedGPR(int32_t RegNum) {
assert(isGPRegister(RegNum)); assert(RegNum >= 0);
return GPRRegister(Table[RegNum].Encoding); assert(RegNum < Reg_NUM);
} return GPRRegister(RegTable[RegNum].Encoding);
}
static constexpr SizeT getNumGPRs() { static constexpr inline SizeT getNumGPRs() {
return 0 return 0
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
...@@ -180,39 +132,39 @@ public: ...@@ -180,39 +132,39 @@ public:
REGARM32_TABLE REGARM32_TABLE
#undef X #undef X
; ;
} }
static inline bool isGPR(SizeT RegNum) { static inline bool isGPR(int32_t RegNum) {
assertRegisterDefined(RegNum); assert(RegNum >= 0);
return Table[RegNum].IsGPR; assert(RegNum < Reg_NUM);
} return RegTable[RegNum].IsGPR;
}
static inline IceString getGPRName(SizeT RegNum) {
assert(isGPR(RegNum));
return Table[RegNum].Name;
}
static inline GPRRegister getI64PairFirstGPRNum(int32_t RegNum) { static inline GPRRegister getI64PairFirstGPRNum(int32_t RegNum) {
assert(isI64RegisterPair(RegNum)); assert(RegNum >= 0);
return GPRRegister(Table[RegNum].Encoding); assert(RegNum < Reg_NUM);
} return GPRRegister(RegTable[RegNum].Encoding);
}
static inline GPRRegister getI64PairSecondGPRNum(int32_t RegNum) { static inline GPRRegister getI64PairSecondGPRNum(int32_t RegNum) {
assert(isI64RegisterPair(RegNum)); assert(RegNum >= 0);
return GPRRegister(Table[RegNum].Encoding + 1); assert(RegNum < Reg_NUM);
} return GPRRegister(RegTable[RegNum].Encoding + 1);
}
static inline bool isI64RegisterPair(int32_t RegNum) { static inline bool isI64RegisterPair(int32_t RegNum) {
assertRegisterDefined(RegNum); assert(RegNum >= 0);
return Table[RegNum].IsI64Pair; assert(RegNum < Reg_NUM);
} return RegTable[RegNum].IsI64Pair;
}
static inline bool isEncodedSReg(int32_t RegNum) { static inline bool isEncodedSReg(int32_t RegNum) {
assertRegisterDefined(RegNum); assert(RegNum >= 0);
return Table[RegNum].IsFP32; assert(RegNum < Reg_NUM);
} return RegTable[RegNum].IsFP32;
}
static constexpr SizeT getNumSRegs() { static constexpr inline SizeT getNumSRegs() {
return 0 return 0
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
...@@ -220,24 +172,21 @@ public: ...@@ -220,24 +172,21 @@ public:
REGARM32_TABLE REGARM32_TABLE
#undef X #undef X
; ;
} }
static inline IceString getSRegName(SizeT RegNum) { static inline SRegister getEncodedSReg(int32_t RegNum) {
assert(isEncodedSReg(RegNum)); assert(RegNum >= 0);
return Table[RegNum].Name; assert(RegNum < Reg_NUM);
} return SRegister(RegTable[RegNum].Encoding);
}
static inline SRegister getEncodedSReg(int32_t RegNum) {
assert(isEncodedSReg(RegNum));
return SRegister(Table[RegNum].Encoding);
}
static inline bool isEncodedDReg(int32_t RegNum) { static inline bool isEncodedDReg(int32_t RegNum) {
assertRegisterDefined(RegNum); assert(RegNum >= 0);
return Table[RegNum].IsFP64; assert(RegNum < Reg_NUM);
} return RegTable[RegNum].IsFP64;
}
static constexpr inline SizeT getNumDRegs() { static constexpr inline SizeT getNumDRegs() {
return 0 return 0
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
...@@ -245,32 +194,35 @@ public: ...@@ -245,32 +194,35 @@ public:
REGARM32_TABLE REGARM32_TABLE
#undef X #undef X
; ;
} }
static inline DRegister getEncodedDReg(int32_t RegNum) { static inline DRegister getEncodedDReg(int32_t RegNum) {
assert(isEncodedDReg(RegNum)); assert(RegNum >= 0);
return DRegister(Table[RegNum].Encoding); assert(RegNum < Reg_NUM);
} return DRegister(RegTable[RegNum].Encoding);
}
static inline bool isEncodedQReg(int32_t RegNum) { static inline bool isEncodedQReg(int32_t RegNum) {
assertRegisterDefined(RegNum); assert(RegNum >= 0);
return Table[RegNum].IsVec128; assert(RegNum < Reg_NUM);
} return RegTable[RegNum].IsVec128;
}
static inline QRegister getEncodedQReg(int32_t RegNum) { static inline QRegister getEncodedQReg(int32_t RegNum) {
assert(isEncodedQReg(RegNum)); assert(isEncodedQReg(RegNum));
return QRegister(Table[RegNum].Encoding); return QRegister(RegTable[RegNum].Encoding);
} }
static inline IceString getRegName(int32_t RegNum) { static inline IceString getRegName(int32_t RegNum) {
assertRegisterDefined(RegNum); assert(RegNum >= 0);
return Table[RegNum].Name; assert(RegNum < Reg_NUM);
} return RegTable[RegNum].Name;
}; }
// Extend enum RegClass with ARM32-specific register classes (if any). // Extend enum RegClass with ARM32-specific register classes (if any).
enum RegClassARM32 : uint8_t { RCARM32_NUM = RC_Target }; enum RegClassARM32 : uint8_t { RCARM32_NUM = RC_Target };
} // end of namespace RegARM32
} // end of namespace ARM32 } // end of namespace ARM32
} // end of namespace Ice } // end of namespace Ice
......
...@@ -53,13 +53,55 @@ createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { ...@@ -53,13 +53,55 @@ createTargetHeaderLowering(::Ice::GlobalContext *Ctx) {
void staticInit(const ::Ice::ClFlags &Flags) { void staticInit(const ::Ice::ClFlags &Flags) {
::Ice::ARM32::TargetARM32::staticInit(Flags); ::Ice::ARM32::TargetARM32::staticInit(Flags);
} }
} // end of namespace ARM32 } // end of namespace ARM32
namespace Ice { namespace Ice {
namespace ARM32 { namespace ARM32 {
namespace {
/// SizeOf is used to obtain the size of an initializer list as a constexpr
/// expression. This is only needed until our C++ library is updated to
/// C++ 14 -- which defines constexpr members to std::initializer_list.
class SizeOf {
SizeOf(const SizeOf &) = delete;
SizeOf &operator=(const SizeOf &) = delete;
public:
constexpr SizeOf() : Size(0) {}
template <typename... T>
explicit constexpr SizeOf(T...)
: Size(__length<T...>::value) {}
constexpr SizeT size() const { return Size; }
private:
template <typename T, typename... U> struct __length {
static constexpr std::size_t value = 1 + __length<U...>::value;
};
template <typename T> struct __length<T> {
static constexpr std::size_t value = 1;
};
const std::size_t Size;
};
} // end of anonymous namespace
// Defines the RegARM32::Table table with register information. // Defines the RegARM32::Table table with register information.
constexpr RegARM32::TableType RegARM32::Table[]; RegARM32::RegTableType RegARM32::RegTable[RegARM32::Reg_NUM] = {
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
{ \
name, encode, cc_arg, scratch, preserved, stackptr, frameptr, isGPR, \
isInt, isI64Pair, isFP32, isFP64, isVec128, \
(SizeOf alias_init).size(), alias_init \
} \
,
REGARM32_TABLE
#undef X
};
namespace { namespace {
...@@ -246,7 +288,7 @@ void TargetARM32::staticInit(const ClFlags &Flags) { ...@@ -246,7 +288,7 @@ void TargetARM32::staticInit(const ClFlags &Flags) {
llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
ScratchRegs.resize(RegARM32::Reg_NUM); ScratchRegs.resize(RegARM32::Reg_NUM);
for (int i = 0; i < RegARM32::Reg_NUM; ++i) { for (int i = 0; i < RegARM32::Reg_NUM; ++i) {
const auto &Entry = RegARM32::Table[i]; const auto &Entry = RegARM32::RegTable[i];
IntegerRegisters[i] = Entry.IsInt; IntegerRegisters[i] = Entry.IsInt;
I64PairRegisters[i] = Entry.IsI64Pair; I64PairRegisters[i] = Entry.IsI64Pair;
Float32Registers[i] = Entry.IsFP32; Float32Registers[i] = Entry.IsFP32;
...@@ -1833,7 +1875,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, ...@@ -1833,7 +1875,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include,
llvm::SmallBitVector Registers(RegARM32::Reg_NUM); llvm::SmallBitVector Registers(RegARM32::Reg_NUM);
for (int i = 0; i < RegARM32::Reg_NUM; ++i) { for (int i = 0; i < RegARM32::Reg_NUM; ++i) {
const auto &Entry = RegARM32::Table[i]; const auto &Entry = RegARM32::RegTable[i];
if (Entry.Scratch && (Include & RegSet_CallerSave)) if (Entry.Scratch && (Include & RegSet_CallerSave))
Registers[i] = true; Registers[i] = true;
if (Entry.Preserved && (Include & RegSet_CalleeSave)) if (Entry.Preserved && (Include & RegSet_CalleeSave))
......
...@@ -1012,7 +1012,7 @@ protected: ...@@ -1012,7 +1012,7 @@ protected:
bool PrologEmitsFixedAllocas = false; bool PrologEmitsFixedAllocas = false;
uint32_t MaxOutArgsSizeBytes = 0; uint32_t MaxOutArgsSizeBytes = 0;
// TODO(jpp): std::array instead of array. // TODO(jpp): std::array instead of array.
static llvm::SmallBitVector TypeToRegisterSet[RCARM32_NUM]; static llvm::SmallBitVector TypeToRegisterSet[RegARM32::RCARM32_NUM];
static llvm::SmallBitVector RegisterAliases[RegARM32::Reg_NUM]; static llvm::SmallBitVector RegisterAliases[RegARM32::Reg_NUM];
static llvm::SmallBitVector ScratchRegs; static llvm::SmallBitVector ScratchRegs;
llvm::SmallBitVector RegsUsed; llvm::SmallBitVector RegsUsed;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment