@@ -491,21 +491,23 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
491491
492492 // FP Operations
493493
494+ // FIXME: Support s128 for rv32 when libcall handling is able to use sret.
494495 getActionDefinitionsBuilder (
495496 {G_FADD, G_FSUB, G_FMUL, G_FDIV, G_FMA, G_FSQRT, G_FMAXNUM, G_FMINNUM})
496497 .legalFor (ST.hasStdExtF (), {s32})
497498 .legalFor (ST.hasStdExtD (), {s64})
498499 .legalFor (ST.hasStdExtZfh (), {s16})
499- .libcallFor ({s32, s64});
500+ .libcallFor ({s32, s64})
501+ .libcallFor (ST.is64Bit (), {s128});
500502
501503 getActionDefinitionsBuilder ({G_FNEG, G_FABS})
502504 .legalFor (ST.hasStdExtF (), {s32})
503505 .legalFor (ST.hasStdExtD (), {s64})
504506 .legalFor (ST.hasStdExtZfh (), {s16})
505- .lowerFor ({s32, s64});
507+ .lowerFor ({s32, s64, s128 });
506508
507509 getActionDefinitionsBuilder (G_FREM)
508- .libcallFor ({s32, s64})
510+ .libcallFor ({s32, s64, s128 })
509511 .minScalar (0 , s32)
510512 .scalarize (0 );
511513
@@ -521,19 +523,22 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
521523 .legalFor (ST.hasStdExtD (), {{s32, s64}})
522524 .legalFor (ST.hasStdExtZfh (), {{s16, s32}})
523525 .legalFor (ST.hasStdExtZfh () && ST.hasStdExtD (), {{s16, s64}})
524- .libcallFor ({{s32, s64}});
526+ .libcallFor ({{s32, s64}})
527+ .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}});
525528 getActionDefinitionsBuilder (G_FPEXT)
526529 .legalFor (ST.hasStdExtD (), {{s64, s32}})
527530 .legalFor (ST.hasStdExtZfh (), {{s32, s16}})
528531 .legalFor (ST.hasStdExtZfh () && ST.hasStdExtD (), {{s64, s16}})
529- .libcallFor ({{s64, s32}});
532+ .libcallFor ({{s64, s32}})
533+ .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}});
530534
531535 getActionDefinitionsBuilder (G_FCMP)
532536 .legalFor (ST.hasStdExtF (), {{sXLen , s32}})
533537 .legalFor (ST.hasStdExtD (), {{sXLen , s64}})
534538 .legalFor (ST.hasStdExtZfh (), {{sXLen , s16}})
535539 .clampScalar (0 , sXLen , sXLen )
536- .libcallFor ({{sXLen , s32}, {sXLen , s64}});
540+ .libcallFor ({{sXLen , s32}, {sXLen , s64}})
541+ .libcallFor (ST.is64Bit (), {{sXLen , s128}});
537542
538543 // TODO: Support vector version of G_IS_FPCLASS.
539544 getActionDefinitionsBuilder (G_IS_FPCLASS)
@@ -546,7 +551,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
546551 .legalFor (ST.hasStdExtF (), {s32})
547552 .legalFor (ST.hasStdExtD (), {s64})
548553 .legalFor (ST.hasStdExtZfh (), {s16})
549- .lowerFor ({s32, s64});
554+ .lowerFor ({s32, s64, s128 });
550555
551556 getActionDefinitionsBuilder ({G_FPTOSI, G_FPTOUI})
552557 .legalFor (ST.hasStdExtF (), {{sXLen , s32}})
@@ -558,7 +563,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
558563 .widenScalarToNextPow2 (0 )
559564 .minScalar (0 , s32)
560565 .libcallFor ({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
561- .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}});
566+ .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}}) // FIXME RV32.
567+ .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}, {s128, s128}});
562568
563569 getActionDefinitionsBuilder ({G_SITOFP, G_UITOFP})
564570 .legalFor (ST.hasStdExtF (), {{s32, sXLen }})
@@ -579,7 +585,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
579585 // Otherwise only promote to s32 since we have si libcalls.
580586 .minScalar (1 , s32)
581587 .libcallFor ({{s32, s32}, {s64, s32}, {s32, s64}, {s64, s64}})
582- .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}});
588+ .libcallFor (ST.is64Bit (), {{s128, s32}, {s128, s64}}) // FIXME RV32.
589+ .libcallFor (ST.is64Bit (), {{s32, s128}, {s64, s128}, {s128, s128}});
583590
584591 // FIXME: We can do custom inline expansion like SelectionDAG.
585592 // FIXME: Legal with Zfa.
0 commit comments