Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(726)

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1571433004: Implements include/exclude register lists for translation. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Add CL tests. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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(
294 Ctx, RegARM32::Reg_NUM, TypeToRegisterSet, RCARM32_NUM,
295 [](int32_t RegNum) -> IceString {
296 IceString Name = RegARM32::getRegName(RegNum);
297 constexpr const char RegSeparator[] = ", ";
298 for (size_t Pos = Name.find(RegSeparator); Pos != std::string::npos;
299 Pos = Name.find(RegSeparator)) {
300 Name.replace(Pos, llvm::array_lengthof(RegSeparator), ":");
Jim Stichnoth 2016/01/15 00:50:56 I think something is wrong here, because it prints
Karl 2016/01/15 16:54:25 Yep. My mistake. I tried to be too intelligent whe
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698