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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1554203002: Subzero. ARM32. Adds an IsGPR attribute to the register tables. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: 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
« no previous file with comments | « src/IceRegistersARM32.def ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 InstructionSet = static_cast<ARM32InstructionSet>( 175 InstructionSet = static_cast<ARM32InstructionSet>(
176 (Flags.getTargetInstructionSet() - 176 (Flags.getTargetInstructionSet() -
177 TargetInstructionSet::ARM32InstructionSet_Begin) + 177 TargetInstructionSet::ARM32InstructionSet_Begin) +
178 ARM32InstructionSet::Begin); 178 ARM32InstructionSet::Begin);
179 } 179 }
180 } 180 }
181 181
182 namespace { 182 namespace {
183 constexpr SizeT NumGPRArgs = 183 constexpr SizeT NumGPRArgs =
184 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 184 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
185 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 185 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
186 +(((cc_arg) > 0) ? 1 : 0) 186 +(((cc_arg) > 0) ? 1 : 0)
187 REGARM32_GPR_TABLE 187 REGARM32_GPR_TABLE
188 #undef X 188 #undef X
189 ; 189 ;
190 std::array<uint32_t, NumGPRArgs> GPRArgInitializer; 190 std::array<uint32_t, NumGPRArgs> GPRArgInitializer;
191 191
192 constexpr SizeT NumI64Args = 192 constexpr SizeT NumI64Args =
193 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 193 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
194 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 194 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
195 +(((cc_arg) > 0) ? 1 : 0) 195 +(((cc_arg) > 0) ? 1 : 0)
196 REGARM32_I64PAIR_TABLE 196 REGARM32_I64PAIR_TABLE
197 #undef X 197 #undef X
198 ; 198 ;
199 std::array<uint32_t, NumI64Args> I64ArgInitializer; 199 std::array<uint32_t, NumI64Args> I64ArgInitializer;
200 200
201 constexpr SizeT NumFP32Args = 201 constexpr SizeT NumFP32Args =
202 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 202 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
203 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 203 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
204 +(((cc_arg) > 0) ? 1 : 0) 204 +(((cc_arg) > 0) ? 1 : 0)
205 REGARM32_FP32_TABLE 205 REGARM32_FP32_TABLE
206 #undef X 206 #undef X
207 ; 207 ;
208 std::array<uint32_t, NumFP32Args> FP32ArgInitializer; 208 std::array<uint32_t, NumFP32Args> FP32ArgInitializer;
209 209
210 constexpr SizeT NumFP64Args = 210 constexpr SizeT NumFP64Args =
211 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 211 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
212 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 212 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
213 +(((cc_arg) > 0) ? 1 : 0) 213 +(((cc_arg) > 0) ? 1 : 0)
214 REGARM32_FP64_TABLE 214 REGARM32_FP64_TABLE
215 #undef X 215 #undef X
216 ; 216 ;
217 std::array<uint32_t, NumFP64Args> FP64ArgInitializer; 217 std::array<uint32_t, NumFP64Args> FP64ArgInitializer;
218 218
219 constexpr SizeT NumVec128Args = 219 constexpr SizeT NumVec128Args =
220 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 220 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
221 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 221 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
222 +(((cc_arg > 0)) ? 1 : 0) 222 +(((cc_arg > 0)) ? 1 : 0)
223 REGARM32_VEC128_TABLE 223 REGARM32_VEC128_TABLE
224 #undef X 224 #undef X
225 ; 225 ;
226 std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; 226 std::array<uint32_t, NumVec128Args> Vec128ArgInitializer;
227 } // end of anonymous namespace 227 } // end of anonymous namespace
228 228
229 TargetARM32::TargetARM32(Cfg *Func) 229 TargetARM32::TargetARM32(Cfg *Func)
230 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), 230 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()),
231 CPUFeatures(Func->getContext()->getFlags()) {} 231 CPUFeatures(Func->getContext()->getFlags()) {}
232 232
233 void TargetARM32::staticInit() { 233 void TargetARM32::staticInit() {
234 // Limit this size (or do all bitsets need to be the same width)??? 234 // Limit this size (or do all bitsets need to be the same width)???
235 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); 235 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM);
236 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); 236 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM);
237 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); 237 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM);
238 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); 238 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM);
239 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); 239 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM);
240 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); 240 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
241 ScratchRegs.resize(RegARM32::Reg_NUM); 241 ScratchRegs.resize(RegARM32::Reg_NUM);
242 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 242 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
243 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 243 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
244 IntegerRegisters[RegARM32::val] = isInt; \ 244 IntegerRegisters[RegARM32::val] = isInt; \
245 I64PairRegisters[RegARM32::val] = isI64Pair; \ 245 I64PairRegisters[RegARM32::val] = isI64Pair; \
246 Float32Registers[RegARM32::val] = isFP32; \ 246 Float32Registers[RegARM32::val] = isFP32; \
247 Float64Registers[RegARM32::val] = isFP64; \ 247 Float64Registers[RegARM32::val] = isFP64; \
248 VectorRegisters[RegARM32::val] = isVec128; \ 248 VectorRegisters[RegARM32::val] = isVec128; \
249 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ 249 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
250 for (SizeT RegAlias : alias_init) { \ 250 for (SizeT RegAlias : alias_init) { \
251 assert((!RegisterAliases[RegARM32::val][RegAlias] || \ 251 assert((!RegisterAliases[RegARM32::val][RegAlias] || \
252 RegAlias != RegARM32::val) && \ 252 RegAlias != RegARM32::val) && \
253 "Duplicate alias for " #val); \ 253 "Duplicate alias for " #val); \
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 822
823 bool TargetARM32::doBranchOpt(Inst *I, const CfgNode *NextNode) { 823 bool TargetARM32::doBranchOpt(Inst *I, const CfgNode *NextNode) {
824 if (auto *Br = llvm::dyn_cast<InstARM32Br>(I)) { 824 if (auto *Br = llvm::dyn_cast<InstARM32Br>(I)) {
825 return Br->optimizeBranch(NextNode); 825 return Br->optimizeBranch(NextNode);
826 } 826 }
827 return false; 827 return false;
828 } 828 }
829 829
830 const char *RegARM32::RegNames[] = { 830 const char *RegARM32::RegNames[] = {
831 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 831 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
832 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 832 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
833 name, 833 name,
834 REGARM32_TABLE 834 REGARM32_TABLE
835 #undef X 835 #undef X
836 }; 836 };
837 837
838 IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const { 838 IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const {
839 assert(RegNum < RegARM32::Reg_NUM); 839 assert(RegNum < RegARM32::Reg_NUM);
840 (void)Ty; 840 (void)Ty;
841 return RegARM32::RegNames[RegNum]; 841 return RegARM32::RegNames[RegNum];
842 } 842 }
843 843
844 Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) { 844 Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) {
845 static const Type DefaultType[] = { 845 static const Type DefaultType[] = {
846 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 846 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
847 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 847 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
848 (isFP32) \ 848 (isFP32) \
849 ? IceType_f32 \ 849 ? IceType_f32 \
850 : ((isFP64) ? IceType_f64 : ((isVec128 ? IceType_v4i32 : IceType_i32))), 850 : ((isFP64) ? IceType_f64 : ((isVec128 ? IceType_v4i32 : IceType_i32))),
851 REGARM32_TABLE 851 REGARM32_TABLE
852 #undef X 852 #undef X
853 }; 853 };
854 854
855 assert(RegNum < RegARM32::Reg_NUM); 855 assert(RegNum < RegARM32::Reg_NUM);
856 if (Ty == IceType_void) { 856 if (Ty == IceType_void) {
857 assert(RegNum < llvm::array_lengthof(DefaultType)); 857 assert(RegNum < llvm::array_lengthof(DefaultType));
(...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after
1828 } 1828 }
1829 llvm::report_fatal_error("Unsupported operand type"); 1829 llvm::report_fatal_error("Unsupported operand type");
1830 return nullptr; 1830 return nullptr;
1831 } 1831 }
1832 1832
1833 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, 1833 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include,
1834 RegSetMask Exclude) const { 1834 RegSetMask Exclude) const {
1835 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); 1835 llvm::SmallBitVector Registers(RegARM32::Reg_NUM);
1836 1836
1837 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ 1837 #define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \
1838 isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ 1838 isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \
1839 if (scratch && (Include & RegSet_CallerSave)) \ 1839 if (scratch && (Include & RegSet_CallerSave)) \
1840 Registers[RegARM32::val] = true; \ 1840 Registers[RegARM32::val] = true; \
1841 if (preserved && (Include & RegSet_CalleeSave)) \ 1841 if (preserved && (Include & RegSet_CalleeSave)) \
1842 Registers[RegARM32::val] = true; \ 1842 Registers[RegARM32::val] = true; \
1843 if (stackptr && (Include & RegSet_StackPointer)) \ 1843 if (stackptr && (Include & RegSet_StackPointer)) \
1844 Registers[RegARM32::val] = true; \ 1844 Registers[RegARM32::val] = true; \
1845 if (frameptr && (Include & RegSet_FramePointer)) \ 1845 if (frameptr && (Include & RegSet_FramePointer)) \
1846 Registers[RegARM32::val] = true; \ 1846 Registers[RegARM32::val] = true; \
1847 if (scratch && (Exclude & RegSet_CallerSave)) \ 1847 if (scratch && (Exclude & RegSet_CallerSave)) \
1848 Registers[RegARM32::val] = false; \ 1848 Registers[RegARM32::val] = false; \
(...skipping 4594 matching lines...) Expand 10 before | Expand all | Expand 10 after
6443 // However, for compatibility with current NaCl LLVM, don't claim that. 6443 // However, for compatibility with current NaCl LLVM, don't claim that.
6444 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 6444 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
6445 } 6445 }
6446 6446
6447 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; 6447 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM];
6448 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; 6448 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM];
6449 llvm::SmallBitVector TargetARM32::ScratchRegs; 6449 llvm::SmallBitVector TargetARM32::ScratchRegs;
6450 6450
6451 } // end of namespace ARM32 6451 } // end of namespace ARM32
6452 } // end of namespace Ice 6452 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceRegistersARM32.def ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698