Chromium Code Reviews| Index: src/IceTargetLoweringARM32.cpp |
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
| index 08e26078de5390a26a9e7bf6705311e552420d5d..f408c6e2fcb8d84208b38925ee434d16253322b2 100644 |
| --- a/src/IceTargetLoweringARM32.cpp |
| +++ b/src/IceTargetLoweringARM32.cpp |
| @@ -53,13 +53,55 @@ createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
| void staticInit(const ::Ice::ClFlags &Flags) { |
| ::Ice::ARM32::TargetARM32::staticInit(Flags); |
| } |
| + |
| } // end of namespace ARM32 |
| namespace Ice { |
| namespace ARM32 { |
| +namespace { |
| + |
| +/// SizeOf is used to obtain the size of an initializer list as a constexpr |
| +/// expression. This is only needed until our C++ library is updated to |
| +/// C++ 14 -- which defines constexpr members to std::initializer_list. |
| +class SizeOf { |
| + SizeOf(const SizeOf &) = delete; |
| + SizeOf &operator=(const SizeOf &) = delete; |
| + |
| +public: |
| + constexpr SizeOf() : Size(0) {} |
| + template <typename... T> |
| + explicit constexpr SizeOf(T...) |
| + : Size(__length<T...>::value) {} |
| + constexpr SizeT size() const { return Size; } |
| + |
| +private: |
| + template <typename T, typename... U> struct __length { |
| + static constexpr std::size_t value = 1 + __length<U...>::value; |
| + }; |
| + |
| + template <typename T> struct __length<T> { |
| + static constexpr std::size_t value = 1; |
| + }; |
| + |
| + const std::size_t Size; |
| +}; |
| + |
| +} // end of anonymous namespace |
| + |
| // Defines the RegARM32::Table table with register information. |
| -constexpr RegARM32::TableType RegARM32::Table[]; |
| +RegARM32::RegTableType RegARM32::RegTable[RegARM32::Reg_NUM] = { |
| +#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| + isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| + { \ |
| + name, encode, cc_arg, scratch, preserved, stackptr, frameptr, isGPR, \ |
| + isInt, isI64Pair, isFP32, isFP64, isVec128, \ |
| + (SizeOf alias_init).size(), alias_init \ |
|
Jim Stichnoth
2016/01/15 01:17:15
I assume this trailing backslash alignment will ge
Karl
2016/01/15 16:11:19
Done.
|
| + } \ |
| + , |
| + REGARM32_TABLE |
| +#undef X |
| +}; |
| namespace { |
| @@ -246,7 +288,7 @@ void TargetARM32::staticInit(const ClFlags &Flags) { |
| llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); |
| ScratchRegs.resize(RegARM32::Reg_NUM); |
| for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
| - const auto &Entry = RegARM32::Table[i]; |
| + const auto &Entry = RegARM32::RegTable[i]; |
| IntegerRegisters[i] = Entry.IsInt; |
| I64PairRegisters[i] = Entry.IsI64Pair; |
| Float32Registers[i] = Entry.IsFP32; |
| @@ -1833,7 +1875,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
| llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
| for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
| - const auto &Entry = RegARM32::Table[i]; |
| + const auto &Entry = RegARM32::RegTable[i]; |
| if (Entry.Scratch && (Include & RegSet_CallerSave)) |
| Registers[i] = true; |
| if (Entry.Preserved && (Include & RegSet_CalleeSave)) |