@@ -3090,6 +3090,8 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
3090
3090
break ;
3091
3091
case ISD::SELECT: R = SoftPromoteHalfRes_SELECT (N); break ;
3092
3092
case ISD::SELECT_CC: R = SoftPromoteHalfRes_SELECT_CC (N); break ;
3093
+ case ISD::STRICT_SINT_TO_FP:
3094
+ case ISD::STRICT_UINT_TO_FP:
3093
3095
case ISD::SINT_TO_FP:
3094
3096
case ISD::UINT_TO_FP: R = SoftPromoteHalfRes_XINT_TO_FP (N); break ;
3095
3097
case ISD::UNDEF: R = SoftPromoteHalfRes_UNDEF (N); break ;
@@ -3311,7 +3313,12 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfRes_XINT_TO_FP(SDNode *N) {
3311
3313
EVT NVT = TLI.getTypeToTransformTo (*DAG.getContext (), OVT);
3312
3314
SDLoc dl (N);
3313
3315
3314
- SDValue Res = DAG.getNode (N->getOpcode (), dl, NVT, N->getOperand (0 ));
3316
+ SDValue Op = N->getOperand (N->isStrictFPOpcode () ? 1 : 0 );
3317
+
3318
+ bool Signed = N->getOpcode () == ISD::SINT_TO_FP ||
3319
+ N->getOpcode () == ISD::STRICT_SINT_TO_FP;
3320
+ SDValue Res =
3321
+ DAG.getNode (Signed ? ISD::SINT_TO_FP : ISD::UINT_TO_FP, dl, NVT, Op);
3315
3322
3316
3323
// Round the value to the softened type.
3317
3324
return DAG.getNode (GetPromotionOpcode (NVT, OVT), dl, MVT::i16 , Res);
@@ -3396,6 +3403,8 @@ bool DAGTypeLegalizer::SoftPromoteHalfOperand(SDNode *N, unsigned OpNo) {
3396
3403
3397
3404
case ISD::BITCAST: Res = SoftPromoteHalfOp_BITCAST (N); break ;
3398
3405
case ISD::FCOPYSIGN: Res = SoftPromoteHalfOp_FCOPYSIGN (N, OpNo); break ;
3406
+ case ISD::STRICT_FP_TO_SINT:
3407
+ case ISD::STRICT_FP_TO_UINT:
3399
3408
case ISD::FP_TO_SINT:
3400
3409
case ISD::FP_TO_UINT: Res = SoftPromoteHalfOp_FP_TO_XINT (N); break ;
3401
3410
case ISD::FP_TO_SINT_SAT:
@@ -3422,8 +3431,7 @@ bool DAGTypeLegalizer::SoftPromoteHalfOperand(SDNode *N, unsigned OpNo) {
3422
3431
3423
3432
assert (Res.getNode () != N && " Expected a new node!" );
3424
3433
3425
- assert (Res.getValueType () == N->getValueType (0 ) && N->getNumValues () == 1 &&
3426
- " Invalid operand expansion" );
3434
+ assert (Res.getValueType () == N->getValueType (0 ) && " Invalid operand expansion" );
3427
3435
3428
3436
ReplaceValueWith (SDValue (N, 0 ), Res);
3429
3437
return false ;
@@ -3479,7 +3487,7 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_EXTEND(SDNode *N) {
3479
3487
3480
3488
SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_TO_XINT (SDNode *N) {
3481
3489
EVT RVT = N->getValueType (0 );
3482
- SDValue Op = N->getOperand (0 );
3490
+ SDValue Op = N->getOperand (N-> isStrictFPOpcode () ? 1 : 0 );
3483
3491
EVT SVT = Op.getValueType ();
3484
3492
SDLoc dl (N);
3485
3493
@@ -3489,7 +3497,10 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_TO_XINT(SDNode *N) {
3489
3497
3490
3498
SDValue Res = DAG.getNode (GetPromotionOpcode (SVT, RVT), dl, NVT, Op);
3491
3499
3492
- return DAG.getNode (N->getOpcode (), dl, N->getValueType (0 ), Res);
3500
+ bool Signed = N->getOpcode () == ISD::FP_TO_SINT ||
3501
+ N->getOpcode () == ISD::STRICT_FP_TO_SINT;
3502
+ return DAG.getNode (Signed ? ISD::FP_TO_SINT : ISD::FP_TO_UINT, dl,
3503
+ N->getValueType (0 ), Res);
3493
3504
}
3494
3505
3495
3506
SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_TO_XINT_SAT (SDNode *N) {
0 commit comments