Index: src/IceRegistersARM32.h |
diff --git a/src/IceRegistersARM32.h b/src/IceRegistersARM32.h |
index 39efd7f0f84f630e6767bab70bc0a2374275b2a5..7fbab6c56234914a358de83267440e2ac85c4dee 100644 |
--- a/src/IceRegistersARM32.h |
+++ b/src/IceRegistersARM32.h |
@@ -21,42 +21,90 @@ |
namespace Ice { |
-namespace RegARM32 { |
- |
-/// An enum of every register. The enum value may not match the encoding |
-/// used to binary encode register operands in instructions. |
-enum AllRegisters { |
+class RegARM32 { |
+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, scratch, preserved, stackptr, frameptr, isInt, \ |
- isFP) \ |
+ isFP32, isFP64, isVec128) \ |
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, scratch, preserved, stackptr, frameptr, isInt, \ |
- isFP) \ |
- Encoded_##val encode, |
- REGARM32_GPR_TABLE |
+ isFP32, isFP64, isVec128) \ |
+ Encoded_##val = encode, |
+ 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 { |
+#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ |
+ isFP32, isFP64, isVec128) \ |
+ Encoded_##val = encode, |
+ REGARM32_FP32_TABLE |
+#undef X |
+ 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 { |
+#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ |
+ isFP32, isFP64, isVec128) \ |
+ Encoded_##val = encode, |
+ REGARM32_FP64_TABLE |
+#undef X |
+ Encoded_Not_DReg = -1 |
+ }; |
-// TODO(jvoung): Floating point and vector registers... |
-// Need to model overlap and difference in encoding too. |
+ /// 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, scratch, preserved, stackptr, frameptr, isInt, \ |
+ isFP32, isFP64, isVec128) \ |
+ Encoded_##val = encode, |
+ REGARM32_VEC128_TABLE |
+#undef X |
+ Encoded_Not_QReg = -1 |
+ }; |
-static inline GPRRegister getEncodedGPR(int32_t RegNum) { |
- assert(Reg_GPR_First <= RegNum && RegNum <= Reg_GPR_Last); |
- return GPRRegister(RegNum - Reg_GPR_First); |
-} |
+ static inline GPRRegister getEncodedGPR(int32_t RegNum) { |
+ assert(Reg_GPR_First <= RegNum); |
+ assert(RegNum <= Reg_GPR_Last); |
+ return GPRRegister(RegNum - Reg_GPR_First); |
+ } |
-} // end of namespace RegARM32 |
+ static inline SRegister getEncodedSReg(int32_t RegNum) { |
+ assert(Reg_SREG_First <= RegNum); |
+ assert(RegNum <= Reg_SREG_Last); |
+ return SRegister(RegNum - Reg_SREG_First); |
+ } |
+ |
+ static inline DRegister getEncodedDReg(int32_t RegNum) { |
+ assert(Reg_DREG_First <= RegNum); |
+ assert(RegNum <= Reg_DREG_Last); |
+ return DRegister(RegNum - Reg_DREG_First); |
+ } |
+ |
+ static inline QRegister getEncodedQReg(int32_t RegNum) { |
+ assert(Reg_QREG_First <= RegNum); |
+ assert(RegNum <= Reg_QREG_Last); |
+ return QRegister(RegNum - Reg_QREG_First); |
+ } |
+}; |
} // end of namespace Ice |