@@ -646,18 +646,21 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
646646 }
647647 }
648648
649- // Zero extend to the promoted type and do the count there.
650- SDValue Op = ZExtPromotedInteger (N->getOperand (0 ));
651-
652649 // Subtract off the extra leading bits in the bigger type.
653650 SDValue ExtractLeadingBits = DAG.getConstant (
654651 NVT.getScalarSizeInBits () - OVT.getScalarSizeInBits (), dl, NVT);
655- if (!N->isVPOpcode ())
652+ if (!N->isVPOpcode ()) {
653+ // Zero extend to the promoted type and do the count there.
654+ SDValue Op = ZExtPromotedInteger (N->getOperand (0 ));
656655 return DAG.getNode (ISD::SUB, dl, NVT,
657656 DAG.getNode (N->getOpcode (), dl, NVT, Op),
658657 ExtractLeadingBits);
658+ }
659+
659660 SDValue Mask = N->getOperand (1 );
660661 SDValue EVL = N->getOperand (2 );
662+ // Zero extend to the promoted type and do the count there.
663+ SDValue Op = VPZExtPromotedInteger (N->getOperand (0 ), Mask, EVL);
661664 return DAG.getNode (ISD::VP_SUB, dl, NVT,
662665 DAG.getNode (N->getOpcode (), dl, NVT, Op, Mask, EVL),
663666 ExtractLeadingBits, Mask, EVL);
@@ -681,11 +684,16 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTPOP_PARITY(SDNode *N) {
681684 }
682685
683686 // Zero extend to the promoted type and do the count or parity there.
684- SDValue Op = ZExtPromotedInteger ( N->getOperand ( 0 ));
685- if (! N->isVPOpcode ())
687+ if (! N->isVPOpcode ()) {
688+ SDValue Op = ZExtPromotedInteger ( N->getOperand ( 0 ));
686689 return DAG.getNode (N->getOpcode (), SDLoc (N), Op.getValueType (), Op);
687- return DAG.getNode (N->getOpcode (), SDLoc (N), Op.getValueType (), Op,
688- N->getOperand (1 ), N->getOperand (2 ));
690+ }
691+
692+ SDValue Mask = N->getOperand (1 );
693+ SDValue EVL = N->getOperand (2 );
694+ SDValue Op = VPZExtPromotedInteger (N->getOperand (0 ), Mask, EVL);
695+ return DAG.getNode (N->getOpcode (), SDLoc (N), Op.getValueType (), Op, Mask,
696+ EVL);
689697}
690698
691699SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ (SDNode *N) {
@@ -1335,12 +1343,19 @@ SDValue DAGTypeLegalizer::PromoteIntRes_FFREXP(SDNode *N) {
13351343SDValue DAGTypeLegalizer::PromoteIntRes_SHL (SDNode *N) {
13361344 SDValue LHS = GetPromotedInteger (N->getOperand (0 ));
13371345 SDValue RHS = N->getOperand (1 );
1338- if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1339- RHS = ZExtPromotedInteger (RHS);
1340- if (N->getOpcode () != ISD::VP_SHL)
1346+ if (N->getOpcode () != ISD::VP_SHL) {
1347+ if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1348+ RHS = ZExtPromotedInteger (RHS);
1349+
13411350 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS);
1351+ }
1352+
1353+ SDValue Mask = N->getOperand (2 );
1354+ SDValue EVL = N->getOperand (3 );
1355+ if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1356+ RHS = VPZExtPromotedInteger (RHS, Mask, EVL);
13421357 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS,
1343- N-> getOperand ( 2 ), N-> getOperand ( 3 ) );
1358+ Mask, EVL );
13441359}
13451360
13461361SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG (SDNode *N) {
@@ -1364,27 +1379,39 @@ SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
13641379}
13651380
13661381SDValue DAGTypeLegalizer::PromoteIntRes_SExtIntBinOp (SDNode *N) {
1367- // Sign extend the input.
1368- SDValue LHS = SExtPromotedInteger (N-> getOperand ( 0 ));
1369- SDValue RHS = SExtPromotedInteger (N->getOperand (1 ));
1370- if (N->getNumOperands () == 2 )
1382+ if (N-> getNumOperands () == 2 ) {
1383+ // Sign extend the input.
1384+ SDValue LHS = SExtPromotedInteger (N->getOperand (0 ));
1385+ SDValue RHS = SExtPromotedInteger (N->getOperand ( 1 ));
13711386 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS);
1387+ }
13721388 assert (N->getNumOperands () == 4 && " Unexpected number of operands!" );
13731389 assert (N->isVPOpcode () && " Expected VP opcode" );
1390+ SDValue Mask = N->getOperand (2 );
1391+ SDValue EVL = N->getOperand (3 );
1392+ // Sign extend the input.
1393+ SDValue LHS = VPSExtPromotedInteger (N->getOperand (0 ), Mask, EVL);
1394+ SDValue RHS = VPSExtPromotedInteger (N->getOperand (1 ), Mask, EVL);
13741395 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS,
1375- N-> getOperand ( 2 ), N-> getOperand ( 3 ) );
1396+ Mask, EVL );
13761397}
13771398
13781399SDValue DAGTypeLegalizer::PromoteIntRes_ZExtIntBinOp (SDNode *N) {
1379- // Zero extend the input.
1380- SDValue LHS = ZExtPromotedInteger (N-> getOperand ( 0 ));
1381- SDValue RHS = ZExtPromotedInteger (N->getOperand (1 ));
1382- if (N->getNumOperands () == 2 )
1400+ if (N-> getNumOperands () == 2 ) {
1401+ // Zero extend the input.
1402+ SDValue LHS = ZExtPromotedInteger (N->getOperand (0 ));
1403+ SDValue RHS = ZExtPromotedInteger (N->getOperand ( 1 ));
13831404 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS);
1405+ }
13841406 assert (N->getNumOperands () == 4 && " Unexpected number of operands!" );
13851407 assert (N->isVPOpcode () && " Expected VP opcode" );
1408+ // Zero extend the input.
1409+ SDValue Mask = N->getOperand (2 );
1410+ SDValue EVL = N->getOperand (3 );
1411+ SDValue LHS = VPZExtPromotedInteger (N->getOperand (0 ), Mask, EVL);
1412+ SDValue RHS = VPZExtPromotedInteger (N->getOperand (1 ), Mask, EVL);
13861413 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS,
1387- N-> getOperand ( 2 ), N-> getOperand ( 3 ) );
1414+ Mask, EVL );
13881415}
13891416
13901417SDValue DAGTypeLegalizer::PromoteIntRes_UMINUMAX (SDNode *N) {
@@ -1400,27 +1427,43 @@ SDValue DAGTypeLegalizer::PromoteIntRes_UMINUMAX(SDNode *N) {
14001427}
14011428
14021429SDValue DAGTypeLegalizer::PromoteIntRes_SRA (SDNode *N) {
1403- // The input value must be properly sign extended.
1404- SDValue LHS = SExtPromotedInteger (N->getOperand (0 ));
14051430 SDValue RHS = N->getOperand (1 );
1406- if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1407- RHS = ZExtPromotedInteger (RHS);
1408- if (N->getOpcode () != ISD::VP_SRA)
1431+ if (N->getOpcode () != ISD::VP_SRA) {
1432+ // The input value must be properly sign extended.
1433+ SDValue LHS = SExtPromotedInteger (N->getOperand (0 ));
1434+ if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1435+ RHS = ZExtPromotedInteger (RHS);
14091436 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS);
1437+ }
1438+
1439+ SDValue Mask = N->getOperand (2 );
1440+ SDValue EVL = N->getOperand (3 );
1441+ // The input value must be properly sign extended.
1442+ SDValue LHS = VPSExtPromotedInteger (N->getOperand (0 ), Mask, EVL);
1443+ if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1444+ RHS = VPZExtPromotedInteger (RHS, Mask, EVL);
14101445 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS,
1411- N-> getOperand ( 2 ), N-> getOperand ( 3 ) );
1446+ Mask, EVL );
14121447}
14131448
14141449SDValue DAGTypeLegalizer::PromoteIntRes_SRL (SDNode *N) {
1415- // The input value must be properly zero extended.
1416- SDValue LHS = ZExtPromotedInteger (N->getOperand (0 ));
14171450 SDValue RHS = N->getOperand (1 );
1418- if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1419- RHS = ZExtPromotedInteger (RHS);
1420- if (N->getOpcode () != ISD::VP_SRL)
1451+ if (N->getOpcode () != ISD::VP_SRL) {
1452+ // The input value must be properly zero extended.
1453+ SDValue LHS = ZExtPromotedInteger (N->getOperand (0 ));
1454+ if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1455+ RHS = ZExtPromotedInteger (RHS);
14211456 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS);
1457+ }
1458+
1459+ SDValue Mask = N->getOperand (2 );
1460+ SDValue EVL = N->getOperand (3 );
1461+ // The input value must be properly zero extended.
1462+ SDValue LHS = VPZExtPromotedInteger (N->getOperand (0 ), Mask, EVL);
1463+ if (getTypeAction (RHS.getValueType ()) == TargetLowering::TypePromoteInteger)
1464+ RHS = VPZExtPromotedInteger (RHS, Mask, EVL);
14221465 return DAG.getNode (N->getOpcode (), SDLoc (N), LHS.getValueType (), LHS, RHS,
1423- N-> getOperand ( 2 ), N-> getOperand ( 3 ) );
1466+ Mask, EVL );
14241467}
14251468
14261469SDValue DAGTypeLegalizer::PromoteIntRes_Rotate (SDNode *N) {
@@ -1487,7 +1530,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(SDNode *N) {
14871530 SDValue Mask = N->getOperand (3 );
14881531 SDValue EVL = N->getOperand (4 );
14891532 if (getTypeAction (Amt.getValueType ()) == TargetLowering::TypePromoteInteger)
1490- Amt = ZExtPromotedInteger (Amt);
1533+ Amt = VPZExtPromotedInteger (Amt, Mask, EVL );
14911534 EVT AmtVT = Amt.getValueType ();
14921535
14931536 SDLoc DL (N);
0 commit comments