Index: src/IceTargetLoweringARM32.cpp |
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
index 878f95ec059fbcf5c1e186cd4ff77b8d003cc0ad..7ccbc8718477fa4e956549da7f7c6eab1013288a 100644 |
--- a/src/IceTargetLoweringARM32.cpp |
+++ b/src/IceTargetLoweringARM32.cpp |
@@ -50,8 +50,8 @@ createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
return ::Ice::ARM32::TargetHeaderARM32::create(Ctx); |
} |
-void staticInit(const ::Ice::ClFlags &Flags) { |
- ::Ice::ARM32::TargetARM32::staticInit(Flags); |
+void staticInit(::Ice::GlobalContext *Ctx) { |
+ ::Ice::ARM32::TargetARM32::staticInit(Ctx); |
} |
} // end of namespace ARM32 |
@@ -229,14 +229,30 @@ constexpr SizeT NumVec128Args = |
#undef X |
; |
std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; |
+ |
+static IceString RegNameSeparator(", "); |
+ |
} // end of anonymous namespace |
+llvm::SmallBitVector TargetARM32::RegisterSetMask(RegARM32::Reg_NUM); |
+ |
TargetARM32::TargetARM32(Cfg *Func) |
: TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), |
CPUFeatures(Func->getContext()->getFlags()) {} |
-void TargetARM32::staticInit(const ClFlags &Flags) { |
- (void)Flags; |
+void TargetARM32::staticInit(GlobalContext *Ctx) { |
+ RegisterSetMask = getRegisterSetMask( |
+ Ctx, RegARM32::Reg_NUM, RegARM32::Num_RegClasses, |
+ [](int32_t RegNum) -> SizeT { return RegARM32::getRegClass(RegNum); }, |
+ [](int32_t RegNum) -> IceString { |
+ std::string Name = RegARM32::getRegName(RegNum); |
+ for (size_t Pos = Name.find(RegNameSeparator); Pos != std::string::npos; |
+ Pos = Name.find(RegNameSeparator)) { |
+ Name.replace(Pos, RegNameSeparator.size(), ":"); |
+ } |
+ return Name; |
+ }); |
+ |
// Limit this size (or do all bitsets need to be the same width)??? |
llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); |
llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); |
@@ -1832,7 +1848,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
RegSetMask Exclude) const { |
llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
- for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
+ for (SizeT i = 0; i < RegARM32::Reg_NUM; ++i) { |
const auto &Entry = RegARM32::Table[i]; |
if (Entry.Scratch && (Include & RegSet_CallerSave)) |
Registers[i] = true; |
@@ -1852,6 +1868,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
Registers[i] = false; |
} |
+ Registers &= RegisterSetMask; |
return Registers; |
} |