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

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: Fix nits. 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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698