@@ -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,8 +3313,17 @@ 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
+ if (N->isStrictFPOpcode ()) {
3317
+ SDValue Chain = N->getOperand (0 );
3318
+ SDValue Res =
3319
+ DAG.getNode (N->getOpcode (), dl, {NVT, MVT::Other}, {Chain, N->getOperand (1 )});
3315
3320
3321
+ ReplaceValueWith (SDValue (N, 1 ), Res);
3322
+ // Round the value to the softened type.
3323
+ return DAG.getNode (GetPromotionOpcode (NVT, OVT), dl, MVT::i16 , Res);
3324
+ }
3325
+
3326
+ SDValue Res = DAG.getNode (N->getOpcode (), dl, NVT, N->getOperand (0 ));
3316
3327
// Round the value to the softened type.
3317
3328
return DAG.getNode (GetPromotionOpcode (NVT, OVT), dl, MVT::i16 , Res);
3318
3329
}
@@ -3396,6 +3407,8 @@ bool DAGTypeLegalizer::SoftPromoteHalfOperand(SDNode *N, unsigned OpNo) {
3396
3407
3397
3408
case ISD::BITCAST: Res = SoftPromoteHalfOp_BITCAST (N); break ;
3398
3409
case ISD::FCOPYSIGN: Res = SoftPromoteHalfOp_FCOPYSIGN (N, OpNo); break ;
3410
+ case ISD::STRICT_FP_TO_SINT:
3411
+ case ISD::STRICT_FP_TO_UINT:
3399
3412
case ISD::FP_TO_SINT:
3400
3413
case ISD::FP_TO_UINT: Res = SoftPromoteHalfOp_FP_TO_XINT (N); break ;
3401
3414
case ISD::FP_TO_SINT_SAT:
@@ -3422,7 +3435,7 @@ bool DAGTypeLegalizer::SoftPromoteHalfOperand(SDNode *N, unsigned OpNo) {
3422
3435
3423
3436
assert (Res.getNode () != N && " Expected a new node!" );
3424
3437
3425
- assert (Res.getValueType () == N->getValueType (0 ) && N-> getNumValues () == 1 &&
3438
+ assert (Res.getValueType () == N->getValueType (0 ) &&
3426
3439
" Invalid operand expansion" );
3427
3440
3428
3441
ReplaceValueWith (SDValue (N, 0 ), Res);
@@ -3451,6 +3464,7 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FCOPYSIGN(SDNode *N,
3451
3464
Op1);
3452
3465
}
3453
3466
3467
+
3454
3468
SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_EXTEND (SDNode *N) {
3455
3469
EVT RVT = N->getValueType (0 );
3456
3470
bool IsStrict = N->isStrictFPOpcode ();
@@ -3479,16 +3493,22 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_EXTEND(SDNode *N) {
3479
3493
3480
3494
SDValue DAGTypeLegalizer::SoftPromoteHalfOp_FP_TO_XINT (SDNode *N) {
3481
3495
EVT RVT = N->getValueType (0 );
3482
- SDValue Op = N->getOperand (0 );
3496
+ SDValue Op = N->getOperand (N-> isStrictFPOpcode () ? 1 : 0 );
3483
3497
EVT SVT = Op.getValueType ();
3484
3498
SDLoc dl (N);
3485
3499
3486
3500
EVT NVT = TLI.getTypeToTransformTo (*DAG.getContext (), Op.getValueType ());
3487
3501
3488
3502
Op = GetSoftPromotedHalf (Op);
3489
3503
3490
- SDValue Res = DAG.getNode (GetPromotionOpcode (SVT, RVT), dl, NVT, Op);
3504
+ if (N->isStrictFPOpcode ()) {
3505
+ SDValue Res = DAG.getNode (GetPromotionOpcode (SVT, RVT), dl, NVT, Op);
3506
+ // ReplaceValueWith(SDValue(N, 1), Res);
3507
+ SDValue Chain = N->getOperand (0 );
3508
+ return DAG.getNode (N->getOpcode (), dl, N->getValueType (0 ), { Chain, Res });
3509
+ }
3491
3510
3511
+ SDValue Res = DAG.getNode (GetPromotionOpcode (SVT, RVT), dl, NVT, Op);
3492
3512
return DAG.getNode (N->getOpcode (), dl, N->getValueType (0 ), Res);
3493
3513
}
3494
3514
0 commit comments