79 : STI(ST), XLen(STI.getXLen()), sXLen(
LLT::scalar(XLen)) {
132 auto BoolVecTys = {nxv1s1, nxv2s1, nxv4s1, nxv8s1, nxv16s1, nxv32s1, nxv64s1};
134 auto IntOrFPVecTys = {nxv1s8, nxv2s8, nxv4s8, nxv8s8, nxv16s8, nxv32s8,
135 nxv64s8, nxv1s16, nxv2s16, nxv4s16, nxv8s16, nxv16s16,
136 nxv32s16, nxv1s32, nxv2s32, nxv4s32, nxv8s32, nxv16s32,
137 nxv1s64, nxv2s64, nxv4s64, nxv8s64};
139 auto PtrVecTys = {nxv1p0, nxv2p0, nxv4p0, nxv8p0, nxv16p0};
155 {G_UADDE, G_UADDO, G_USUBE, G_USUBO, G_READ_REGISTER, G_WRITE_REGISTER})
164 {G_UADDSAT, G_SADDSAT, G_USUBSAT, G_SSUBSAT, G_SSHLSAT, G_USHLSAT})
168 .legalFor({{sXLen, sXLen}})
169 .customFor(ST.is64Bit(), {{s32, s32}})
170 .widenScalarToNextPow2(0)
174 getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT})
175 .legalFor({{s32, s16}})
176 .legalFor(
ST.is64Bit(), {{s64, s16}, {s64, s32}})
182 getActionDefinitionsBuilder(G_TRUNC).
alwaysLegal();
187 if (STI.hasStdExtZbb())
188 ValidSextInRegWidth =
191 getActionDefinitionsBuilder(G_SEXT_INREG)
192 .legalIf(
all(
typeIs(0, sXLen), ValidSextInRegWidth))
193 .clampScalar(0, sXLen, sXLen)
198 for (
unsigned Op : {G_MERGE_VALUES, G_UNMERGE_VALUES}) {
199 auto &MergeUnmergeActions = getActionDefinitionsBuilder(
Op);
200 unsigned BigTyIdx =
Op == G_MERGE_VALUES ? 0 : 1;
201 unsigned LitTyIdx =
Op == G_MERGE_VALUES ? 1 : 0;
202 if (XLen == 32 && (
ST.hasStdExtD() ||
ST.hasStdExtZilsd())) {
203 MergeUnmergeActions.legalIf(
206 MergeUnmergeActions.widenScalarToNextPow2(LitTyIdx, XLen)
207 .widenScalarToNextPow2(BigTyIdx, XLen)
208 .clampScalar(LitTyIdx, sXLen, sXLen)
209 .clampScalar(BigTyIdx, sXLen, sXLen);
212 getActionDefinitionsBuilder({G_FSHL, G_FSHR}).lower();
214 getActionDefinitionsBuilder({G_ROTR, G_ROTL})
215 .legalFor(
ST.hasStdExtZbb() ||
ST.hasStdExtZbkb(), {{sXLen, sXLen}})
216 .customFor(
ST.is64Bit() && (
ST.hasStdExtZbb() ||
ST.hasStdExtZbkb()),
220 getActionDefinitionsBuilder(G_BITREVERSE)
221 .customFor(
ST.hasStdExtZbkb(), {s8})
225 getActionDefinitionsBuilder(G_BITCAST).legalIf(
231 auto &BSWAPActions = getActionDefinitionsBuilder(G_BSWAP);
232 if (
ST.hasStdExtZbb() ||
ST.hasStdExtZbkb())
233 BSWAPActions.legalFor({sXLen}).clampScalar(0, sXLen, sXLen);
235 BSWAPActions.maxScalar(0, sXLen).lower();
237 getActionDefinitionsBuilder(G_CLMUL)
238 .legalFor(
ST.hasStdExtZbkc(), {sXLen})
241 getActionDefinitionsBuilder(G_CLMULH)
242 .legalFor(
ST.hasStdExtZbkc(), {sXLen})
243 .customFor(
ST.is64Bit() &&
ST.hasStdExtZbkc(), {s32})
247 getActionDefinitionsBuilder(G_CLMULR)
248 .legalFor(
ST.hasStdExtZbc(), {sXLen})
249 .customFor(
ST.is64Bit() &&
ST.hasStdExtZbc(), {s32})
252 auto &CTLZPoisonActions = getActionDefinitionsBuilder(G_CTLZ_ZERO_POISON);
253 auto &CTTZPoisonActions = getActionDefinitionsBuilder(G_CTTZ_ZERO_POISON);
254 if (
ST.hasStdExtZbb()) {
255 getActionDefinitionsBuilder({G_CTLZ, G_CTTZ})
256 .legalFor({{sXLen, sXLen}})
257 .customFor({{s32, s32}})
258 .clampScalar(0, s32, sXLen)
259 .widenScalarToNextPow2(0)
260 .scalarSameSizeAs(1, 0);
262 auto &CTLZActions = getActionDefinitionsBuilder(G_CTLZ);
263 if (
ST.hasVendorXTHeadBb())
264 CTLZActions.legalFor({{sXLen, sXLen}})
265 .clampScalar(0, sXLen, sXLen)
266 .scalarSameSizeAs(1, 0);
268 CTLZActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
270 getActionDefinitionsBuilder(G_CTTZ)
272 .scalarSameSizeAs(1, 0)
274 if (
ST.hasVendorXTHeadBb())
275 CTLZPoisonActions.clampScalar(0, sXLen, sXLen).scalarSameSizeAs(1, 0);
277 CTLZPoisonActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0);
278 CTTZPoisonActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0);
280 CTLZPoisonActions.lower();
281 CTTZPoisonActions.lower();
283 auto &CountSignActions = getActionDefinitionsBuilder(G_CTLS);
284 if (
ST.hasStdExtP()) {
285 CountSignActions.legalFor({{sXLen, sXLen}})
286 .customFor({{s32, s32}})
287 .clampScalar(0, s32, sXLen)
288 .widenScalarToNextPow2(0)
289 .scalarSameSizeAs(1, 0);
291 CountSignActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
294 auto &CTPOPActions = getActionDefinitionsBuilder(G_CTPOP);
295 if (
ST.hasStdExtZbb()) {
296 CTPOPActions.legalFor({{sXLen, sXLen}})
297 .clampScalar(0, sXLen, sXLen)
298 .scalarSameSizeAs(1, 0);
300 CTPOPActions.widenScalarToNextPow2(0, 8)
301 .clampScalar(0, s8, sXLen)
302 .scalarSameSizeAs(1, 0)
306 getActionDefinitionsBuilder(G_CONSTANT)
308 .legalFor(!
ST.is64Bit(), {s32})
309 .customFor(
ST.is64Bit(), {s64})
310 .widenScalarToNextPow2(0)
311 .clampScalar(0, sXLen, sXLen);
314 getActionDefinitionsBuilder(G_FREEZE)
315 .legalFor({s16, s32, p0})
316 .legalFor(
ST.is64Bit(), {s64})
319 .widenScalarToNextPow2(0)
320 .clampScalar(0, s16, sXLen);
324 getActionDefinitionsBuilder(
325 {G_IMPLICIT_DEF, G_CONSTANT_FOLD_BARRIER})
326 .legalFor({s32, sXLen, p0})
329 .widenScalarToNextPow2(0)
330 .clampScalar(0, s32, sXLen);
332 getActionDefinitionsBuilder(G_ICMP)
333 .legalFor({{sXLen, sXLen}, {sXLen, p0}})
336 .widenScalarOrEltToNextPow2OrMinSize(1, 8)
337 .clampScalar(1, sXLen, sXLen)
338 .clampScalar(0, sXLen, sXLen);
340 getActionDefinitionsBuilder(G_SELECT)
341 .legalFor({{s32, sXLen}, {p0, sXLen}})
344 .legalFor(XLen == 64 ||
ST.hasStdExtD(), {{s64, sXLen}})
345 .widenScalarToNextPow2(0)
346 .clampScalar(0, s32, (XLen == 64 ||
ST.hasStdExtD()) ? s64 : s32)
347 .clampScalar(1, sXLen, sXLen);
349 auto &LoadActions = getActionDefinitionsBuilder(G_LOAD);
350 auto &StoreActions = getActionDefinitionsBuilder(G_STORE);
351 auto &ExtLoadActions = getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD});
356 auto getScalarMemAlign = [&
ST](
unsigned Size) {
357 return ST.enableUnalignedScalarMem() ? 8 :
Size;
360 LoadActions.legalForTypesWithMemDesc(
361 {{s16, p0, s8, getScalarMemAlign(8)},
362 {s32, p0, s8, getScalarMemAlign(8)},
363 {s16, p0, s16, getScalarMemAlign(16)},
364 {s32, p0, s16, getScalarMemAlign(16)},
365 {s32, p0, s32, getScalarMemAlign(32)},
366 {p0, p0, sXLen, getScalarMemAlign(XLen)}});
367 StoreActions.legalForTypesWithMemDesc(
368 {{s16, p0, s8, getScalarMemAlign(8)},
369 {s32, p0, s8, getScalarMemAlign(8)},
370 {s16, p0, s16, getScalarMemAlign(16)},
371 {s32, p0, s16, getScalarMemAlign(16)},
372 {s32, p0, s32, getScalarMemAlign(32)},
373 {p0, p0, sXLen, getScalarMemAlign(XLen)}});
374 ExtLoadActions.legalForTypesWithMemDesc(
375 {{sXLen, p0, s8, getScalarMemAlign(8)},
376 {sXLen, p0, s16, getScalarMemAlign(16)}});
378 LoadActions.legalForTypesWithMemDesc(
379 {{s64, p0, s8, getScalarMemAlign(8)},
380 {s64, p0, s16, getScalarMemAlign(16)},
381 {s64, p0, s32, getScalarMemAlign(32)},
382 {s64, p0, s64, getScalarMemAlign(64)}});
383 StoreActions.legalForTypesWithMemDesc(
384 {{s64, p0, s8, getScalarMemAlign(8)},
385 {s64, p0, s16, getScalarMemAlign(16)},
386 {s64, p0, s32, getScalarMemAlign(32)},
387 {s64, p0, s64, getScalarMemAlign(64)}});
388 ExtLoadActions.legalForTypesWithMemDesc(
389 {{s64, p0, s32, getScalarMemAlign(32)}});
390 }
else if (
ST.hasStdExtD() ||
ST.hasStdExtZilsd()) {
396 LoadActions.legalForTypesWithMemDesc(
397 {{s64, p0, s64, getScalarMemAlign(64)}});
398 StoreActions.legalForTypesWithMemDesc(
399 {{s64, p0, s64, getScalarMemAlign(64)}});
403 if (
ST.hasVInstructions()) {
404 LoadActions.legalForTypesWithMemDesc({{nxv2s8, p0, nxv2s8, 8},
405 {nxv4s8, p0, nxv4s8, 8},
406 {nxv8s8, p0, nxv8s8, 8},
407 {nxv16s8, p0, nxv16s8, 8},
408 {nxv32s8, p0, nxv32s8, 8},
409 {nxv64s8, p0, nxv64s8, 8},
410 {nxv2s16, p0, nxv2s16, 16},
411 {nxv4s16, p0, nxv4s16, 16},
412 {nxv8s16, p0, nxv8s16, 16},
413 {nxv16s16, p0, nxv16s16, 16},
414 {nxv32s16, p0, nxv32s16, 16},
415 {nxv2s32, p0, nxv2s32, 32},
416 {nxv4s32, p0, nxv4s32, 32},
417 {nxv8s32, p0, nxv8s32, 32},
418 {nxv16s32, p0, nxv16s32, 32}});
419 StoreActions.legalForTypesWithMemDesc({{nxv2s8, p0, nxv2s8, 8},
420 {nxv4s8, p0, nxv4s8, 8},
421 {nxv8s8, p0, nxv8s8, 8},
422 {nxv16s8, p0, nxv16s8, 8},
423 {nxv32s8, p0, nxv32s8, 8},
424 {nxv64s8, p0, nxv64s8, 8},
425 {nxv2s16, p0, nxv2s16, 16},
426 {nxv4s16, p0, nxv4s16, 16},
427 {nxv8s16, p0, nxv8s16, 16},
428 {nxv16s16, p0, nxv16s16, 16},
429 {nxv32s16, p0, nxv32s16, 16},
430 {nxv2s32, p0, nxv2s32, 32},
431 {nxv4s32, p0, nxv4s32, 32},
432 {nxv8s32, p0, nxv8s32, 32},
433 {nxv16s32, p0, nxv16s32, 32}});
435 if (
ST.getELen() == 64) {
436 LoadActions.legalForTypesWithMemDesc({{nxv1s8, p0, nxv1s8, 8},
437 {nxv1s16, p0, nxv1s16, 16},
438 {nxv1s32, p0, nxv1s32, 32}});
439 StoreActions.legalForTypesWithMemDesc({{nxv1s8, p0, nxv1s8, 8},
440 {nxv1s16, p0, nxv1s16, 16},
441 {nxv1s32, p0, nxv1s32, 32}});
444 if (
ST.hasVInstructionsI64()) {
445 LoadActions.legalForTypesWithMemDesc({{nxv1s64, p0, nxv1s64, 64},
446 {nxv2s64, p0, nxv2s64, 64},
447 {nxv4s64, p0, nxv4s64, 64},
448 {nxv8s64, p0, nxv8s64, 64}});
449 StoreActions.legalForTypesWithMemDesc({{nxv1s64, p0, nxv1s64, 64},
450 {nxv2s64, p0, nxv2s64, 64},
451 {nxv4s64, p0, nxv4s64, 64},
452 {nxv8s64, p0, nxv8s64, 64}});
461 if (XLen <=
ST.getELen()) {
467 LoadActions.widenScalarToNextPow2(0, 8)
468 .lowerIfMemSizeNotByteSizePow2()
469 .clampScalar(0, s16, sXLen)
472 .clampScalar(0, s16, sXLen)
473 .lowerIfMemSizeNotByteSizePow2()
476 ExtLoadActions.widenScalarToNextPow2(0).clampScalar(0, sXLen, sXLen).lower();
478 getActionDefinitionsBuilder({G_PTR_ADD, G_PTRMASK}).legalFor({{p0, sXLen}});
480 getActionDefinitionsBuilder(G_PTRTOINT)
481 .legalFor({{sXLen, p0}})
482 .clampScalar(0, sXLen, sXLen);
484 getActionDefinitionsBuilder(G_INTTOPTR)
485 .legalFor({{p0, sXLen}})
486 .clampScalar(1, sXLen, sXLen);
488 getActionDefinitionsBuilder(G_BR).alwaysLegal();
490 getActionDefinitionsBuilder(G_BRCOND).legalFor({sXLen}).minScalar(0, sXLen);
492 getActionDefinitionsBuilder(G_BRJT).customFor({{p0, sXLen}});
494 getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0});
496 getActionDefinitionsBuilder(G_PHI)
497 .legalFor({p0, s32, sXLen})
498 .widenScalarToNextPow2(0)
499 .clampScalar(0, s32, sXLen);
501 getActionDefinitionsBuilder({G_GLOBAL_VALUE, G_JUMP_TABLE, G_CONSTANT_POOL})
504 if (
ST.hasStdExtZmmul()) {
505 getActionDefinitionsBuilder(G_MUL)
507 .widenScalarToNextPow2(0)
508 .clampScalar(0, sXLen, sXLen);
511 getActionDefinitionsBuilder({G_SMULH, G_UMULH})
516 getActionDefinitionsBuilder({G_SMULO, G_UMULO}).minScalar(0, sXLen).lower();
518 getActionDefinitionsBuilder(G_MUL)
519 .libcallFor({sXLen, sDoubleXLen})
520 .widenScalarToNextPow2(0)
521 .clampScalar(0, sXLen, sDoubleXLen);
523 getActionDefinitionsBuilder({G_SMULH, G_UMULH}).lowerFor({sXLen});
525 getActionDefinitionsBuilder({G_SMULO, G_UMULO})
530 .widenScalarIf(
typeIs(0, sXLen),
535 if (
ST.hasStdExtM()) {
536 getActionDefinitionsBuilder({G_SDIV, G_UDIV, G_UREM})
539 .libcallFor({sDoubleXLen})
540 .clampScalar(0, s32, sDoubleXLen)
541 .widenScalarToNextPow2(0);
542 getActionDefinitionsBuilder(G_SREM)
544 .libcallFor({sDoubleXLen})
545 .clampScalar(0, sXLen, sDoubleXLen)
546 .widenScalarToNextPow2(0);
548 getActionDefinitionsBuilder({G_UDIV, G_SDIV, G_UREM, G_SREM})
549 .libcallFor({sXLen, sDoubleXLen})
550 .clampScalar(0, sXLen, sDoubleXLen)
551 .widenScalarToNextPow2(0);
555 getActionDefinitionsBuilder({G_SDIVREM, G_UDIVREM}).lower();
557 getActionDefinitionsBuilder(G_ABS)
558 .customFor(
ST.hasStdExtZbb(), {sXLen})
559 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
562 getActionDefinitionsBuilder({G_ABDS, G_ABDU})
563 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
566 getActionDefinitionsBuilder({G_UMAX, G_UMIN, G_SMAX, G_SMIN})
567 .legalFor(
ST.hasStdExtZbb(), {sXLen})
568 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
571 getActionDefinitionsBuilder({G_SCMP, G_UCMP}).lower();
573 getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0});
575 getActionDefinitionsBuilder({G_MEMCPY, G_MEMMOVE, G_MEMSET}).
libcall();
577 getActionDefinitionsBuilder({G_MEMCPY_INLINE, G_MEMSET_INLINE}).lower();
579 getActionDefinitionsBuilder({G_DYN_STACKALLOC, G_STACKSAVE, G_STACKRESTORE})
585 getActionDefinitionsBuilder({G_READCYCLECOUNTER, G_READSTEADYCOUNTER})
586 .legalFor(
ST.is64Bit(), {s64})
587 .customFor(!
ST.is64Bit(), {s64});
592 getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FSQRT,
593 G_FMAXNUM, G_FMINNUM, G_FMAXIMUMNUM,
595 .legalFor(
ST.hasStdExtF(), {s32})
596 .legalFor(
ST.hasStdExtD(), {s64})
597 .legalFor(
ST.hasStdExtZfh(), {s16})
598 .libcallFor({s32, s64})
599 .libcallFor(
ST.is64Bit(), {s128});
601 getActionDefinitionsBuilder({G_FNEG, G_FABS})
602 .legalFor(
ST.hasStdExtF(), {s32})
603 .legalFor(
ST.hasStdExtD(), {s64})
604 .legalFor(
ST.hasStdExtZfh(), {s16})
605 .lowerFor({s32, s64, s128});
607 getActionDefinitionsBuilder(G_FREM)
608 .libcallFor({s32, s64})
609 .libcallFor(
ST.is64Bit(), {s128})
613 getActionDefinitionsBuilder(G_FCOPYSIGN)
614 .legalFor(
ST.hasStdExtF(), {{s32, s32}})
615 .legalFor(
ST.hasStdExtD(), {{s64, s64}, {s32, s64}, {s64, s32}})
616 .legalFor(
ST.hasStdExtZfh(), {{s16, s16}, {s16, s32}, {s32, s16}})
617 .legalFor(
ST.hasStdExtZfh() &&
ST.hasStdExtD(), {{s16, s64}, {s64, s16}})
620 getActionDefinitionsBuilder(G_FPTRUNC)
621 .legalFor(
ST.hasStdExtD(), {{s32, s64}})
622 .legalFor(
ST.hasStdExtZfhmin(), {{s16, s32}})
623 .legalFor(
ST.hasStdExtZfhmin() &&
ST.hasStdExtD(), {{s16, s64}})
624 .libcallFor({{s16, s32}, {s16, s64}, {s32, s64}})
625 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}});
626 getActionDefinitionsBuilder(G_FPEXT)
627 .legalFor(
ST.hasStdExtD(), {{s64, s32}})
628 .legalFor(
ST.hasStdExtZfhmin(), {{s32, s16}})
629 .legalFor(
ST.hasStdExtZfhmin() &&
ST.hasStdExtD(), {{s64, s16}})
630 .libcallFor(!
ST.hasStdExtZfhmin(), {{s32, s16}})
631 .libcallFor(!(
ST.hasStdExtZfhmin() &&
ST.hasStdExtD()), {{s64, s16}})
632 .libcallFor({{s64, s32}})
633 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}});
635 getActionDefinitionsBuilder(G_FCMP)
636 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
637 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
638 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
639 .clampScalar(0, sXLen, sXLen)
641 .libcallFor({{sXLen, s32}, {sXLen, s64}})
642 .libcallFor(
ST.is64Bit(), {{sXLen, s128}});
645 getActionDefinitionsBuilder(G_IS_FPCLASS)
646 .customFor(
ST.hasStdExtF(), {{s1, s32}})
647 .customFor(
ST.hasStdExtD(), {{s1, s64}})
648 .customFor(
ST.hasStdExtZfh(), {{s1, s16}})
651 getActionDefinitionsBuilder(G_FCONSTANT)
652 .legalFor(
ST.hasStdExtF(), {s32})
653 .legalFor(
ST.hasStdExtD(), {s64})
654 .legalFor(
ST.hasStdExtZfhmin(), {s16})
655 .lowerFor({s32, s64, s128});
657 getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
658 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
659 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
660 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
661 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
662 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
663 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
664 .widenScalarToNextPow2(0)
673 return Query.
Types[1] == f16 && !
ST.hasStdExtZfh() &&
674 (
ST.is64Bit() || Query.
Types[0] == s32);
677 .libcallFor(!
ST.hasStdExtZfhmin(), {{s64, f16}})
678 .narrowScalarFor({{s64, f16}},
changeTo(0, s32))
679 .libcallFor({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
680 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}})
681 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}, {s128, s128}});
688 getActionDefinitionsBuilder({G_FPTOSI_SAT, G_FPTOUI_SAT})
689 .customFor(
ST.hasStdExtF(), {{sXLen, s32}})
690 .customFor(
ST.hasStdExtD(), {{sXLen, s64}})
691 .customFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
692 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
693 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
694 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
700 getActionDefinitionsBuilder({G_LROUND, G_LLROUND})
701 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
702 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
703 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
704 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
705 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
706 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
708 .libcallFor({{s32, s32},
715 getActionDefinitionsBuilder({G_INTRINSIC_LRINT, G_INTRINSIC_LLRINT})
716 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
717 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
718 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
721 .libcallFor({{s32, s32},
728 getActionDefinitionsBuilder({G_SITOFP, G_UITOFP})
729 .legalFor(
ST.hasStdExtF(), {{s32, sXLen}})
730 .legalFor(
ST.hasStdExtD(), {{s64, sXLen}})
731 .legalFor(
ST.hasStdExtZfh(), {{s16, sXLen}})
732 .widenScalarToNextPow2(1)
736 return Query.
Types[0].isScalar() && Query.
Types[1].isScalar() &&
737 (Query.
Types[1].getSizeInBits() <
ST.getXLen()) &&
738 ((
ST.hasStdExtF() && Query.
Types[0].getSizeInBits() == 32) ||
739 (
ST.hasStdExtD() && Query.
Types[0].getSizeInBits() == 64) ||
740 (
ST.hasStdExtZfh() &&
741 Query.
Types[0].getSizeInBits() == 16));
746 .libcallFor({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
747 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}})
748 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}, {s128, s128}});
751 getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR, G_FRINT, G_FNEARBYINT,
752 G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND,
753 G_INTRINSIC_ROUNDEVEN})
754 .legalFor(
ST.hasStdExtZfa(), {s32})
755 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtD(), {s64})
756 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtZfh(), {s16})
757 .libcallFor({s32, s64})
758 .libcallFor(
ST.is64Bit(), {s128});
760 getActionDefinitionsBuilder({G_FMAXIMUM, G_FMINIMUM})
761 .legalFor(
ST.hasStdExtZfa(), {s32})
762 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtD(), {s64})
763 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtZfh(), {s16});
765 getActionDefinitionsBuilder({G_FCOS, G_FSIN, G_FTAN, G_FPOW, G_FLOG, G_FLOG2,
766 G_FLOG10, G_FEXP, G_FEXP2, G_FEXP10, G_FACOS,
767 G_FASIN, G_FATAN, G_FATAN2, G_FCOSH, G_FSINH,
768 G_FTANH, G_FMODF, G_FSINCOS})
769 .libcallFor({s32, s64})
770 .libcallFor(
ST.is64Bit(), {s128});
771 getActionDefinitionsBuilder({G_FPOWI, G_FLDEXP})
772 .libcallFor({{s32, s32}, {s64, s32}})
773 .libcallFor(
ST.is64Bit(), {s128, s32});
775 getActionDefinitionsBuilder(G_FCANONICALIZE)
776 .legalFor(
ST.hasStdExtF(), {s32})
777 .legalFor(
ST.hasStdExtD(), {s64})
778 .legalFor(
ST.hasStdExtZfh(), {s16});
780 getActionDefinitionsBuilder(G_VASTART).customFor({p0});
784 getActionDefinitionsBuilder(G_VAARG)
787 .clampScalar(0, sXLen, sXLen)
788 .lowerForCartesianProduct({sXLen, p0}, {p0});
790 getActionDefinitionsBuilder(G_VSCALE)
791 .clampScalar(0, sXLen, sXLen)
795 getActionDefinitionsBuilder(G_SPLAT_VECTOR)
807 if (
ST.hasVInstructionsF64() &&
ST.hasStdExtD())
808 SplatActions.legalIf(
all(
810 else if (
ST.hasVInstructionsI64())
811 SplatActions.customIf(
all(
815 SplatActions.clampScalar(1, sXLen, sXLen);
824 getActionDefinitionsBuilder(G_EXTRACT_SUBVECTOR)
833 Query.
Types[0].getElementCount().divideCoefficientBy(8), 8);
834 return std::pair(0, CastTy);
842 getActionDefinitionsBuilder(G_INSERT_SUBVECTOR)
848 getActionDefinitionsBuilder(G_ATOMIC_CMPXCHG_WITH_SUCCESS)
851 getActionDefinitionsBuilder({G_ATOMIC_CMPXCHG, G_ATOMICRMW_ADD,
852 G_ATOMICRMW_XCHG, G_ATOMICRMW_AND,
853 G_ATOMICRMW_OR, G_ATOMICRMW_XOR})
854 .legalFor(
ST.hasStdExtA(), {{sXLen, p0}})
855 .libcallFor(!
ST.hasStdExtA(), {{s8, p0}, {s16, p0}, {s32, p0}, {s64, p0}})
856 .clampScalar(0, sXLen, sXLen);
858 getActionDefinitionsBuilder(G_ATOMICRMW_SUB)
859 .libcallFor(!
ST.hasStdExtA(), {{s8, p0}, {s16, p0}, {s32, p0}, {s64, p0}})
860 .clampScalar(0, sXLen, sXLen)
863 getActionDefinitionsBuilder(
864 {G_ATOMICRMW_MAX, G_ATOMICRMW_MIN, G_ATOMICRMW_UMAX, G_ATOMICRMW_UMIN})
865 .legalFor(
ST.hasStdExtA(), {{sXLen, p0}})
866 .clampScalar(0, sXLen, sXLen)
869 getActionDefinitionsBuilder(G_PREFETCH).legalIf(
typeIs(0, p0));
877 getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT)
879 InsertVectorEltPred,
typeIs(2, sXLen)))
883 getActionDefinitionsBuilder({G_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS})
886 getActionDefinitionsBuilder(G_FENCE).alwaysLegal();
888 getActionDefinitionsBuilder({G_TRAP, G_DEBUGTRAP, G_UBSANTRAP}).alwaysLegal();