Commit 5300bfe5 by John Porto

Subzero. Changes the declaration for ARM32 registers.

parent bb0a5fe3
...@@ -27,7 +27,7 @@ public: ...@@ -27,7 +27,7 @@ public:
/// used to binary encode register operands in instructions. /// used to binary encode register operands in instructions.
enum AllRegisters { enum AllRegisters {
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
val, val,
REGARM32_TABLE REGARM32_TABLE
#undef X #undef X
...@@ -41,7 +41,7 @@ public: ...@@ -41,7 +41,7 @@ public:
/// to binary encode register operands in instructions. /// to binary encode register operands in instructions.
enum GPRRegister { enum GPRRegister {
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_GPR_TABLE REGARM32_GPR_TABLE
#undef X #undef X
...@@ -52,7 +52,7 @@ public: ...@@ -52,7 +52,7 @@ public:
/// to binary encode register operands in instructions. /// to binary encode register operands in instructions.
enum SRegister { enum SRegister {
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_FP32_TABLE REGARM32_FP32_TABLE
#undef X #undef X
...@@ -63,7 +63,7 @@ public: ...@@ -63,7 +63,7 @@ public:
/// to binary encode register operands in instructions. /// to binary encode register operands in instructions.
enum DRegister { enum DRegister {
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_FP64_TABLE REGARM32_FP64_TABLE
#undef X #undef X
...@@ -74,7 +74,7 @@ public: ...@@ -74,7 +74,7 @@ public:
/// 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, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
Encoded_##val = encode, Encoded_##val = encode,
REGARM32_VEC128_TABLE REGARM32_VEC128_TABLE
#undef X #undef X
......
...@@ -182,13 +182,19 @@ TargetARM32::TargetARM32(Cfg *Func) ...@@ -182,13 +182,19 @@ TargetARM32::TargetARM32(Cfg *Func)
llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
ScratchRegs.resize(RegARM32::Reg_NUM); ScratchRegs.resize(RegARM32::Reg_NUM);
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
IntegerRegisters[RegARM32::val] = isInt; \ IntegerRegisters[RegARM32::val] = isInt; \
Float32Registers[RegARM32::val] = isFP32; \ Float32Registers[RegARM32::val] = isFP32; \
Float64Registers[RegARM32::val] = isFP64; \ Float64Registers[RegARM32::val] = isFP64; \
VectorRegisters[RegARM32::val] = isVec128; \ VectorRegisters[RegARM32::val] = isVec128; \
RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
RegisterAliases[RegARM32::val].set(RegARM32::val); \ for (SizeT RegAlias : alias_init) { \
assert(!RegisterAliases[RegARM32::val][RegAlias] && \
"Duplicate alias for " #val); \
RegisterAliases[RegARM32::val].set(RegAlias); \
} \
RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
assert(RegisterAliases[RegARM32::val][RegARM32::val]); \
ScratchRegs[RegARM32::val] = scratch; ScratchRegs[RegARM32::val] = scratch;
REGARM32_TABLE; REGARM32_TABLE;
#undef X #undef X
...@@ -368,7 +374,7 @@ IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const { ...@@ -368,7 +374,7 @@ IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const {
(void)Ty; (void)Ty;
static const char *RegNames[] = { static const char *RegNames[] = {
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
name, name,
REGARM32_TABLE REGARM32_TABLE
#undef X #undef X
...@@ -467,21 +473,30 @@ bool TargetARM32::CallingConv::FPInReg(Type Ty, int32_t *Reg) { ...@@ -467,21 +473,30 @@ bool TargetARM32::CallingConv::FPInReg(Type Ty, int32_t *Reg) {
return false; return false;
if (isVectorType(Ty)) { if (isVectorType(Ty)) {
NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 4); NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 4);
*Reg = RegARM32::Reg_q0 + (NumFPRegUnits / 4); // Q registers are declared in reverse order, so
// RegARM32::Reg_q0 > RegARM32::Reg_q1. Therefore, we need to subtract
// NumFPRegUnits from Reg_q0. Same thing goes for D registers.
static_assert(RegARM32::Reg_q0 > RegARM32::Reg_q1,
"ARM32 Q registers are possibly declared incorrectly.");
*Reg = RegARM32::Reg_q0 - (NumFPRegUnits / 4);
NumFPRegUnits += 4; NumFPRegUnits += 4;
// If this bumps us past the boundary, don't allocate to a register // If this bumps us past the boundary, don't allocate to a register
// and leave any previously speculatively consumed registers as consumed. // and leave any previously speculatively consumed registers as consumed.
if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS) if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS)
return false; return false;
} else if (Ty == IceType_f64) { } else if (Ty == IceType_f64) {
static_assert(RegARM32::Reg_d0 > RegARM32::Reg_d1,
"ARM32 D registers are possibly declared incorrectly.");
NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 2); NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 2);
*Reg = RegARM32::Reg_d0 + (NumFPRegUnits / 2); *Reg = RegARM32::Reg_d0 - (NumFPRegUnits / 2);
NumFPRegUnits += 2; NumFPRegUnits += 2;
// If this bumps us past the boundary, don't allocate to a register // If this bumps us past the boundary, don't allocate to a register
// and leave any previously speculatively consumed registers as consumed. // and leave any previously speculatively consumed registers as consumed.
if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS) if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS)
return false; return false;
} else { } else {
static_assert(RegARM32::Reg_s0 < RegARM32::Reg_s1,
"ARM32 S registers are possibly declared incorrectly.");
assert(Ty == IceType_f32); assert(Ty == IceType_f32);
*Reg = RegARM32::Reg_s0 + NumFPRegUnits; *Reg = RegARM32::Reg_s0 + NumFPRegUnits;
++NumFPRegUnits; ++NumFPRegUnits;
...@@ -1152,7 +1167,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, ...@@ -1152,7 +1167,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include,
llvm::SmallBitVector Registers(RegARM32::Reg_NUM); llvm::SmallBitVector Registers(RegARM32::Reg_NUM);
#define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
isFP32, isFP64, isVec128) \ isFP32, isFP64, isVec128, alias_init) \
if (scratch && (Include & RegSet_CallerSave)) \ if (scratch && (Include & RegSet_CallerSave)) \
Registers[RegARM32::val] = true; \ Registers[RegARM32::val] = true; \
if (preserved && (Include & RegSet_CalleeSave)) \ if (preserved && (Include & RegSet_CalleeSave)) \
......
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