Chromium Code Reviews| Index: src/IceTargetLoweringARM32.cpp |
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
| index 5edd00aa92566ca94dcc964e085e5356198929ef..c7c47da896fb272c4d777d12cd94dd6531dd2808 100644 |
| --- a/src/IceTargetLoweringARM32.cpp |
| +++ b/src/IceTargetLoweringARM32.cpp |
| @@ -182,13 +182,19 @@ TargetARM32::TargetARM32(Cfg *Func) |
| llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); |
| ScratchRegs.resize(RegARM32::Reg_NUM); |
| #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ |
| - isFP32, isFP64, isVec128) \ |
| + isFP32, isFP64, isVec128, alias_init) \ |
| IntegerRegisters[RegARM32::val] = isInt; \ |
| Float32Registers[RegARM32::val] = isFP32; \ |
| Float64Registers[RegARM32::val] = isFP64; \ |
| VectorRegisters[RegARM32::val] = isVec128; \ |
| 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); \ |
|
Jim Stichnoth
2015/09/04 22:08:36
cool
John
2015/09/08 16:01:38
Acknowledged.
|
| + RegisterAliases[RegARM32::val].set(RegAlias); \ |
| + } \ |
| + RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ |
| + assert(RegisterAliases[RegARM32::val][RegARM32::val]); \ |
| ScratchRegs[RegARM32::val] = scratch; |
| REGARM32_TABLE; |
| #undef X |
| @@ -368,7 +374,7 @@ IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const { |
| (void)Ty; |
| static const char *RegNames[] = { |
| #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ |
| - isFP32, isFP64, isVec128) \ |
| + isFP32, isFP64, isVec128, alias_init) \ |
| name, |
| REGARM32_TABLE |
| #undef X |
| @@ -467,15 +473,22 @@ bool TargetARM32::CallingConv::FPInReg(Type Ty, int32_t *Reg) { |
| return false; |
| if (isVectorType(Ty)) { |
| 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; |
| // If this bumps us past the boundary, don't allocate to a register |
| // and leave any previously speculatively consumed registers as consumed. |
| if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS) |
| return false; |
| } 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); |
| - *Reg = RegARM32::Reg_d0 + (NumFPRegUnits / 2); |
| + *Reg = RegARM32::Reg_d0 - (NumFPRegUnits / 2); |
| NumFPRegUnits += 2; |
| // If this bumps us past the boundary, don't allocate to a register |
| // and leave any previously speculatively consumed registers as consumed. |
| @@ -1152,7 +1165,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
| llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
| #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ |
| - isFP32, isFP64, isVec128) \ |
| + isFP32, isFP64, isVec128, alias_init) \ |
| if (scratch && (Include & RegSet_CallerSave)) \ |
| Registers[RegARM32::val] = true; \ |
| if (preserved && (Include & RegSet_CalleeSave)) \ |