Subzero. ARM32. Materializes the register table.
This CL modifies the ARM32 backend so that the REGARM32_TABLE is only
expanded once (to initialize a constexpr array.) This change decreased
the backend size in roughly ~80k.
BUG= https://code.google.com/p/nativeclient/issues/detail?id=4076
R=kschimpf@google.com
Review URL: https://codereview.chromium.org/1554263002 .
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index abda21d..551fed3 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -56,6 +56,9 @@
namespace Ice {
namespace ARM32 {
+// Defines the RegARM32::Table table with register information.
+constexpr RegARM32::TableType RegARM32::Table[];
+
namespace {
// The following table summarizes the logic for lowering the icmp instruction
@@ -239,35 +242,35 @@
llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM);
llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
ScratchRegs.resize(RegARM32::Reg_NUM);
-#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
- isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
- IntegerRegisters[RegARM32::val] = isInt; \
- I64PairRegisters[RegARM32::val] = isI64Pair; \
- Float32Registers[RegARM32::val] = isFP32; \
- Float64Registers[RegARM32::val] = isFP64; \
- VectorRegisters[RegARM32::val] = isVec128; \
- RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
- for (SizeT RegAlias : alias_init) { \
- assert((!RegisterAliases[RegARM32::val][RegAlias] || \
- RegAlias != RegARM32::val) && \
- "Duplicate alias for " #val); \
- RegisterAliases[RegARM32::val].set(RegAlias); \
- } \
- RegisterAliases[RegARM32::val].set(RegARM32::val); \
- ScratchRegs[RegARM32::val] = scratch; \
- if ((isInt) && (cc_arg) > 0) { \
- GPRArgInitializer[(cc_arg)-1] = RegARM32::val; \
- } else if ((isI64Pair) && (cc_arg) > 0) { \
- I64ArgInitializer[(cc_arg)-1] = RegARM32::val; \
- } else if ((isFP32) && (cc_arg) > 0) { \
- FP32ArgInitializer[(cc_arg)-1] = RegARM32::val; \
- } else if ((isFP64) && (cc_arg) > 0) { \
- FP64ArgInitializer[(cc_arg)-1] = RegARM32::val; \
- } else if ((isVec128) && (cc_arg) > 0) { \
- Vec128ArgInitializer[(cc_arg)-1] = RegARM32::val; \
+ for (int i = 0; i < RegARM32::Reg_NUM; ++i) {
+ const auto &Entry = RegARM32::Table[i];
+ IntegerRegisters[i] = Entry.IsInt;
+ I64PairRegisters[i] = Entry.IsI64Pair;
+ Float32Registers[i] = Entry.IsFP32;
+ Float64Registers[i] = Entry.IsFP64;
+ VectorRegisters[i] = Entry.IsVec128;
+ ScratchRegs[i] = Entry.Scratch;
+ RegisterAliases[i].resize(RegARM32::Reg_NUM);
+ for (int j = 0; j < Entry.NumAliases; ++j) {
+ assert(i == j || !RegisterAliases[i][Entry.Aliases[j]]);
+ RegisterAliases[i].set(Entry.Aliases[j]);
+ }
+ assert(RegisterAliases[i][i]);
+ if (Entry.CCArg <= 0) {
+ continue;
+ }
+ if (Entry.IsGPR) {
+ GPRArgInitializer[Entry.CCArg - 1] = i;
+ } else if (Entry.IsI64Pair) {
+ I64ArgInitializer[Entry.CCArg - 1] = i;
+ } else if (Entry.IsFP32) {
+ FP32ArgInitializer[Entry.CCArg - 1] = i;
+ } else if (Entry.IsFP64) {
+ FP64ArgInitializer[Entry.CCArg - 1] = i;
+ } else if (Entry.IsVec128) {
+ Vec128ArgInitializer[Entry.CCArg - 1] = i;
+ }
}
- REGARM32_TABLE;
-#undef X
TypeToRegisterSet[IceType_void] = InvalidRegisters;
TypeToRegisterSet[IceType_i1] = IntegerRegisters;
TypeToRegisterSet[IceType_i8] = IntegerRegisters;
@@ -827,18 +830,10 @@
return false;
}
-const char *RegARM32::RegNames[] = {
-#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
- isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
- name,
- REGARM32_TABLE
-#undef X
-};
-
IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const {
assert(RegNum < RegARM32::Reg_NUM);
(void)Ty;
- return RegARM32::RegNames[RegNum];
+ return RegARM32::getRegName(RegNum);
}
Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) {
@@ -1834,28 +1829,25 @@
RegSetMask Exclude) const {
llvm::SmallBitVector Registers(RegARM32::Reg_NUM);
-#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
- isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
- if (scratch && (Include & RegSet_CallerSave)) \
- Registers[RegARM32::val] = true; \
- if (preserved && (Include & RegSet_CalleeSave)) \
- Registers[RegARM32::val] = true; \
- if (stackptr && (Include & RegSet_StackPointer)) \
- Registers[RegARM32::val] = true; \
- if (frameptr && (Include & RegSet_FramePointer)) \
- Registers[RegARM32::val] = true; \
- if (scratch && (Exclude & RegSet_CallerSave)) \
- Registers[RegARM32::val] = false; \
- if (preserved && (Exclude & RegSet_CalleeSave)) \
- Registers[RegARM32::val] = false; \
- if (stackptr && (Exclude & RegSet_StackPointer)) \
- Registers[RegARM32::val] = false; \
- if (frameptr && (Exclude & RegSet_FramePointer)) \
- Registers[RegARM32::val] = false;
-
- REGARM32_TABLE
-
-#undef X
+ for (int i = 0; i < RegARM32::Reg_NUM; ++i) {
+ const auto &Entry = RegARM32::Table[i];
+ if (Entry.Scratch && (Include & RegSet_CallerSave))
+ Registers[i] = true;
+ if (Entry.Preserved && (Include & RegSet_CalleeSave))
+ Registers[i] = true;
+ if (Entry.StackPtr && (Include & RegSet_StackPointer))
+ Registers[i] = true;
+ if (Entry.FramePtr && (Include & RegSet_FramePointer))
+ Registers[i] = true;
+ if (Entry.Scratch && (Exclude & RegSet_CallerSave))
+ Registers[i] = false;
+ if (Entry.Preserved && (Exclude & RegSet_CalleeSave))
+ Registers[i] = false;
+ if (Entry.StackPtr && (Exclude & RegSet_StackPointer))
+ Registers[i] = false;
+ if (Entry.FramePtr && (Exclude & RegSet_FramePointer))
+ Registers[i] = false;
+ }
return Registers;
}