| 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |