| Index: src/IceRegistersARM32.h
|
| diff --git a/src/IceRegistersARM32.h b/src/IceRegistersARM32.h
|
| index 31323c250b9d725410133ec4e9094ba2d8512233..94f45c137557cb8b03329330ccb0ae547ca1ea76 100644
|
| --- a/src/IceRegistersARM32.h
|
| +++ b/src/IceRegistersARM32.h
|
| @@ -22,255 +22,207 @@
|
|
|
| namespace Ice {
|
| namespace ARM32 {
|
| +namespace RegARM32 {
|
|
|
| -/// 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;
|
| -};
|
| -
|
| -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 {
|
| +/// 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, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| val,
|
| - REGARM32_TABLE
|
| + REGARM32_TABLE
|
| #undef X
|
| - Reg_NUM,
|
| + Reg_NUM,
|
| #define X(val, init) val init,
|
| - REGARM32_TABLE_BOUNDS
|
| + REGARM32_TABLE_BOUNDS
|
| #undef X
|
| - };
|
| +};
|
|
|
| - /// An enum of GPR Registers. The enum value does match the encoding used to
|
| - /// binary encode register operands in instructions.
|
| - enum GPRRegister {
|
| +/// An enum of GPR Registers. The enum value does match the encoding used to
|
| +/// binary encode register operands in instructions.
|
| +enum GPRRegister {
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| Encoded_##val = encode,
|
| - REGARM32_GPR_TABLE
|
| + REGARM32_GPR_TABLE
|
| #undef X
|
| - Encoded_Not_GPR = -1
|
| - };
|
| + Encoded_Not_GPR = -1
|
| +};
|
|
|
| - /// An enum of FP32 S-Registers. The enum value does match the encoding used
|
| - /// to binary encode register operands in instructions.
|
| - enum SRegister {
|
| +/// An enum of FP32 S-Registers. The enum value does match the encoding used
|
| +/// to binary encode register operands in instructions.
|
| +enum SRegister {
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| Encoded_##val = encode,
|
| - REGARM32_FP32_TABLE
|
| + REGARM32_FP32_TABLE
|
| #undef X
|
| - Encoded_Not_SReg = -1
|
| - };
|
| + Encoded_Not_SReg = -1
|
| +};
|
|
|
| - /// An enum of FP64 D-Registers. The enum value does match the encoding used
|
| - /// to binary encode register operands in instructions.
|
| - enum DRegister {
|
| +/// An enum of FP64 D-Registers. The enum value does match the encoding used
|
| +/// to binary encode register operands in instructions.
|
| +enum DRegister {
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| Encoded_##val = encode,
|
| - REGARM32_FP64_TABLE
|
| + REGARM32_FP64_TABLE
|
| #undef X
|
| - Encoded_Not_DReg = -1
|
| - };
|
| + Encoded_Not_DReg = -1
|
| +};
|
|
|
| - /// An enum of 128-bit Q-Registers. The enum value does match the encoding
|
| - /// used to binary encode register operands in instructions.
|
| - enum QRegister {
|
| +/// An enum of 128-bit Q-Registers. The enum value does match the encoding
|
| +/// used to binary encode register operands in instructions.
|
| +enum QRegister {
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| Encoded_##val = encode,
|
| - REGARM32_VEC128_TABLE
|
| + REGARM32_VEC128_TABLE
|
| #undef X
|
| - Encoded_Not_QReg = -1
|
| - };
|
| + Encoded_Not_QReg = -1
|
| +};
|
|
|
| - static constexpr struct TableType {
|
| - const char *Name;
|
| - unsigned Encoding : 10;
|
| - unsigned CCArg : 6;
|
| - unsigned Scratch : 1;
|
| - unsigned Preserved : 1;
|
| - unsigned StackPtr : 1;
|
| - unsigned FramePtr : 1;
|
| - unsigned IsGPR : 1;
|
| - unsigned IsInt : 1;
|
| - unsigned IsI64Pair : 1;
|
| - unsigned IsFP32 : 1;
|
| - unsigned IsFP64 : 1;
|
| - unsigned IsVec128 : 1;
|
| +extern struct RegTableType {
|
| + const char *Name;
|
| + unsigned Encoding : 10;
|
| + unsigned CCArg : 6;
|
| + unsigned Scratch : 1;
|
| + unsigned Preserved : 1;
|
| + unsigned StackPtr : 1;
|
| + unsigned FramePtr : 1;
|
| + unsigned IsGPR : 1;
|
| + unsigned IsInt : 1;
|
| + unsigned IsI64Pair : 1;
|
| + unsigned IsFP32 : 1;
|
| + unsigned IsFP64 : 1;
|
| + unsigned IsVec128 : 1;
|
| #define NUM_ALIASES_BITS 3
|
| - SizeT NumAliases : (NUM_ALIASES_BITS + 1);
|
| - uint16_t Aliases[1 << NUM_ALIASES_BITS];
|
| + SizeT NumAliases : (NUM_ALIASES_BITS + 1);
|
| + uint16_t Aliases[1 << NUM_ALIASES_BITS];
|
| #undef NUM_ALIASES_BITS
|
| - } Table[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) {
|
| - (void)RegNum;
|
| - assert(RegNum >= 0);
|
| - assert(RegNum < Reg_NUM);
|
| - }
|
| +} RegTable[Reg_NUM];
|
|
|
| - static inline bool isGPRegister(int32_t RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].IsGPR;
|
| - }
|
| +static inline bool isGPRegister(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].IsGPR;
|
| +}
|
|
|
| - static constexpr SizeT getNumGPRegs() {
|
| - return 0
|
| +static constexpr inline SizeT getNumGPRegs() {
|
| + return 0
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| +(isGPR)
|
| - REGARM32_TABLE
|
| + REGARM32_TABLE
|
| #undef X
|
| - ;
|
| - }
|
| + ;
|
| +}
|
|
|
| - static inline GPRRegister getEncodedGPR(int32_t RegNum) {
|
| - assert(isGPRegister(RegNum));
|
| - return GPRRegister(Table[RegNum].Encoding);
|
| - }
|
| +static inline GPRRegister getEncodedGPR(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return GPRRegister(RegTable[RegNum].Encoding);
|
| +}
|
|
|
| - static constexpr SizeT getNumGPRs() {
|
| - return 0
|
| +static constexpr inline SizeT getNumGPRs() {
|
| + return 0
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| +(isGPR)
|
| - REGARM32_TABLE
|
| + REGARM32_TABLE
|
| #undef X
|
| - ;
|
| - }
|
| -
|
| - static inline bool isGPR(SizeT RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].IsGPR;
|
| - }
|
| -
|
| - static inline IceString getGPRName(SizeT RegNum) {
|
| - assert(isGPR(RegNum));
|
| - return Table[RegNum].Name;
|
| - }
|
| -
|
| - static inline GPRRegister getI64PairFirstGPRNum(int32_t RegNum) {
|
| - assert(isI64RegisterPair(RegNum));
|
| - return GPRRegister(Table[RegNum].Encoding);
|
| - }
|
| -
|
| - static inline GPRRegister getI64PairSecondGPRNum(int32_t RegNum) {
|
| - assert(isI64RegisterPair(RegNum));
|
| - return GPRRegister(Table[RegNum].Encoding + 1);
|
| - }
|
| -
|
| - static inline bool isI64RegisterPair(int32_t RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].IsI64Pair;
|
| - }
|
| -
|
| - static inline bool isEncodedSReg(int32_t RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].IsFP32;
|
| - }
|
| -
|
| - static constexpr SizeT getNumSRegs() {
|
| - return 0
|
| + ;
|
| +}
|
| +
|
| +static inline bool isGPR(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].IsGPR;
|
| +}
|
| +
|
| +static inline GPRRegister getI64PairFirstGPRNum(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return GPRRegister(RegTable[RegNum].Encoding);
|
| +}
|
| +
|
| +static inline GPRRegister getI64PairSecondGPRNum(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return GPRRegister(RegTable[RegNum].Encoding + 1);
|
| +}
|
| +
|
| +static inline bool isI64RegisterPair(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].IsI64Pair;
|
| +}
|
| +
|
| +static inline bool isEncodedSReg(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].IsFP32;
|
| +}
|
| +
|
| +static constexpr inline SizeT getNumSRegs() {
|
| + return 0
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| +(isFP32)
|
| - REGARM32_TABLE
|
| + REGARM32_TABLE
|
| #undef X
|
| - ;
|
| - }
|
| -
|
| - static inline IceString getSRegName(SizeT RegNum) {
|
| - assert(isEncodedSReg(RegNum));
|
| - return Table[RegNum].Name;
|
| - }
|
| -
|
| - static inline SRegister getEncodedSReg(int32_t RegNum) {
|
| - assert(isEncodedSReg(RegNum));
|
| - return SRegister(Table[RegNum].Encoding);
|
| - }
|
| -
|
| - static inline bool isEncodedDReg(int32_t RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].IsFP64;
|
| - }
|
| -
|
| - static constexpr inline SizeT getNumDRegs() {
|
| - return 0
|
| + ;
|
| +}
|
| +
|
| +static inline SRegister getEncodedSReg(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return SRegister(RegTable[RegNum].Encoding);
|
| +}
|
| +
|
| +static inline bool isEncodedDReg(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].IsFP64;
|
| +}
|
| +
|
| +static constexpr inline SizeT getNumDRegs() {
|
| + return 0
|
| #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
|
| isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
|
| +(isFP64)
|
| - REGARM32_TABLE
|
| + REGARM32_TABLE
|
| #undef X
|
| - ;
|
| - }
|
| -
|
| - static inline DRegister getEncodedDReg(int32_t RegNum) {
|
| - assert(isEncodedDReg(RegNum));
|
| - return DRegister(Table[RegNum].Encoding);
|
| - }
|
| -
|
| - static inline bool isEncodedQReg(int32_t RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].IsVec128;
|
| - }
|
| -
|
| - static inline QRegister getEncodedQReg(int32_t RegNum) {
|
| - assert(isEncodedQReg(RegNum));
|
| - return QRegister(Table[RegNum].Encoding);
|
| - }
|
| -
|
| - static inline IceString getRegName(int32_t RegNum) {
|
| - assertRegisterDefined(RegNum);
|
| - return Table[RegNum].Name;
|
| - }
|
| -};
|
| + ;
|
| +}
|
| +
|
| +static inline DRegister getEncodedDReg(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return DRegister(RegTable[RegNum].Encoding);
|
| +}
|
| +
|
| +static inline bool isEncodedQReg(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].IsVec128;
|
| +}
|
| +
|
| +static inline QRegister getEncodedQReg(int32_t RegNum) {
|
| + assert(isEncodedQReg(RegNum));
|
| + return QRegister(RegTable[RegNum].Encoding);
|
| +}
|
| +
|
| +static inline IceString getRegName(int32_t RegNum) {
|
| + assert(RegNum >= 0);
|
| + assert(RegNum < Reg_NUM);
|
| + return RegTable[RegNum].Name;
|
| +}
|
|
|
| // Extend enum RegClass with ARM32-specific register classes (if any).
|
| enum RegClassARM32 : uint8_t { RCARM32_NUM = RC_Target };
|
|
|
| +} // end of namespace RegARM32
|
| } // end of namespace ARM32
|
| } // end of namespace Ice
|
|
|
|
|