@@ -1698,6 +1698,8 @@ void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
1698
1698
case ISD::FLT_ROUNDS_: ExpandIntRes_FLT_ROUNDS (N, Lo, Hi); break ;
1699
1699
case ISD::FP_TO_SINT: ExpandIntRes_FP_TO_SINT (N, Lo, Hi); break ;
1700
1700
case ISD::FP_TO_UINT: ExpandIntRes_FP_TO_UINT (N, Lo, Hi); break ;
1701
+ case ISD::STRICT_LLROUND:
1702
+ case ISD::STRICT_LLRINT:
1701
1703
case ISD::LLROUND:
1702
1704
case ISD::LLRINT: ExpandIntRes_LLROUND_LLRINT (N, Lo, Hi); break ;
1703
1705
case ISD::LOAD: ExpandIntRes_LOAD (cast<LoadSDNode>(N), Lo, Hi); break ;
@@ -2586,15 +2588,16 @@ void DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDValue &Lo,
2586
2588
2587
2589
void DAGTypeLegalizer::ExpandIntRes_LLROUND_LLRINT (SDNode *N, SDValue &Lo,
2588
2590
SDValue &Hi) {
2589
- SDValue Op = N->getOperand (0 );
2591
+ SDValue Op = N->getOperand (N-> isStrictFPOpcode () ? 1 : 0 );
2590
2592
2591
2593
assert (getTypeAction (Op.getValueType ()) != TargetLowering::TypePromoteFloat &&
2592
2594
" Input type needs to be promoted!" );
2593
2595
2594
2596
EVT VT = Op.getValueType ();
2595
2597
2596
2598
RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2597
- if (N->getOpcode () == ISD::LLROUND) {
2599
+ if (N->getOpcode () == ISD::LLROUND ||
2600
+ N->getOpcode () == ISD::STRICT_LLROUND) {
2598
2601
if (VT == MVT::f32)
2599
2602
LC = RTLIB::LLROUND_F32;
2600
2603
else if (VT == MVT::f64)
@@ -2606,7 +2609,8 @@ void DAGTypeLegalizer::ExpandIntRes_LLROUND_LLRINT(SDNode *N, SDValue &Lo,
2606
2609
else if (VT == MVT::ppcf128)
2607
2610
LC = RTLIB::LLROUND_PPCF128;
2608
2611
assert (LC != RTLIB::UNKNOWN_LIBCALL && " Unexpected llround input type!" );
2609
- } else if (N->getOpcode () == ISD::LLRINT) {
2612
+ } else if (N->getOpcode () == ISD::LLRINT ||
2613
+ N->getOpcode () == ISD::STRICT_LLRINT) {
2610
2614
if (VT == MVT::f32)
2611
2615
LC = RTLIB::LLRINT_F32;
2612
2616
else if (VT == MVT::f64)
@@ -2623,6 +2627,17 @@ void DAGTypeLegalizer::ExpandIntRes_LLROUND_LLRINT(SDNode *N, SDValue &Lo,
2623
2627
2624
2628
SDLoc dl (N);
2625
2629
EVT RetVT = N->getValueType (0 );
2630
+
2631
+ if (N->isStrictFPOpcode ()) {
2632
+ // FIXME: Support softening for strict fp!
2633
+ assert (getTypeAction (VT) != TargetLowering::TypeSoftenFloat &&
2634
+ " Softening strict fp calls not supported yet!" );
2635
+ std::pair<SDValue, SDValue> Tmp = ExpandChainLibCall (LC, N, true );
2636
+ SplitInteger (Tmp.first , Lo, Hi);
2637
+ ReplaceValueWith (SDValue (N, 1 ), Tmp.second );
2638
+ return ;
2639
+ }
2640
+
2626
2641
TargetLowering::MakeLibCallOptions CallOptions;
2627
2642
CallOptions.setSExt (true );
2628
2643
0 commit comments