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 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 } // end of anonymous namespace | 232 } // end of anonymous namespace |
233 | 233 |
234 TargetARM32::TargetARM32(Cfg *Func) | 234 TargetARM32::TargetARM32(Cfg *Func) |
235 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), | 235 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), |
236 CPUFeatures(Func->getContext()->getFlags()) {} | 236 CPUFeatures(Func->getContext()->getFlags()) {} |
237 | 237 |
238 void TargetARM32::staticInit(const ClFlags &Flags) { | 238 void TargetARM32::staticInit(GlobalContext *Ctx) { |
239 (void)Flags; | 239 |
240 // Limit this size (or do all bitsets need to be the same width)??? | 240 // Limit this size (or do all bitsets need to be the same width)??? |
241 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); | 241 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); |
242 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); | 242 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); |
243 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); | 243 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); |
244 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); | 244 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); |
245 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); | 245 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); |
246 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); | 246 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); |
247 ScratchRegs.resize(RegARM32::Reg_NUM); | 247 ScratchRegs.resize(RegARM32::Reg_NUM); |
248 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { | 248 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
249 const auto &Entry = RegARM32::Table[i]; | 249 const auto &Entry = RegARM32::Table[i]; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
282 TypeToRegisterSet[IceType_i64] = I64PairRegisters; | 282 TypeToRegisterSet[IceType_i64] = I64PairRegisters; |
283 TypeToRegisterSet[IceType_f32] = Float32Registers; | 283 TypeToRegisterSet[IceType_f32] = Float32Registers; |
284 TypeToRegisterSet[IceType_f64] = Float64Registers; | 284 TypeToRegisterSet[IceType_f64] = Float64Registers; |
285 TypeToRegisterSet[IceType_v4i1] = VectorRegisters; | 285 TypeToRegisterSet[IceType_v4i1] = VectorRegisters; |
286 TypeToRegisterSet[IceType_v8i1] = VectorRegisters; | 286 TypeToRegisterSet[IceType_v8i1] = VectorRegisters; |
287 TypeToRegisterSet[IceType_v16i1] = VectorRegisters; | 287 TypeToRegisterSet[IceType_v16i1] = VectorRegisters; |
288 TypeToRegisterSet[IceType_v16i8] = VectorRegisters; | 288 TypeToRegisterSet[IceType_v16i8] = VectorRegisters; |
289 TypeToRegisterSet[IceType_v8i16] = VectorRegisters; | 289 TypeToRegisterSet[IceType_v8i16] = VectorRegisters; |
290 TypeToRegisterSet[IceType_v4i32] = VectorRegisters; | 290 TypeToRegisterSet[IceType_v4i32] = VectorRegisters; |
291 TypeToRegisterSet[IceType_v4f32] = VectorRegisters; | 291 TypeToRegisterSet[IceType_v4f32] = VectorRegisters; |
292 | |
293 filterTypeToRegisterSet(Ctx, RegARM32::Reg_NUM, TypeToRegisterSet, | |
294 RCARM32_NUM, [](int32_t RegNum) -> IceString { | |
295 IceString Name = RegARM32::getRegName(RegNum); | |
296 IceString RegSeparator(", "); | |
John
2016/01/14 21:12:49
this could be a
const IceString RegSeparator = ",
Karl
2016/01/14 22:00:53
Used 'constexpr const RegSeparator[] = ", "' and t
| |
297 for (size_t Pos = Name.find(RegSeparator); | |
298 Pos != std::string::npos; | |
299 Pos = Name.find(RegSeparator)) { | |
300 Name.replace(Pos, RegSeparator.size(), ":"); | |
301 } | |
302 return Name; | |
303 }); | |
292 } | 304 } |
293 | 305 |
294 namespace { | 306 namespace { |
295 void copyRegAllocFromInfWeightVariable64On32(const VarList &Vars) { | 307 void copyRegAllocFromInfWeightVariable64On32(const VarList &Vars) { |
296 for (Variable *Var : Vars) { | 308 for (Variable *Var : Vars) { |
297 auto *Var64 = llvm::dyn_cast<Variable64On32>(Var); | 309 auto *Var64 = llvm::dyn_cast<Variable64On32>(Var); |
298 if (!Var64) { | 310 if (!Var64) { |
299 // This is not the variable we are looking for. | 311 // This is not the variable we are looking for. |
300 continue; | 312 continue; |
301 } | 313 } |
(...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1825 } | 1837 } |
1826 } | 1838 } |
1827 llvm::report_fatal_error("Unsupported operand type"); | 1839 llvm::report_fatal_error("Unsupported operand type"); |
1828 return nullptr; | 1840 return nullptr; |
1829 } | 1841 } |
1830 | 1842 |
1831 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, | 1843 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
1832 RegSetMask Exclude) const { | 1844 RegSetMask Exclude) const { |
1833 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); | 1845 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
1834 | 1846 |
1835 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { | 1847 for (SizeT i = 0; i < RegARM32::Reg_NUM; ++i) { |
1836 const auto &Entry = RegARM32::Table[i]; | 1848 const auto &Entry = RegARM32::Table[i]; |
1837 if (Entry.Scratch && (Include & RegSet_CallerSave)) | 1849 if (Entry.Scratch && (Include & RegSet_CallerSave)) |
1838 Registers[i] = true; | 1850 Registers[i] = true; |
1839 if (Entry.Preserved && (Include & RegSet_CalleeSave)) | 1851 if (Entry.Preserved && (Include & RegSet_CalleeSave)) |
1840 Registers[i] = true; | 1852 Registers[i] = true; |
1841 if (Entry.StackPtr && (Include & RegSet_StackPointer)) | 1853 if (Entry.StackPtr && (Include & RegSet_StackPointer)) |
1842 Registers[i] = true; | 1854 Registers[i] = true; |
1843 if (Entry.FramePtr && (Include & RegSet_FramePointer)) | 1855 if (Entry.FramePtr && (Include & RegSet_FramePointer)) |
1844 Registers[i] = true; | 1856 Registers[i] = true; |
1845 if (Entry.Scratch && (Exclude & RegSet_CallerSave)) | 1857 if (Entry.Scratch && (Exclude & RegSet_CallerSave)) |
(...skipping 4603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6449 // However, for compatibility with current NaCl LLVM, don't claim that. | 6461 // However, for compatibility with current NaCl LLVM, don't claim that. |
6450 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; | 6462 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; |
6451 } | 6463 } |
6452 | 6464 |
6453 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; | 6465 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; |
6454 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; | 6466 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; |
6455 llvm::SmallBitVector TargetARM32::ScratchRegs; | 6467 llvm::SmallBitVector TargetARM32::ScratchRegs; |
6456 | 6468 |
6457 } // end of namespace ARM32 | 6469 } // end of namespace ARM32 |
6458 } // end of namespace Ice | 6470 } // end of namespace Ice |
OLD | NEW |