| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// | 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 std::unique_ptr<::Ice::TargetDataLowering> | 43 std::unique_ptr<::Ice::TargetDataLowering> |
| 44 createTargetDataLowering(::Ice::GlobalContext *Ctx) { | 44 createTargetDataLowering(::Ice::GlobalContext *Ctx) { |
| 45 return ::Ice::ARM32::TargetDataARM32::create(Ctx); | 45 return ::Ice::ARM32::TargetDataARM32::create(Ctx); |
| 46 } | 46 } |
| 47 | 47 |
| 48 std::unique_ptr<::Ice::TargetHeaderLowering> | 48 std::unique_ptr<::Ice::TargetHeaderLowering> |
| 49 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { | 49 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
| 50 return ::Ice::ARM32::TargetHeaderARM32::create(Ctx); | 50 return ::Ice::ARM32::TargetHeaderARM32::create(Ctx); |
| 51 } | 51 } |
| 52 | 52 |
| 53 void staticInit(const ::Ice::ClFlags &Flags) { | 53 void staticInit(::Ice::GlobalContext *Ctx) { |
| 54 ::Ice::ARM32::TargetARM32::staticInit(Flags); | 54 ::Ice::ARM32::TargetARM32::staticInit(Ctx); |
| 55 } | 55 } |
| 56 } // end of namespace ARM32 | 56 } // end of namespace ARM32 |
| 57 | 57 |
| 58 namespace Ice { | 58 namespace Ice { |
| 59 namespace ARM32 { | 59 namespace ARM32 { |
| 60 | 60 |
| 61 // Defines the RegARM32::Table table with register information. | 61 // Defines the RegARM32::Table table with register information. |
| 62 constexpr RegARM32::TableType RegARM32::Table[]; | 62 constexpr RegARM32::TableType RegARM32::Table[]; |
| 63 | 63 |
| 64 namespace { | 64 namespace { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 std::array<uint32_t, NumFP64Args> FP64ArgInitializer; | 222 std::array<uint32_t, NumFP64Args> FP64ArgInitializer; |
| 223 | 223 |
| 224 constexpr SizeT NumVec128Args = | 224 constexpr SizeT NumVec128Args = |
| 225 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ | 225 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
| 226 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ | 226 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
| 227 +(((cc_arg > 0)) ? 1 : 0) | 227 +(((cc_arg > 0)) ? 1 : 0) |
| 228 REGARM32_VEC128_TABLE | 228 REGARM32_VEC128_TABLE |
| 229 #undef X | 229 #undef X |
| 230 ; | 230 ; |
| 231 std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; | 231 std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; |
| 232 |
| 233 static IceString RegNameSeparator(", "); |
| 234 |
| 232 } // end of anonymous namespace | 235 } // end of anonymous namespace |
| 233 | 236 |
| 237 llvm::SmallBitVector TargetARM32::RegisterSetMask(RegARM32::Reg_NUM); |
| 238 |
| 234 TargetARM32::TargetARM32(Cfg *Func) | 239 TargetARM32::TargetARM32(Cfg *Func) |
| 235 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), | 240 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), |
| 236 CPUFeatures(Func->getContext()->getFlags()) {} | 241 CPUFeatures(Func->getContext()->getFlags()) {} |
| 237 | 242 |
| 238 void TargetARM32::staticInit(const ClFlags &Flags) { | 243 void TargetARM32::staticInit(GlobalContext *Ctx) { |
| 239 (void)Flags; | 244 RegisterSetMask = getRegisterSetMask( |
| 245 Ctx, RegARM32::Reg_NUM, RegARM32::Num_RegClasses, |
| 246 [](int32_t RegNum) -> SizeT { return RegARM32::getRegClass(RegNum); }, |
| 247 [](int32_t RegNum) -> IceString { |
| 248 std::string Name = RegARM32::getRegName(RegNum); |
| 249 for (size_t Pos = Name.find(RegNameSeparator); Pos != std::string::npos; |
| 250 Pos = Name.find(RegNameSeparator)) { |
| 251 Name.replace(Pos, RegNameSeparator.size(), ":"); |
| 252 } |
| 253 return Name; |
| 254 }); |
| 255 |
| 240 // Limit this size (or do all bitsets need to be the same width)??? | 256 // Limit this size (or do all bitsets need to be the same width)??? |
| 241 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); | 257 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); |
| 242 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); | 258 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); |
| 243 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); | 259 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); |
| 244 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); | 260 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); |
| 245 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); | 261 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); |
| 246 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); | 262 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); |
| 247 ScratchRegs.resize(RegARM32::Reg_NUM); | 263 ScratchRegs.resize(RegARM32::Reg_NUM); |
| 248 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { | 264 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
| 249 const auto &Entry = RegARM32::Table[i]; | 265 const auto &Entry = RegARM32::Table[i]; |
| (...skipping 1575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1825 } | 1841 } |
| 1826 } | 1842 } |
| 1827 llvm::report_fatal_error("Unsupported operand type"); | 1843 llvm::report_fatal_error("Unsupported operand type"); |
| 1828 return nullptr; | 1844 return nullptr; |
| 1829 } | 1845 } |
| 1830 | 1846 |
| 1831 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, | 1847 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
| 1832 RegSetMask Exclude) const { | 1848 RegSetMask Exclude) const { |
| 1833 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); | 1849 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
| 1834 | 1850 |
| 1835 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { | 1851 for (SizeT i = 0; i < RegARM32::Reg_NUM; ++i) { |
| 1836 const auto &Entry = RegARM32::Table[i]; | 1852 const auto &Entry = RegARM32::Table[i]; |
| 1837 if (Entry.Scratch && (Include & RegSet_CallerSave)) | 1853 if (Entry.Scratch && (Include & RegSet_CallerSave)) |
| 1838 Registers[i] = true; | 1854 Registers[i] = true; |
| 1839 if (Entry.Preserved && (Include & RegSet_CalleeSave)) | 1855 if (Entry.Preserved && (Include & RegSet_CalleeSave)) |
| 1840 Registers[i] = true; | 1856 Registers[i] = true; |
| 1841 if (Entry.StackPtr && (Include & RegSet_StackPointer)) | 1857 if (Entry.StackPtr && (Include & RegSet_StackPointer)) |
| 1842 Registers[i] = true; | 1858 Registers[i] = true; |
| 1843 if (Entry.FramePtr && (Include & RegSet_FramePointer)) | 1859 if (Entry.FramePtr && (Include & RegSet_FramePointer)) |
| 1844 Registers[i] = true; | 1860 Registers[i] = true; |
| 1845 if (Entry.Scratch && (Exclude & RegSet_CallerSave)) | 1861 if (Entry.Scratch && (Exclude & RegSet_CallerSave)) |
| 1846 Registers[i] = false; | 1862 Registers[i] = false; |
| 1847 if (Entry.Preserved && (Exclude & RegSet_CalleeSave)) | 1863 if (Entry.Preserved && (Exclude & RegSet_CalleeSave)) |
| 1848 Registers[i] = false; | 1864 Registers[i] = false; |
| 1849 if (Entry.StackPtr && (Exclude & RegSet_StackPointer)) | 1865 if (Entry.StackPtr && (Exclude & RegSet_StackPointer)) |
| 1850 Registers[i] = false; | 1866 Registers[i] = false; |
| 1851 if (Entry.FramePtr && (Exclude & RegSet_FramePointer)) | 1867 if (Entry.FramePtr && (Exclude & RegSet_FramePointer)) |
| 1852 Registers[i] = false; | 1868 Registers[i] = false; |
| 1853 } | 1869 } |
| 1854 | 1870 |
| 1871 Registers &= RegisterSetMask; |
| 1855 return Registers; | 1872 return Registers; |
| 1856 } | 1873 } |
| 1857 | 1874 |
| 1858 void TargetARM32::lowerAlloca(const InstAlloca *Inst) { | 1875 void TargetARM32::lowerAlloca(const InstAlloca *Inst) { |
| 1859 // Conservatively require the stack to be aligned. Some stack adjustment | 1876 // Conservatively require the stack to be aligned. Some stack adjustment |
| 1860 // operations implemented below assume that the stack is aligned before the | 1877 // operations implemented below assume that the stack is aligned before the |
| 1861 // alloca. All the alloca code ensures that the stack alignment is preserved | 1878 // alloca. All the alloca code ensures that the stack alignment is preserved |
| 1862 // after the alloca. The stack alignment restriction can be relaxed in some | 1879 // after the alloca. The stack alignment restriction can be relaxed in some |
| 1863 // cases. | 1880 // cases. |
| 1864 NeedsStackAlignment = true; | 1881 NeedsStackAlignment = true; |
| (...skipping 4583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6448 // However, for compatibility with current NaCl LLVM, don't claim that. | 6465 // However, for compatibility with current NaCl LLVM, don't claim that. |
| 6449 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; | 6466 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; |
| 6450 } | 6467 } |
| 6451 | 6468 |
| 6452 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; | 6469 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; |
| 6453 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; | 6470 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; |
| 6454 llvm::SmallBitVector TargetARM32::ScratchRegs; | 6471 llvm::SmallBitVector TargetARM32::ScratchRegs; |
| 6455 | 6472 |
| 6456 } // end of namespace ARM32 | 6473 } // end of namespace ARM32 |
| 6457 } // end of namespace Ice | 6474 } // end of namespace Ice |
| OLD | NEW |