@@ -491,21 +491,24 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
491
491
492
492
// FP Operations
493
493
494
+ // FIXME: Support s128 for rv32 when libcall handling is able to use sret.
494
495
getActionDefinitionsBuilder (
495
496
{G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FSQRT, G_FMAXNUM, G_FMINNUM})
496
497
.legalFor (ST.hasStdExtF (), {s32})
497
498
.legalFor (ST.hasStdExtD (), {s64})
498
499
.legalFor (ST.hasStdExtZfh (), {s16})
499
- .libcallFor ({s32, s64});
500
+ .libcallFor ({s32, s64})
501
+ .libcallFor (ST.is64Bit (), {s128});
500
502
501
503
getActionDefinitionsBuilder ({G_FNEG, G_FABS})
502
504
.legalFor (ST.hasStdExtF (), {s32})
503
505
.legalFor (ST.hasStdExtD (), {s64})
504
506
.legalFor (ST.hasStdExtZfh (), {s16})
505
- .lowerFor ({s32, s64});
507
+ .lowerFor ({s32, s64, s128 });
506
508
507
509
getActionDefinitionsBuilder (G_FREM)
508
510
.libcallFor ({s32, s64})
511
+ .libcallFor (ST.is64Bit (), {s128})
509
512
.minScalar (0 , s32)
510
513
.scalarize (0 );
511
514
@@ -521,19 +524,22 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
521
524
.legalFor (ST.hasStdExtD (), {{s32, s64}})
522
525
.legalFor (ST.hasStdExtZfh (), {{s16, s32}})
523
526
.legalFor (ST.hasStdExtZfh () && ST.hasStdExtD (), {{s16, s64}})
524
- .libcallFor ({{s32, s64}});
527
+ .libcallFor ({{s32, s64}})
528
+ .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}});
525
529
getActionDefinitionsBuilder (G_FPEXT)
526
530
.legalFor (ST.hasStdExtD (), {{s64, s32}})
527
531
.legalFor (ST.hasStdExtZfh (), {{s32, s16}})
528
532
.legalFor (ST.hasStdExtZfh () && ST.hasStdExtD (), {{s64, s16}})
529
- .libcallFor ({{s64, s32}});
533
+ .libcallFor ({{s64, s32}})
534
+ .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}});
530
535
531
536
getActionDefinitionsBuilder (G_FCMP)
532
537
.legalFor (ST.hasStdExtF (), {{sXLen , s32}})
533
538
.legalFor (ST.hasStdExtD (), {{sXLen , s64}})
534
539
.legalFor (ST.hasStdExtZfh (), {{sXLen , s16}})
535
540
.clampScalar (0 , sXLen , sXLen )
536
- .libcallFor ({{sXLen , s32}, {sXLen , s64}});
541
+ .libcallFor ({{sXLen , s32}, {sXLen , s64}})
542
+ .libcallFor (ST.is64Bit (), {{sXLen , s128}});
537
543
538
544
// TODO: Support vector version of G_IS_FPCLASS.
539
545
getActionDefinitionsBuilder (G_IS_FPCLASS)
@@ -546,7 +552,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
546
552
.legalFor (ST.hasStdExtF (), {s32})
547
553
.legalFor (ST.hasStdExtD (), {s64})
548
554
.legalFor (ST.hasStdExtZfh (), {s16})
549
- .lowerFor ({s32, s64});
555
+ .lowerFor ({s32, s64, s128 });
550
556
551
557
getActionDefinitionsBuilder ({G_FPTOSI, G_FPTOUI})
552
558
.legalFor (ST.hasStdExtF (), {{sXLen , s32}})
@@ -558,7 +564,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
558
564
.widenScalarToNextPow2 (0 )
559
565
.minScalar (0 , s32)
560
566
.libcallFor ({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
561
- .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}});
567
+ .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}}) // FIXME RV32.
568
+ .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}, {s128, s128}});
562
569
563
570
getActionDefinitionsBuilder ({G_SITOFP, G_UITOFP})
564
571
.legalFor (ST.hasStdExtF (), {{s32, sXLen }})
@@ -579,7 +586,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
579
586
// Otherwise only promote to s32 since we have si libcalls.
580
587
.minScalar (1 , s32)
581
588
.libcallFor ({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
582
- .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}});
589
+ .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}}) // FIXME RV32.
590
+ .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}, {s128, s128}});
583
591
584
592
// FIXME: We can do custom inline expansion like SelectionDAG.
585
593
// FIXME: Legal with Zfa.
0 commit comments