48 if (ST.isThumb1Only()) {
50 verify(*ST.getInstrInfo());
56 .legalFor(ST.hasFPRegs(), {{s64, s64}})
57 .maxScalar(0, ST.hasFPRegs() ? i64 : i32);
59 getActionDefinitionsBuilder(G_MERGE_VALUES).
legalFor({{s64, s32}});
60 getActionDefinitionsBuilder(G_UNMERGE_VALUES).
legalFor({{s32, s64}});
62 getActionDefinitionsBuilder({G_SEXT, G_ZEXT, G_ANYEXT})
63 .legalForCartesianProduct({s8, s16, s32}, {s1, s8, s16});
68 getActionDefinitionsBuilder(G_SEXT_INREG).
lower();
70 getActionDefinitionsBuilder({G_MUL, G_AND, G_OR, G_XOR})
72 .clampScalar(0, s32, s32);
75 getActionDefinitionsBuilder({G_ADD, G_SUB})
79 getActionDefinitionsBuilder({G_ADD, G_SUB})
83 getActionDefinitionsBuilder({G_ASHR, G_LSHR, G_SHL})
84 .legalFor({{s32, s32}})
86 .clampScalar(1, s32, s32);
88 bool HasHWDivide = (!
ST.isThumb() &&
ST.hasDivideInARMMode()) ||
89 (
ST.isThumb() &&
ST.hasDivideInThumbMode());
91 getActionDefinitionsBuilder({G_SDIV, G_UDIV})
93 .clampScalar(0, s32, s32);
95 getActionDefinitionsBuilder({G_SDIV, G_UDIV})
97 .clampScalar(0, s32, s32);
100 getActionDefinitionsBuilder({G_SREM, G_UREM}).minScalar(0, s32);
102 REMBuilder.lowerFor({s32});
104 REMBuilder.customFor({s32});
106 REMBuilder.libcallFor({s32});
108 getActionDefinitionsBuilder(G_INTTOPTR)
109 .legalFor({{p0, s32}})
111 getActionDefinitionsBuilder(G_PTRTOINT)
112 .legalFor({{s32, p0}})
115 getActionDefinitionsBuilder(G_CONSTANT)
116 .customFor({s32, p0})
117 .clampScalar(0, s32, s32);
119 getActionDefinitionsBuilder(G_CONSTANT_POOL).legalFor({p0});
121 getActionDefinitionsBuilder(G_ICMP)
122 .legalForCartesianProduct({s1}, {s32, p0})
125 getActionDefinitionsBuilder(G_SELECT)
126 .legalForCartesianProduct({s32, p0}, {s1})
131 auto &LoadStoreBuilder = getActionDefinitionsBuilder({G_LOAD, G_STORE})
132 .legalForTypesWithMemDesc({{s8, p0, s8, 8},
136 .unsupportedIfMemSizeNotPow2();
138 getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0});
139 getActionDefinitionsBuilder(G_GLOBAL_VALUE).legalFor({p0});
142 getActionDefinitionsBuilder(G_PHI)
146 getActionDefinitionsBuilder(G_PTR_ADD)
147 .legalFor({{p0, i32}})
150 getActionDefinitionsBuilder(G_BR).alwaysLegal();
151 getActionDefinitionsBuilder(G_BRCOND).legalFor({s1});
153 if (!
ST.useSoftFloat() &&
ST.hasVFP2Base()) {
154 getActionDefinitionsBuilder(
155 {G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FCONSTANT, G_FNEG})
156 .legalFor({f32, f64});
159 .legalForTypesWithMemDesc({{s64, p0, s64, 32}})
161 PhiBuilder.legalFor({s64});
163 getActionDefinitionsBuilder(G_FCMP).legalForCartesianProduct({s1},
166 getActionDefinitionsBuilder(G_FPEXT).legalFor({{f64, f32}});
167 getActionDefinitionsBuilder(G_FPTRUNC).legalFor({{f32, f64}});
169 getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
170 .legalForCartesianProduct({i32}, {f32, f64});
171 getActionDefinitionsBuilder({G_SITOFP, G_UITOFP})
172 .legalForCartesianProduct({f32, f64}, {i32});
174 getActionDefinitionsBuilder({G_GET_FPENV, G_SET_FPENV, G_GET_FPMODE})
176 getActionDefinitionsBuilder(G_RESET_FPENV).alwaysLegal();
177 getActionDefinitionsBuilder(G_SET_FPMODE).customFor({s32});
178 getActionDefinitionsBuilder(G_RESET_FPMODE).custom();
180 getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV})
181 .libcallFor({f32, f64});
183 LoadStoreBuilder.maxScalar(0, s32);
185 getActionDefinitionsBuilder(G_FNEG).lowerFor({s32, s64});
187 getActionDefinitionsBuilder(G_FCONSTANT).lowerFor({s32, s64});
189 getActionDefinitionsBuilder(G_FCMP).customForCartesianProduct({s1},
193 setFCmpLibcallsAEABI();
195 setFCmpLibcallsGNU();
197 getActionDefinitionsBuilder(G_FPEXT).libcallFor({{f64, f32}});
198 getActionDefinitionsBuilder(G_FPTRUNC).libcallFor({{f32, f64}});
200 getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
201 .libcallForCartesianProduct({i32}, {f32, f64});
202 getActionDefinitionsBuilder({G_SITOFP, G_UITOFP})
203 .libcallForCartesianProduct({f32, f64}, {i32});
205 getActionDefinitionsBuilder({G_GET_FPENV, G_SET_FPENV, G_RESET_FPENV})
207 getActionDefinitionsBuilder({G_GET_FPMODE, G_SET_FPMODE, G_RESET_FPMODE})
212 LoadStoreBuilder.lower();
214 if (!
ST.useSoftFloat() &&
ST.hasVFP4Base())
215 getActionDefinitionsBuilder(G_FMA).legalFor({f32, f64});
217 getActionDefinitionsBuilder(G_FMA).libcallFor({f32, f64});
219 getActionDefinitionsBuilder({G_FREM, G_FPOW}).libcallFor({f32, f64});
221 if (
ST.hasV5TOps() && !
ST.isThumb1Only()) {
222 getActionDefinitionsBuilder(G_CTLZ)
223 .legalFor({s32, s32})
224 .clampScalar(1, s32, s32)
225 .clampScalar(0, s32, s32);
226 getActionDefinitionsBuilder(G_CTLZ_ZERO_POISON)
227 .lowerFor({s32, s32})
228 .clampScalar(1, s32, s32)
229 .clampScalar(0, s32, s32);
231 getActionDefinitionsBuilder(G_CTLZ_ZERO_POISON)
232 .libcallFor({s32, s32})
233 .clampScalar(1, s32, s32)
234 .clampScalar(0, s32, s32);
235 getActionDefinitionsBuilder(G_CTLZ)
236 .lowerFor({s32, s32})
237 .clampScalar(1, s32, s32)
238 .clampScalar(0, s32, s32);
385 switch (
MI.getOpcode()) {
390 Register OriginalResult =
MI.getOperand(0).getReg();
391 auto Size =
MRI.getType(OriginalResult).getSizeInBits();
396 MI.getOpcode() == G_SREM ? RTLIB::SDIVREM_I32 : RTLIB::UDIVREM_I32;
406 {{
MI.getOperand(1).getReg(), ArgTy, 0},
407 {
MI.getOperand(2).getReg(), ArgTy, 0}},
415 MRI.getType(
MI.getOperand(3).getReg()) &&
416 "Mismatched operands for G_FCMP");
417 auto OpSize =
MRI.getType(
MI.getOperand(2).getReg()).getSizeInBits();
419 auto OriginalResult =
MI.getOperand(0).getReg();
422 auto Libcalls = getFCmpLibcalls(Predicate, OpSize);
424 if (Libcalls.empty()) {
427 "Predicate needs libcalls, but none specified");
430 MI.eraseFromParent();
434 assert((OpSize == 32 || OpSize == 64) &&
"Unsupported operand size");
439 for (
auto Libcall : Libcalls) {
440 auto LibcallResult =
MRI.createGenericVirtualRegister(
LLT::integer(32));
443 {{MI.getOperand(2).getReg(), ArgTy, 0},
444 {MI.getOperand(3).getReg(), ArgTy, 0}},
450 auto ProcessedResult =
453 :
MRI.createGenericVirtualRegister(
MRI.getType(OriginalResult));
462 MIRBuilder.
buildTrunc(ProcessedResult, LibcallResult);
467 MIRBuilder.
buildICmp(ResultPred, ProcessedResult, LibcallResult,
Zero);
469 Results.push_back(ProcessedResult);
473 assert(
Results.size() == 2 &&
"Unexpected number of results");
488 auto FPEnv =
MRI.createGenericVirtualRegister(FPEnvTy);
492 auto StatusBits = MIRBuilder.
buildAnd(FPEnvTy, FPEnv, StatusBitMask);
493 auto NotStatusBitMask =
495 auto FPModeBits = MIRBuilder.
buildAnd(FPEnvTy, Modes, NotStatusBitMask);
496 auto NewFPSCR = MIRBuilder.
buildOr(FPEnvTy, StatusBits, FPModeBits);
500 case G_RESET_FPMODE: {
507 auto NewFPSCR = MIRBuilder.
buildAnd(FPEnvTy, FPEnv, NotModeBitMask);
513 MI.eraseFromParent();