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 auto &CTTZActions = getActionDefinitionsBuilder(G_CTTZ);
271 if (
ST.hasVendorXTHeadBb()) {
272 CTTZActions.clampScalar(0, sXLen, sXLen).scalarSameSizeAs(1, 0).lower();
273 CTLZPoisonActions.clampScalar(0, sXLen, sXLen).scalarSameSizeAs(1, 0);
274 CTTZPoisonActions.clampScalar(0, sXLen, sXLen).scalarSameSizeAs(1, 0);
276 CTTZActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
277 CTLZPoisonActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0);
278 CTTZPoisonActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0);
281 CTLZPoisonActions.lower();
282 CTTZPoisonActions.lower();
284 auto &CountSignActions = getActionDefinitionsBuilder(G_CTLS);
285 if (
ST.hasStdExtP()) {
286 CountSignActions.legalFor({{sXLen, sXLen}})
287 .customFor({{s32, s32}})
288 .clampScalar(0, s32, sXLen)
289 .widenScalarToNextPow2(0)
290 .scalarSameSizeAs(1, 0);
292 CountSignActions.maxScalar(0, sXLen).scalarSameSizeAs(1, 0).lower();
295 auto &CTPOPActions = getActionDefinitionsBuilder(G_CTPOP);
296 if (
ST.hasStdExtZbb()) {
297 CTPOPActions.legalFor({{sXLen, sXLen}})
298 .clampScalar(0, sXLen, sXLen)
299 .scalarSameSizeAs(1, 0);
301 CTPOPActions.widenScalarToNextPow2(0, 8)
302 .clampScalar(0, s8, sXLen)
303 .scalarSameSizeAs(1, 0)
307 getActionDefinitionsBuilder(G_CONSTANT)
309 .legalFor(!
ST.is64Bit(), {s32})
310 .customFor(
ST.is64Bit(), {s64})
311 .widenScalarToNextPow2(0)
312 .clampScalar(0, sXLen, sXLen);
315 getActionDefinitionsBuilder(G_FREEZE)
316 .legalFor({s16, s32, p0})
317 .legalFor(
ST.is64Bit(), {s64})
320 .widenScalarToNextPow2(0)
321 .clampScalar(0, s16, sXLen);
325 getActionDefinitionsBuilder(
326 {G_IMPLICIT_DEF, G_CONSTANT_FOLD_BARRIER})
327 .legalFor({s32, sXLen, p0})
330 .widenScalarToNextPow2(0)
331 .clampScalar(0, s32, sXLen);
333 getActionDefinitionsBuilder(G_ICMP)
334 .legalFor({{sXLen, sXLen}, {sXLen, p0}})
337 .widenScalarOrEltToNextPow2OrMinSize(1, 8)
338 .clampScalar(1, sXLen, sXLen)
339 .clampScalar(0, sXLen, sXLen);
341 getActionDefinitionsBuilder(G_SELECT)
342 .legalFor({{s32, sXLen}, {p0, sXLen}})
345 .legalFor(XLen == 64 ||
ST.hasStdExtD(), {{s64, sXLen}})
346 .widenScalarToNextPow2(0)
347 .clampScalar(0, s32, (XLen == 64 ||
ST.hasStdExtD()) ? s64 : s32)
348 .clampScalar(1, sXLen, sXLen);
350 auto &LoadActions = getActionDefinitionsBuilder(G_LOAD);
351 auto &StoreActions = getActionDefinitionsBuilder(G_STORE);
352 auto &ExtLoadActions = getActionDefinitionsBuilder({G_SEXTLOAD, G_ZEXTLOAD});
357 auto getScalarMemAlign = [&
ST](
unsigned Size) {
358 return ST.enableUnalignedScalarMem() ? 8 :
Size;
361 LoadActions.legalForTypesWithMemDesc(
362 {{s16, p0, s8, getScalarMemAlign(8)},
363 {s32, p0, s8, getScalarMemAlign(8)},
364 {s16, p0, s16, getScalarMemAlign(16)},
365 {s32, p0, s16, getScalarMemAlign(16)},
366 {s32, p0, s32, getScalarMemAlign(32)},
367 {p0, p0, sXLen, getScalarMemAlign(XLen)}});
368 StoreActions.legalForTypesWithMemDesc(
369 {{s16, p0, s8, getScalarMemAlign(8)},
370 {s32, p0, s8, getScalarMemAlign(8)},
371 {s16, p0, s16, getScalarMemAlign(16)},
372 {s32, p0, s16, getScalarMemAlign(16)},
373 {s32, p0, s32, getScalarMemAlign(32)},
374 {p0, p0, sXLen, getScalarMemAlign(XLen)}});
375 ExtLoadActions.legalForTypesWithMemDesc(
376 {{sXLen, p0, s8, getScalarMemAlign(8)},
377 {sXLen, p0, s16, getScalarMemAlign(16)}});
379 LoadActions.legalForTypesWithMemDesc(
380 {{s64, p0, s8, getScalarMemAlign(8)},
381 {s64, p0, s16, getScalarMemAlign(16)},
382 {s64, p0, s32, getScalarMemAlign(32)},
383 {s64, p0, s64, getScalarMemAlign(64)}});
384 StoreActions.legalForTypesWithMemDesc(
385 {{s64, p0, s8, getScalarMemAlign(8)},
386 {s64, p0, s16, getScalarMemAlign(16)},
387 {s64, p0, s32, getScalarMemAlign(32)},
388 {s64, p0, s64, getScalarMemAlign(64)}});
389 ExtLoadActions.legalForTypesWithMemDesc(
390 {{s64, p0, s32, getScalarMemAlign(32)}});
391 }
else if (
ST.hasStdExtD() ||
ST.hasStdExtZilsd()) {
397 LoadActions.legalForTypesWithMemDesc(
398 {{s64, p0, s64, getScalarMemAlign(64)}});
399 StoreActions.legalForTypesWithMemDesc(
400 {{s64, p0, s64, getScalarMemAlign(64)}});
404 if (
ST.hasVInstructions()) {
405 LoadActions.legalForTypesWithMemDesc({{nxv2s8, p0, nxv2s8, 8},
406 {nxv4s8, p0, nxv4s8, 8},
407 {nxv8s8, p0, nxv8s8, 8},
408 {nxv16s8, p0, nxv16s8, 8},
409 {nxv32s8, p0, nxv32s8, 8},
410 {nxv64s8, p0, nxv64s8, 8},
411 {nxv2s16, p0, nxv2s16, 16},
412 {nxv4s16, p0, nxv4s16, 16},
413 {nxv8s16, p0, nxv8s16, 16},
414 {nxv16s16, p0, nxv16s16, 16},
415 {nxv32s16, p0, nxv32s16, 16},
416 {nxv2s32, p0, nxv2s32, 32},
417 {nxv4s32, p0, nxv4s32, 32},
418 {nxv8s32, p0, nxv8s32, 32},
419 {nxv16s32, p0, nxv16s32, 32}});
420 StoreActions.legalForTypesWithMemDesc({{nxv2s8, p0, nxv2s8, 8},
421 {nxv4s8, p0, nxv4s8, 8},
422 {nxv8s8, p0, nxv8s8, 8},
423 {nxv16s8, p0, nxv16s8, 8},
424 {nxv32s8, p0, nxv32s8, 8},
425 {nxv64s8, p0, nxv64s8, 8},
426 {nxv2s16, p0, nxv2s16, 16},
427 {nxv4s16, p0, nxv4s16, 16},
428 {nxv8s16, p0, nxv8s16, 16},
429 {nxv16s16, p0, nxv16s16, 16},
430 {nxv32s16, p0, nxv32s16, 16},
431 {nxv2s32, p0, nxv2s32, 32},
432 {nxv4s32, p0, nxv4s32, 32},
433 {nxv8s32, p0, nxv8s32, 32},
434 {nxv16s32, p0, nxv16s32, 32}});
436 if (
ST.getELen() == 64) {
437 LoadActions.legalForTypesWithMemDesc({{nxv1s8, p0, nxv1s8, 8},
438 {nxv1s16, p0, nxv1s16, 16},
439 {nxv1s32, p0, nxv1s32, 32}});
440 StoreActions.legalForTypesWithMemDesc({{nxv1s8, p0, nxv1s8, 8},
441 {nxv1s16, p0, nxv1s16, 16},
442 {nxv1s32, p0, nxv1s32, 32}});
445 if (
ST.hasVInstructionsI64()) {
446 LoadActions.legalForTypesWithMemDesc({{nxv1s64, p0, nxv1s64, 64},
447 {nxv2s64, p0, nxv2s64, 64},
448 {nxv4s64, p0, nxv4s64, 64},
449 {nxv8s64, p0, nxv8s64, 64}});
450 StoreActions.legalForTypesWithMemDesc({{nxv1s64, p0, nxv1s64, 64},
451 {nxv2s64, p0, nxv2s64, 64},
452 {nxv4s64, p0, nxv4s64, 64},
453 {nxv8s64, p0, nxv8s64, 64}});
462 if (XLen <=
ST.getELen()) {
468 LoadActions.widenScalarToNextPow2(0, 8)
469 .lowerIfMemSizeNotByteSizePow2()
470 .clampScalar(0, s16, sXLen)
473 .clampScalar(0, s16, sXLen)
474 .lowerIfMemSizeNotByteSizePow2()
477 ExtLoadActions.widenScalarToNextPow2(0).clampScalar(0, sXLen, sXLen).lower();
479 getActionDefinitionsBuilder({G_PTR_ADD, G_PTRMASK}).legalFor({{p0, sXLen}});
481 getActionDefinitionsBuilder(G_PTRTOINT)
482 .legalFor({{sXLen, p0}})
483 .clampScalar(0, sXLen, sXLen);
485 getActionDefinitionsBuilder(G_INTTOPTR)
486 .legalFor({{p0, sXLen}})
487 .clampScalar(1, sXLen, sXLen);
489 getActionDefinitionsBuilder(G_BR).alwaysLegal();
491 getActionDefinitionsBuilder(G_BRCOND).legalFor({sXLen}).minScalar(0, sXLen);
493 getActionDefinitionsBuilder(G_BRJT).customFor({{p0, sXLen}});
495 getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0});
497 getActionDefinitionsBuilder(G_PHI)
498 .legalFor({p0, s32, sXLen})
499 .widenScalarToNextPow2(0)
500 .clampScalar(0, s32, sXLen);
502 getActionDefinitionsBuilder({G_GLOBAL_VALUE, G_JUMP_TABLE, G_CONSTANT_POOL})
505 if (
ST.hasStdExtZmmul()) {
506 getActionDefinitionsBuilder(G_MUL)
508 .widenScalarToNextPow2(0)
509 .clampScalar(0, sXLen, sXLen);
512 getActionDefinitionsBuilder({G_SMULH, G_UMULH})
517 getActionDefinitionsBuilder({G_SMULO, G_UMULO}).minScalar(0, sXLen).lower();
519 getActionDefinitionsBuilder(G_MUL)
520 .libcallFor({sXLen, sDoubleXLen})
521 .widenScalarToNextPow2(0)
522 .clampScalar(0, sXLen, sDoubleXLen);
524 getActionDefinitionsBuilder({G_SMULH, G_UMULH}).lowerFor({sXLen});
526 getActionDefinitionsBuilder({G_SMULO, G_UMULO})
531 .widenScalarIf(
typeIs(0, sXLen),
536 if (
ST.hasStdExtM()) {
537 getActionDefinitionsBuilder({G_SDIV, G_UDIV, G_UREM})
540 .libcallFor({sDoubleXLen})
541 .clampScalar(0, s32, sDoubleXLen)
542 .widenScalarToNextPow2(0);
543 getActionDefinitionsBuilder(G_SREM)
545 .libcallFor({sDoubleXLen})
546 .clampScalar(0, sXLen, sDoubleXLen)
547 .widenScalarToNextPow2(0);
549 getActionDefinitionsBuilder({G_UDIV, G_SDIV, G_UREM, G_SREM})
550 .libcallFor({sXLen, sDoubleXLen})
551 .clampScalar(0, sXLen, sDoubleXLen)
552 .widenScalarToNextPow2(0);
556 getActionDefinitionsBuilder({G_SDIVREM, G_UDIVREM}).
lower();
558 getActionDefinitionsBuilder(G_ABS)
559 .customFor(
ST.hasStdExtZbb(), {sXLen})
560 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
563 getActionDefinitionsBuilder({G_ABDS, G_ABDU})
564 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
567 getActionDefinitionsBuilder({G_UMAX, G_UMIN, G_SMAX, G_SMIN})
568 .legalFor(
ST.hasStdExtZbb(), {sXLen})
569 .minScalar(
ST.hasStdExtZbb(), 0, sXLen)
572 getActionDefinitionsBuilder({G_SCMP, G_UCMP}).
lower();
574 getActionDefinitionsBuilder(G_FRAME_INDEX).legalFor({p0});
576 getActionDefinitionsBuilder({G_MEMCPY, G_MEMMOVE, G_MEMSET}).
libcall();
578 getActionDefinitionsBuilder({G_MEMCPY_INLINE, G_MEMSET_INLINE}).
lower();
580 getActionDefinitionsBuilder({G_DYN_STACKALLOC, G_STACKSAVE, G_STACKRESTORE})
586 getActionDefinitionsBuilder({G_READCYCLECOUNTER, G_READSTEADYCOUNTER})
587 .legalFor(
ST.is64Bit(), {s64})
588 .customFor(!
ST.is64Bit(), {s64});
593 getActionDefinitionsBuilder({G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FSQRT,
594 G_FMAXNUM, G_FMINNUM, G_FMAXIMUMNUM,
596 .legalFor(
ST.hasStdExtF(), {s32})
597 .legalFor(
ST.hasStdExtD(), {s64})
598 .legalFor(
ST.hasStdExtZfh(), {s16})
599 .libcallFor({s32, s64})
600 .libcallFor(
ST.is64Bit(), {s128});
602 getActionDefinitionsBuilder({G_FNEG, G_FABS})
603 .legalFor(
ST.hasStdExtF(), {s32})
604 .legalFor(
ST.hasStdExtD(), {s64})
605 .legalFor(
ST.hasStdExtZfh(), {s16})
606 .lowerFor({s32, s64, s128});
608 getActionDefinitionsBuilder(G_FREM)
609 .libcallFor({s32, s64})
610 .libcallFor(
ST.is64Bit(), {s128})
614 getActionDefinitionsBuilder(G_FCOPYSIGN)
615 .legalFor(
ST.hasStdExtF(), {{s32, s32}})
616 .legalFor(
ST.hasStdExtD(), {{s64, s64}, {s32, s64}, {s64, s32}})
617 .legalFor(
ST.hasStdExtZfh(), {{s16, s16}, {s16, s32}, {s32, s16}})
618 .legalFor(
ST.hasStdExtZfh() &&
ST.hasStdExtD(), {{s16, s64}, {s64, s16}})
621 getActionDefinitionsBuilder(G_FPTRUNC)
622 .legalFor(
ST.hasStdExtD(), {{s32, s64}})
623 .legalFor(
ST.hasStdExtZfhmin(), {{s16, s32}})
624 .legalFor(
ST.hasStdExtZfhmin() &&
ST.hasStdExtD(), {{s16, s64}})
625 .libcallFor({{s16, s32}, {s16, s64}, {s32, s64}})
626 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}});
627 getActionDefinitionsBuilder(G_FPEXT)
628 .legalFor(
ST.hasStdExtD(), {{s64, s32}})
629 .legalFor(
ST.hasStdExtZfhmin(), {{s32, s16}})
630 .legalFor(
ST.hasStdExtZfhmin() &&
ST.hasStdExtD(), {{s64, s16}})
631 .libcallFor(!
ST.hasStdExtZfhmin(), {{s32, s16}})
632 .libcallFor(!(
ST.hasStdExtZfhmin() &&
ST.hasStdExtD()), {{s64, s16}})
633 .libcallFor({{s64, s32}})
634 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}});
636 getActionDefinitionsBuilder(G_FCMP)
637 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
638 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
639 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
640 .clampScalar(0, sXLen, sXLen)
642 .libcallFor({{sXLen, s32}, {sXLen, s64}})
643 .libcallFor(
ST.is64Bit(), {{sXLen, s128}});
646 getActionDefinitionsBuilder(G_IS_FPCLASS)
647 .customFor(
ST.hasStdExtF(), {{s1, s32}})
648 .customFor(
ST.hasStdExtD(), {{s1, s64}})
649 .customFor(
ST.hasStdExtZfh(), {{s1, s16}})
652 getActionDefinitionsBuilder(G_FCONSTANT)
653 .legalFor(
ST.hasStdExtF(), {s32})
654 .legalFor(
ST.hasStdExtD(), {s64})
655 .legalFor(
ST.hasStdExtZfhmin(), {s16})
656 .lowerFor({s32, s64, s128});
658 getActionDefinitionsBuilder({G_FPTOSI, G_FPTOUI})
659 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
660 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
661 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
662 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
663 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
664 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
665 .widenScalarToNextPow2(0)
674 return Query.
Types[1] == f16 && !
ST.hasStdExtZfh() &&
675 (
ST.is64Bit() || Query.
Types[0] == s32);
678 .libcallFor(!
ST.hasStdExtZfhmin(), {{s64, f16}})
679 .narrowScalarFor({{s64, f16}},
changeTo(0, s32))
680 .libcallFor({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
681 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}})
682 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}, {s128, s128}});
689 getActionDefinitionsBuilder({G_FPTOSI_SAT, G_FPTOUI_SAT})
690 .customFor(
ST.hasStdExtF(), {{sXLen, s32}})
691 .customFor(
ST.hasStdExtD(), {{sXLen, s64}})
692 .customFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
693 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
694 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
695 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
701 getActionDefinitionsBuilder({G_LROUND, G_LLROUND})
702 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
703 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
704 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
705 .customFor(
ST.is64Bit() &&
ST.hasStdExtF(), {{s32, s32}})
706 .customFor(
ST.is64Bit() &&
ST.hasStdExtD(), {{s32, s64}})
707 .customFor(
ST.is64Bit() &&
ST.hasStdExtZfh(), {{s32, s16}})
709 .libcallFor({{s32, s32},
716 getActionDefinitionsBuilder({G_INTRINSIC_LRINT, G_INTRINSIC_LLRINT})
717 .legalFor(
ST.hasStdExtF(), {{sXLen, s32}})
718 .legalFor(
ST.hasStdExtD(), {{sXLen, s64}})
719 .legalFor(
ST.hasStdExtZfh(), {{sXLen, s16}})
722 .libcallFor({{s32, s32},
729 getActionDefinitionsBuilder({G_SITOFP, G_UITOFP})
730 .legalFor(
ST.hasStdExtF(), {{s32, sXLen}})
731 .legalFor(
ST.hasStdExtD(), {{s64, sXLen}})
732 .legalFor(
ST.hasStdExtZfh(), {{s16, sXLen}})
733 .widenScalarToNextPow2(1)
737 return Query.
Types[0].isScalar() && Query.
Types[1].isScalar() &&
738 (Query.
Types[1].getSizeInBits() <
ST.getXLen()) &&
739 ((
ST.hasStdExtF() && Query.
Types[0].getSizeInBits() == 32) ||
740 (
ST.hasStdExtD() && Query.
Types[0].getSizeInBits() == 64) ||
741 (
ST.hasStdExtZfh() &&
742 Query.
Types[0].getSizeInBits() == 16));
747 .libcallFor({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
748 .libcallFor(
ST.is64Bit(), {{s128, s32}, {s128, s64}})
749 .libcallFor(
ST.is64Bit(), {{s32, s128}, {s64, s128}, {s128, s128}});
752 getActionDefinitionsBuilder({G_FCEIL, G_FFLOOR, G_FRINT, G_FNEARBYINT,
753 G_INTRINSIC_TRUNC, G_INTRINSIC_ROUND,
754 G_INTRINSIC_ROUNDEVEN})
755 .legalFor(
ST.hasStdExtZfa(), {s32})
756 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtD(), {s64})
757 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtZfh(), {s16})
758 .libcallFor({s32, s64})
759 .libcallFor(
ST.is64Bit(), {s128});
761 getActionDefinitionsBuilder({G_FMAXIMUM, G_FMINIMUM})
762 .legalFor(
ST.hasStdExtZfa(), {s32})
763 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtD(), {s64})
764 .legalFor(
ST.hasStdExtZfa() &&
ST.hasStdExtZfh(), {s16});
766 getActionDefinitionsBuilder({G_FCOS, G_FSIN, G_FTAN, G_FPOW, G_FLOG, G_FLOG2,
767 G_FLOG10, G_FEXP, G_FEXP2, G_FEXP10, G_FACOS,
768 G_FASIN, G_FATAN, G_FATAN2, G_FCOSH, G_FSINH,
769 G_FTANH, G_FMODF, G_FSINCOS})
770 .libcallFor({s32, s64})
771 .libcallFor(
ST.is64Bit(), {s128});
772 getActionDefinitionsBuilder({G_FPOWI, G_FLDEXP})
773 .libcallFor({{s32, s32}, {s64, s32}})
774 .libcallFor(
ST.is64Bit(), {s128, s32});
776 getActionDefinitionsBuilder(G_FCANONICALIZE)
777 .legalFor(
ST.hasStdExtF(), {s32})
778 .legalFor(
ST.hasStdExtD(), {s64})
779 .legalFor(
ST.hasStdExtZfh(), {s16});
781 getActionDefinitionsBuilder(G_VASTART).customFor({p0});
785 getActionDefinitionsBuilder(G_VAARG)
788 .clampScalar(0, sXLen, sXLen)
789 .lowerForCartesianProduct({sXLen, p0}, {p0});
791 getActionDefinitionsBuilder(G_VSCALE)
792 .clampScalar(0, sXLen, sXLen)
796 getActionDefinitionsBuilder(G_SPLAT_VECTOR)
808 if (
ST.hasVInstructionsF64() &&
ST.hasStdExtD())
809 SplatActions.legalIf(
all(
811 else if (
ST.hasVInstructionsI64())
812 SplatActions.customIf(
all(
816 SplatActions.clampScalar(1, sXLen, sXLen);
825 getActionDefinitionsBuilder(G_EXTRACT_SUBVECTOR)
834 Query.
Types[0].getElementCount().divideCoefficientBy(8), 8);
835 return std::pair(0, CastTy);
843 getActionDefinitionsBuilder(G_INSERT_SUBVECTOR)
849 getActionDefinitionsBuilder(G_ATOMIC_CMPXCHG_WITH_SUCCESS)
852 getActionDefinitionsBuilder({G_ATOMIC_CMPXCHG, G_ATOMICRMW_ADD,
853 G_ATOMICRMW_XCHG, G_ATOMICRMW_AND,
854 G_ATOMICRMW_OR, G_ATOMICRMW_XOR})
855 .legalFor(
ST.hasStdExtA(), {{sXLen, p0}})
856 .libcallFor(!
ST.hasStdExtA(), {{s8, p0}, {s16, p0}, {s32, p0}, {s64, p0}})
857 .clampScalar(0, sXLen, sXLen);
859 getActionDefinitionsBuilder(G_ATOMICRMW_SUB)
860 .libcallFor(!
ST.hasStdExtA(), {{s8, p0}, {s16, p0}, {s32, p0}, {s64, p0}})
861 .clampScalar(0, sXLen, sXLen)
864 getActionDefinitionsBuilder(
865 {G_ATOMICRMW_MAX, G_ATOMICRMW_MIN, G_ATOMICRMW_UMAX, G_ATOMICRMW_UMIN})
866 .legalFor(
ST.hasStdExtA(), {{sXLen, p0}})
867 .clampScalar(0, sXLen, sXLen)
870 getActionDefinitionsBuilder(G_PREFETCH).legalIf(
typeIs(0, p0));
878 getActionDefinitionsBuilder(G_INSERT_VECTOR_ELT)
880 InsertVectorEltPred,
typeIs(2, sXLen)))
884 getActionDefinitionsBuilder({G_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS})
887 getActionDefinitionsBuilder(G_FENCE).alwaysLegal();
889 getActionDefinitionsBuilder({G_TRAP, G_DEBUGTRAP, G_UBSANTRAP}).alwaysLegal();