79 : STI(ST), XLen(STI.getXLen()), sXLen(
LLT::scalar(XLen)) {
131 auto BoolVecTys = {nxv1s1, nxv2s1, nxv4s1, nxv8s1, nxv16s1, nxv32s1, nxv64s1};
133 auto IntOrFPVecTys = {nxv1s8, nxv2s8, nxv4s8, nxv8s8, nxv16s8, nxv32s8,
134 nxv64s8, nxv1s16, nxv2s16, nxv4s16, nxv8s16, nxv16s16,
135 nxv32s16, nxv1s32, nxv2s32, nxv4s32, nxv8s32, nxv16s32,
136 nxv1s64, nxv2s64, nxv4s64, nxv8s64};
138 auto PtrVecTys = {nxv1p0, nxv2p0, nxv4p0, nxv8p0, nxv16p0};
154 {G_UADDE, G_UADDO, G_USUBE, G_USUBO, G_READ_REGISTER, G_WRITE_REGISTER})
163 {G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT, G_SSHLSAT, G_USHLSAT})
167 .legalFor({{sXLen, sXLen}})
168 .customFor(ST.is64Bit(), {{s32, s32}})
169 .widenScalarToNextPow2(0)
173 getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT})
174 .legalFor({{s32, s16}})
175 .legalFor(
ST.is64Bit(), {{s64, s16}, {s64, s32}})
181 getActionDefinitionsBuilder(G_TRUNC).
alwaysLegal();
186 if (STI.hasStdExtZbb())
187 ValidSextInRegWidth =
190 getActionDefinitionsBuilder(G_SEXT_INREG)
191 .legalIf(
all(
typeIs(0, sXLen), ValidSextInRegWidth))
192 .clampScalar(0, sXLen, sXLen)
197 for (
unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) {
198 auto &MergeUnmergeActions = getActionDefinitionsBuilder(
Op);
199 unsigned BigTyIdx =
Op == G_MERGE_VALUES ? 0 : 1;
200 unsigned LitTyIdx =
Op == G_MERGE_VALUES ? 1 : 0;
201 if (XLen == 32 &&
ST.hasStdExtD()) {
202 MergeUnmergeActions.legalIf(
205 MergeUnmergeActions.widenScalarToNextPow2(LitTyIdx, XLen)
206 .widenScalarToNextPow2(BigTyIdx, XLen)
207 .clampScalar(LitTyIdx, sXLen, sXLen)
208 .clampScalar(BigTyIdx, sXLen, sXLen);
211 getActionDefinitionsBuilder({G_FSHL, G_FSHR}).lower();
213 getActionDefinitionsBuilder({G_ROTR, G_ROTL})
214 .legalFor(
ST.hasStdExtZbb() ||
ST.hasStdExtZbkb(), {{sXLen, sXLen}})
215 .customFor(
ST.is64Bit() && (
ST.hasStdExtZbb() ||
ST.hasStdExtZbkb()),
219 getActionDefinitionsBuilder(G_BITREVERSE)
220 .customFor(
ST.hasStdExtZbkb(), {s8})
224 getActionDefinitionsBuilder(G_BITCAST).legalIf(
230 auto &BSWAPActions = getActionDefinitionsBuilder(G_BSWAP);
231 if (
ST.hasStdExtZbb() ||
ST.hasStdExtZbkb())
232 BSWAPActions.legalFor({sXLen}).clampScalar(0, sXLen, sXLen);
234 BSWAPActions.maxScalar(0, sXLen).lower();
236 getActionDefinitionsBuilder(G_CLMUL)
237 .legalFor(
ST.hasStdExtZbkc(), {sXLen})
240 getActionDefinitionsBuilder(G_CLMULH)
241 .legalFor(
ST.hasStdExtZbkc(), {sXLen})
242 .customFor(
ST.is64Bit() &&
ST.hasStdExtZbkc(), {s32})
245 auto &CountZerosActions = getActionDefinitionsBuilder({G_CTLZ, G_CTTZ});
246 auto &CountZerosPoisonActions =
247 getActionDefinitionsBuilder({G_CTLZ_ZERO_POISON, G_CTTZ_ZERO_POISON});
248 if (
ST.hasStdExtZbb()) {
249 CountZerosActions.legalFor({{sXLen, sXLen}})
250 .customFor({{s32, s32}})
251 .clampScalar(0, s32, sXLen)
252 .widenScalarToNextPow2(0)
253 .scalarSameSizeAs(1, 0);
255 CountZerosActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
256 CountZerosPoisonActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0);
258 CountZerosPoisonActions.lower();
260 auto &CountSignActions = getActionDefinitionsBuilder(G_CTLS);
261 if (
ST.hasStdExtP()) {
262 CountSignActions.legalFor({{sXLen, sXLen}})
263 .customFor({{s32, s32}})
264 .clampScalar(0, s32, sXLen)
265 .widenScalarToNextPow2(0)
266 .scalarSameSizeAs(1, 0);
268 CountSignActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
271 auto &CTPOPActions = getActionDefinitionsBuilder(G_CTPOP);
272 if (
ST.hasStdExtZbb()) {
273 CTPOPActions.legalFor({{sXLen, sXLen}})
274 .clampScalar(0, sXLen, sXLen)
275 .scalarSameSizeAs(1, 0);
277 CTPOPActions.widenScalarToNextPow2(0, 8)
278 .clampScalar(0, s8, sXLen)
279 .scalarSameSizeAs(1, 0)
283 getActionDefinitionsBuilder(G_CONSTANT)
285 .legalFor(!
ST.is64Bit(), {s32})
286 .customFor(
ST.is64Bit(), {s64})
287 .widenScalarToNextPow2(0)
288 .clampScalar(0, sXLen, sXLen);
291 getActionDefinitionsBuilder(G_FREEZE)
292 .legalFor({s16, s32, p0})
293 .legalFor(
ST.is64Bit(), {s64})
296 .widenScalarToNextPow2(0)
297 .clampScalar(0, s16, sXLen);
301 getActionDefinitionsBuilder(
302 {G_IMPLICIT_DEF, G_CONSTANT_FOLD_BARRIER})
303 .legalFor({s32, sXLen, p0})
306 .widenScalarToNextPow2(0)
307 .clampScalar(0, s32, sXLen);
309 getActionDefinitionsBuilder(G_ICMP)
310 .legalFor({{sXLen, sXLen}, {sXLen, p0}})
313 .widenScalarOrEltToNextPow2OrMinSize(1, 8)
314 .clampScalar(1, sXLen, sXLen)
315 .clampScalar(0, sXLen, sXLen);
317 getActionDefinitionsBuilder(G_SELECT)
318 .legalFor({{s32, sXLen}, {p0, sXLen}})
321 .legalFor(XLen == 64 ||
ST.hasStdExtD(), {{s64, sXLen}})
322 .widenScalarToNextPow2(0)
323 .clampScalar(0, s32, (XLen == 64 ||
ST.hasStdExtD()) ? s64 : s32)
324 .clampScalar(1, sXLen, sXLen);
326 auto &LoadActions = getActionDefinitionsBuilder(G_LOAD);
327 auto &StoreActions = getActionDefinitionsBuilder(G_STORE);
328 auto &ExtLoadActions = getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD});
333 auto getScalarMemAlign = [&
ST](
unsigned Size) {
334 return ST.enableUnalignedScalarMem() ? 8 :
Size;
337 LoadActions.legalForTypesWithMemDesc(
338 {{s16, p0, s8, getScalarMemAlign(8)},
339 {s32, p0, s8, getScalarMemAlign(8)},
340 {s16, p0, s16, getScalarMemAlign(16)},
341 {s32, p0, s16, getScalarMemAlign(16)},
342 {s32, p0, s32, getScalarMemAlign(32)},
343 {p0, p0, sXLen, getScalarMemAlign(XLen)}});
344 StoreActions.legalForTypesWithMemDesc(
345 {{s16, p0, s8, getScalarMemAlign(8)},
346 {s32, p0, s8, getScalarMemAlign(8)},
347 {s16, p0, s16, getScalarMemAlign(16)},
348 {s32, p0, s16, getScalarMemAlign(16)},
349 {s32, p0, s32, getScalarMemAlign(32)},
350 {p0, p0, sXLen, getScalarMemAlign(XLen)}});
351 ExtLoadActions.legalForTypesWithMemDesc(
352 {{sXLen, p0, s8, getScalarMemAlign(8)},
353 {sXLen, p0, s16, getScalarMemAlign(16)}});
355 LoadActions.legalForTypesWithMemDesc(
356 {{s64, p0, s8, getScalarMemAlign(8)},
357 {s64, p0, s16, getScalarMemAlign(16)},
358 {s64, p0, s32, getScalarMemAlign(32)},
359 {s64, p0, s64, getScalarMemAlign(64)}});
360 StoreActions.legalForTypesWithMemDesc(
361 {{s64, p0, s8, getScalarMemAlign(8)},
362 {s64, p0, s16, getScalarMemAlign(16)},
363 {s64, p0, s32, getScalarMemAlign(32)},
364 {s64, p0, s64, getScalarMemAlign(64)}});
365 ExtLoadActions.legalForTypesWithMemDesc(
366 {{s64, p0, s32, getScalarMemAlign(32)}});
367 }
else if (
ST.hasStdExtD()) {
368 LoadActions.legalForTypesWithMemDesc(
369 {{s64, p0, s64, getScalarMemAlign(64)}});
370 StoreActions.legalForTypesWithMemDesc(
371 {{s64, p0, s64, getScalarMemAlign(64)}});
375 if (
ST.hasVInstructions()) {
376 LoadActions.legalForTypesWithMemDesc({{nxv2s8, p0, nxv2s8, 8},
377 {nxv4s8, p0, nxv4s8, 8},
378 {nxv8s8, p0, nxv8s8, 8},
379 {nxv16s8, p0, nxv16s8, 8},
380 {nxv32s8, p0, nxv32s8, 8},
381 {nxv64s8, p0, nxv64s8, 8},
382 {nxv2s16, p0, nxv2s16, 16},
383 {nxv4s16, p0, nxv4s16, 16},
384 {nxv8s16, p0, nxv8s16, 16},
385 {nxv16s16, p0, nxv16s16, 16},
386 {nxv32s16, p0, nxv32s16, 16},
387 {nxv2s32, p0, nxv2s32, 32},
388 {nxv4s32, p0, nxv4s32, 32},
389 {nxv8s32, p0, nxv8s32, 32},
390 {nxv16s32, p0, nxv16s32, 32}});
391 StoreActions.legalForTypesWithMemDesc({{nxv2s8, p0, nxv2s8, 8},
392 {nxv4s8, p0, nxv4s8, 8},
393 {nxv8s8, p0, nxv8s8, 8},
394 {nxv16s8, p0, nxv16s8, 8},
395 {nxv32s8, p0, nxv32s8, 8},
396 {nxv64s8, p0, nxv64s8, 8},
397 {nxv2s16, p0, nxv2s16, 16},
398 {nxv4s16, p0, nxv4s16, 16},
399 {nxv8s16, p0, nxv8s16, 16},
400 {nxv16s16, p0, nxv16s16, 16},
401 {nxv32s16, p0, nxv32s16, 16},
402 {nxv2s32, p0, nxv2s32, 32},
403 {nxv4s32, p0, nxv4s32, 32},
404 {nxv8s32, p0, nxv8s32, 32},
405 {nxv16s32, p0, nxv16s32, 32}});
407 if (
ST.getELen() == 64) {
408 LoadActions.legalForTypesWithMemDesc({{nxv1s8, p0, nxv1s8, 8},
409 {nxv1s16, p0, nxv1s16, 16},
410 {nxv1s32, p0, nxv1s32, 32}});
411 StoreActions.legalForTypesWithMemDesc({{nxv1s8, p0, nxv1s8, 8},
412 {nxv1s16, p0, nxv1s16, 16},
413 {nxv1s32, p0, nxv1s32, 32}});
416 if (
ST.hasVInstructionsI64()) {
417 LoadActions.legalForTypesWithMemDesc({{nxv1s64, p0, nxv1s64, 64},
418 {nxv2s64, p0, nxv2s64, 64},
419 {nxv4s64, p0, nxv4s64, 64},
420 {nxv8s64, p0, nxv8s64, 64}});
421 StoreActions.legalForTypesWithMemDesc({{nxv1s64, p0, nxv1s64, 64},
422 {nxv2s64, p0, nxv2s64, 64},
423 {nxv4s64, p0, nxv4s64, 64},
424 {nxv8s64, p0, nxv8s64, 64}});
433 if (XLen <=
ST.getELen()) {
439 LoadActions.widenScalarToNextPow2(0, 8)
440 .lowerIfMemSizeNotByteSizePow2()
441 .clampScalar(0, s16, sXLen)
444 .clampScalar(0, s16, sXLen)
445 .lowerIfMemSizeNotByteSizePow2()
448 ExtLoadActions.widenScalarToNextPow2(0).clampScalar(0, sXLen, sXLen).lower();
450 getActionDefinitionsBuilder({G_PTR_ADD, G_PTRMASK}).legalFor({{p0, sXLen}});
452 getActionDefinitionsBuilder(G_PTRTOINT)
453 .legalFor({{sXLen, p0}})
454 .clampScalar(0, sXLen, sXLen);
456 getActionDefinitionsBuilder(G_INTTOPTR)
457 .legalFor({{p0, sXLen}})
458 .clampScalar(1, sXLen, sXLen);
460 getActionDefinitionsBuilder(G_BR).alwaysLegal();
462 getActionDefinitionsBuilder(G_BRCOND).legalFor({sXLen}).minScalar(0, sXLen);
464 getActionDefinitionsBuilder(G_BRJT).customFor({{p0, sXLen}});
466 getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0});
468 getActionDefinitionsBuilder(G_PHI)
469 .legalFor({p0, s32, sXLen})
470 .widenScalarToNextPow2(0)
471 .clampScalar(0, s32, sXLen);
473 getActionDefinitionsBuilder({G_GLOBAL_VALUE, G_JUMP_TABLE, G_CONSTANT_POOL})
476 if (
ST.hasStdExtZmmul()) {
477 getActionDefinitionsBuilder(G_MUL)
479 .widenScalarToNextPow2(0)
480 .clampScalar(0, sXLen, sXLen);
483 getActionDefinitionsBuilder({G_SMULH, G_UMULH})
488 getActionDefinitionsBuilder({G_SMULO, G_UMULO}).minScalar(0, sXLen).lower();
490 getActionDefinitionsBuilder(G_MUL)
491 .libcallFor({sXLen, sDoubleXLen})
492 .widenScalarToNextPow2(0)
493 .clampScalar(0, sXLen, sDoubleXLen);
495 getActionDefinitionsBuilder({G_SMULH, G_UMULH}).lowerFor({sXLen});
497 getActionDefinitionsBuilder({G_SMULO, G_UMULO})
502 .widenScalarIf(
typeIs(0, sXLen),
507 if (
ST.hasStdExtM()) {
508 getActionDefinitionsBuilder({G_SDIV, G_UDIV, G_UREM})
511 .libcallFor({sDoubleXLen})
512 .clampScalar(0, s32, sDoubleXLen)
513 .widenScalarToNextPow2(0);
514 getActionDefinitionsBuilder(G_SREM)
516 .libcallFor({sDoubleXLen})
517 .clampScalar(0, sXLen, sDoubleXLen)
518 .widenScalarToNextPow2(0);
520 getActionDefinitionsBuilder({G_UDIV, G_SDIV, G_UREM, G_SREM})
521 .libcallFor({sXLen, sDoubleXLen})
522 .clampScalar(0, sXLen, sDoubleXLen)
523 .widenScalarToNextPow2(0);
527 getActionDefinitionsBuilder({G_SDIVREM, G_UDIVREM}).lower();
529 getActionDefinitionsBuilder(G_ABS)
530 .customFor(
ST.hasStdExtZbb(), {sXLen})
531 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
534 getActionDefinitionsBuilder({G_ABDS, G_ABDU})
535 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
538 getActionDefinitionsBuilder({G_UMAX, G_UMIN, G_SMAX, G_SMIN})
539 .legalFor(
ST.hasStdExtZbb(), {sXLen})
540 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
543 getActionDefinitionsBuilder({G_SCMP, G_UCMP}).lower();
545 getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0});
547 getActionDefinitionsBuilder({G_MEMCPY, G_MEMMOVE, G_MEMSET}).
libcall();
549 getActionDefinitionsBuilder({G_MEMCPY_INLINE, G_MEMSET_INLINE}).lower();
551 getActionDefinitionsBuilder({G_DYN_STACKALLOC, G_STACKSAVE, G_STACKRESTORE})
557 getActionDefinitionsBuilder({G_READCYCLECOUNTER, G_READSTEADYCOUNTER})
558 .legalFor(
ST.is64Bit(), {s64})
559 .customFor(!
ST.is64Bit(), {s64});
564 getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FSQRT,
565 G_FMAXNUM, G_FMINNUM, G_FMAXIMUMNUM,
567 .legalFor(
ST.hasStdExtF(), {s32})
568 .legalFor(
ST.hasStdExtD(), {s64})
569 .legalFor(
ST.hasStdExtZfh(), {s16})
570 .libcallFor({s32, s64})
571 .libcallFor(
ST.is64Bit(), {s128});
573 getActionDefinitionsBuilder({G_FNEG, G_FABS})
574 .legalFor(
ST.hasStdExtF(), {s32})
575 .legalFor(
ST.hasStdExtD(), {s64})
576 .legalFor(
ST.hasStdExtZfh(), {s16})
577 .lowerFor({s32, s64, s128});
579 getActionDefinitionsBuilder(G_FREM)
580 .libcallFor({s32, s64})
581 .libcallFor(
ST.is64Bit(), {s128})
585 getActionDefinitionsBuilder(G_FCOPYSIGN)
586 .legalFor(
ST.hasStdExtF(), {{s32, s32}})
587 .legalFor(
ST.hasStdExtD(), {{s64, s64}, {s32, s64}, {s64, s32}})
588 .legalFor(
ST.hasStdExtZfh(), {{s16, s16}, {s16, s32}, {s32, s16}})
589 .legalFor(
ST.hasStdExtZfh() &&
ST.hasStdExtD(), {{s16, s64}, {s64, s16}})
593 getActionDefinitionsBuilder(G_FPTRUNC)
594 .legalFor(
ST.hasStdExtD(), {{s32, s64}})
595 .legalFor(
ST.hasStdExtZfh(), {{s16, s32}})
596 .legalFor(
ST.hasStdExtZfh() &&
ST.hasStdExtD(), {{s16, s64}})
597 .libcallFor({{s32, s64}})
598 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}});
599 getActionDefinitionsBuilder(G_FPEXT)
600 .legalFor(
ST.hasStdExtD(), {{s64, s32}})
601 .legalFor(
ST.hasStdExtZfh(), {{s32, s16}})
602 .legalFor(
ST.hasStdExtZfh() &&
ST.hasStdExtD(), {{s64, s16}})
603 .libcallFor({{s64, s32}})
604 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}});
606 getActionDefinitionsBuilder(G_FCMP)
607 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
608 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
609 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
610 .clampScalar(0, sXLen, sXLen)
611 .libcallFor({{sXLen, s32}, {sXLen, s64}})
612 .libcallFor(
ST.is64Bit(), {{sXLen, s128}});
615 getActionDefinitionsBuilder(G_IS_FPCLASS)
616 .customFor(
ST.hasStdExtF(), {{s1, s32}})
617 .customFor(
ST.hasStdExtD(), {{s1, s64}})
618 .customFor(
ST.hasStdExtZfh(), {{s1, s16}})
621 getActionDefinitionsBuilder(G_FCONSTANT)
622 .legalFor(
ST.hasStdExtF(), {s32})
623 .legalFor(
ST.hasStdExtD(), {s64})
624 .legalFor(
ST.hasStdExtZfh(), {s16})
625 .customFor(!
ST.is64Bit(), {s32})
626 .customFor(
ST.is64Bit(), {s32, s64})
627 .lowerFor({s64, s128});
629 getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
630 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
631 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
632 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
633 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
634 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
635 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
636 .widenScalarToNextPow2(0)
638 .libcallFor({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
639 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}})
640 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}, {s128, s128}});
642 getActionDefinitionsBuilder({G_LROUND, G_LLROUND})
643 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
644 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
645 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
646 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
647 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
648 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
650 .libcallFor({{s32, s32},
657 getActionDefinitionsBuilder({G_INTRINSIC_LRINT, G_INTRINSIC_LLRINT})
658 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
659 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
660 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
663 .libcallFor({{s32, s32},
670 getActionDefinitionsBuilder({G_SITOFP, G_UITOFP})
671 .legalFor(
ST.hasStdExtF(), {{s32, sXLen}})
672 .legalFor(
ST.hasStdExtD(), {{s64, sXLen}})
673 .legalFor(
ST.hasStdExtZfh(), {{s16, sXLen}})
674 .widenScalarToNextPow2(1)
678 return Query.
Types[0].isScalar() && Query.
Types[1].isScalar() &&
679 (Query.
Types[1].getSizeInBits() <
ST.getXLen()) &&
680 ((
ST.hasStdExtF() && Query.
Types[0].getSizeInBits() == 32) ||
681 (
ST.hasStdExtD() && Query.
Types[0].getSizeInBits() == 64) ||
682 (
ST.hasStdExtZfh() &&
683 Query.
Types[0].getSizeInBits() == 16));
688 .libcallFor({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
689 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}})
690 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}, {s128, s128}});
693 getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR, G_FRINT, G_FNEARBYINT,
694 G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND,
695 G_INTRINSIC_ROUNDEVEN})
696 .legalFor(
ST.hasStdExtZfa(), {s32})
697 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtD(), {s64})
698 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtZfh(), {s16})
699 .libcallFor({s32, s64})
700 .libcallFor(
ST.is64Bit(), {s128});
702 getActionDefinitionsBuilder({G_FMAXIMUM, G_FMINIMUM})
703 .legalFor(
ST.hasStdExtZfa(), {s32})
704 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtD(), {s64})
705 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtZfh(), {s16});
707 getActionDefinitionsBuilder({G_FCOS, G_FSIN, G_FTAN, G_FPOW, G_FLOG, G_FLOG2,
708 G_FLOG10, G_FEXP, G_FEXP2, G_FEXP10, G_FACOS,
709 G_FASIN, G_FATAN, G_FATAN2, G_FCOSH, G_FSINH,
711 .libcallFor({s32, s64})
712 .libcallFor(
ST.is64Bit(), {s128});
713 getActionDefinitionsBuilder({G_FPOWI, G_FLDEXP})
714 .libcallFor({{s32, s32}, {s64, s32}})
715 .libcallFor(
ST.is64Bit(), {s128, s32});
717 getActionDefinitionsBuilder(G_FCANONICALIZE)
718 .legalFor(
ST.hasStdExtF(), {s32})
719 .legalFor(
ST.hasStdExtD(), {s64})
720 .legalFor(
ST.hasStdExtZfh(), {s16});
722 getActionDefinitionsBuilder(G_VASTART).customFor({p0});
726 getActionDefinitionsBuilder(G_VAARG)
729 .clampScalar(0, sXLen, sXLen)
730 .lowerForCartesianProduct({sXLen, p0}, {p0});
732 getActionDefinitionsBuilder(G_VSCALE)
733 .clampScalar(0, sXLen, sXLen)
737 getActionDefinitionsBuilder(G_SPLAT_VECTOR)
749 if (
ST.hasVInstructionsF64() &&
ST.hasStdExtD())
750 SplatActions.legalIf(
all(
752 else if (
ST.hasVInstructionsI64())
753 SplatActions.customIf(
all(
757 SplatActions.clampScalar(1, sXLen, sXLen);
766 getActionDefinitionsBuilder(G_EXTRACT_SUBVECTOR)
775 Query.
Types[0].getElementCount().divideCoefficientBy(8), 8);
776 return std::pair(0, CastTy);
784 getActionDefinitionsBuilder(G_INSERT_SUBVECTOR)
790 getActionDefinitionsBuilder(G_ATOMIC_CMPXCHG_WITH_SUCCESS)
793 getActionDefinitionsBuilder({G_ATOMIC_CMPXCHG, G_ATOMICRMW_ADD,
794 G_ATOMICRMW_XCHG, G_ATOMICRMW_AND,
795 G_ATOMICRMW_OR, G_ATOMICRMW_XOR})
796 .legalFor(
ST.hasStdExtA(), {{sXLen, p0}})
797 .libcallFor(!
ST.hasStdExtA(), {{s8, p0}, {s16, p0}, {s32, p0}, {s64, p0}})
798 .clampScalar(0, sXLen, sXLen);
800 getActionDefinitionsBuilder(G_ATOMICRMW_SUB)
801 .libcallFor(!
ST.hasStdExtA(), {{s8, p0}, {s16, p0}, {s32, p0}, {s64, p0}})
802 .clampScalar(0, sXLen, sXLen)
805 getActionDefinitionsBuilder(
806 {G_ATOMICRMW_MAX, G_ATOMICRMW_MIN, G_ATOMICRMW_UMAX, G_ATOMICRMW_UMIN})
807 .legalFor(
ST.hasStdExtA(), {{sXLen, p0}})
808 .clampScalar(0, sXLen, sXLen)
811 getActionDefinitionsBuilder(G_PREFETCH).legalIf(
typeIs(0, p0));
819 getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT)
821 InsertVectorEltPred,
typeIs(2, sXLen)))
825 getActionDefinitionsBuilder({G_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS})
828 getActionDefinitionsBuilder(G_FENCE).alwaysLegal();
830 getActionDefinitionsBuilder({G_TRAP, G_DEBUGTRAP, G_UBSANTRAP}).alwaysLegal();