@@ -16285,38 +16285,8 @@ static SDValue PerformVECREDUCE_ADDCombine(SDNode *N, SelectionDAG &DAG,
1628516285 SDValue(Node.getNode(), 1));
1628616286 };
1628716287
16288- if (SDValue A = IsVADDV(MVT::i32, ISD::SIGN_EXTEND, {MVT::v8i16, MVT::v16i8}))
16289- return DAG.getNode(ARMISD::VADDVs, dl, ResVT, A);
16290- if (SDValue A = IsVADDV(MVT::i32, ISD::ZERO_EXTEND, {MVT::v8i16, MVT::v16i8}))
16291- return DAG.getNode(ARMISD::VADDVu, dl, ResVT, A);
16292- if (SDValue A = IsVADDV(MVT::i64, ISD::SIGN_EXTEND, {MVT::v4i32}))
16293- return Create64bitNode(ARMISD::VADDLVs, {A});
16294- if (SDValue A = IsVADDV(MVT::i64, ISD::ZERO_EXTEND, {MVT::v4i32}))
16295- return Create64bitNode(ARMISD::VADDLVu, {A});
16296- if (SDValue A = IsVADDV(MVT::i16, ISD::SIGN_EXTEND, {MVT::v16i8}))
16297- return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16298- DAG.getNode(ARMISD::VADDVs, dl, MVT::i32, A));
16299- if (SDValue A = IsVADDV(MVT::i16, ISD::ZERO_EXTEND, {MVT::v16i8}))
16300- return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16301- DAG.getNode(ARMISD::VADDVu, dl, MVT::i32, A));
16302-
16303- SDValue Mask;
16304- if (SDValue A = IsPredVADDV(MVT::i32, ISD::SIGN_EXTEND, {MVT::v8i16, MVT::v16i8}, Mask))
16305- return DAG.getNode(ARMISD::VADDVps, dl, ResVT, A, Mask);
16306- if (SDValue A = IsPredVADDV(MVT::i32, ISD::ZERO_EXTEND, {MVT::v8i16, MVT::v16i8}, Mask))
16307- return DAG.getNode(ARMISD::VADDVpu, dl, ResVT, A, Mask);
16308- if (SDValue A = IsPredVADDV(MVT::i64, ISD::SIGN_EXTEND, {MVT::v4i32}, Mask))
16309- return Create64bitNode(ARMISD::VADDLVps, {A, Mask});
16310- if (SDValue A = IsPredVADDV(MVT::i64, ISD::ZERO_EXTEND, {MVT::v4i32}, Mask))
16311- return Create64bitNode(ARMISD::VADDLVpu, {A, Mask});
16312- if (SDValue A = IsPredVADDV(MVT::i16, ISD::SIGN_EXTEND, {MVT::v16i8}, Mask))
16313- return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16314- DAG.getNode(ARMISD::VADDVps, dl, MVT::i32, A, Mask));
16315- if (SDValue A = IsPredVADDV(MVT::i16, ISD::ZERO_EXTEND, {MVT::v16i8}, Mask))
16316- return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16317- DAG.getNode(ARMISD::VADDVpu, dl, MVT::i32, A, Mask));
16318-
1631916288 SDValue A, B;
16289+ SDValue Mask;
1632016290 if (IsVMLAV(MVT::i32, ISD::SIGN_EXTEND, {MVT::v8i16, MVT::v16i8}, A, B))
1632116291 return DAG.getNode(ARMISD::VMLAVs, dl, ResVT, A, B);
1632216292 if (IsVMLAV(MVT::i32, ISD::ZERO_EXTEND, {MVT::v8i16, MVT::v16i8}, A, B))
@@ -16353,6 +16323,36 @@ static SDValue PerformVECREDUCE_ADDCombine(SDNode *N, SelectionDAG &DAG,
1635316323 return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
1635416324 DAG.getNode(ARMISD::VMLAVpu, dl, MVT::i32, A, B, Mask));
1635516325
16326+ if (SDValue A = IsVADDV(MVT::i32, ISD::SIGN_EXTEND, {MVT::v8i16, MVT::v16i8}))
16327+ return DAG.getNode(ARMISD::VADDVs, dl, ResVT, A);
16328+ if (SDValue A = IsVADDV(MVT::i32, ISD::ZERO_EXTEND, {MVT::v8i16, MVT::v16i8}))
16329+ return DAG.getNode(ARMISD::VADDVu, dl, ResVT, A);
16330+ if (SDValue A = IsVADDV(MVT::i64, ISD::SIGN_EXTEND, {MVT::v4i32}))
16331+ return Create64bitNode(ARMISD::VADDLVs, {A});
16332+ if (SDValue A = IsVADDV(MVT::i64, ISD::ZERO_EXTEND, {MVT::v4i32}))
16333+ return Create64bitNode(ARMISD::VADDLVu, {A});
16334+ if (SDValue A = IsVADDV(MVT::i16, ISD::SIGN_EXTEND, {MVT::v16i8}))
16335+ return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16336+ DAG.getNode(ARMISD::VADDVs, dl, MVT::i32, A));
16337+ if (SDValue A = IsVADDV(MVT::i16, ISD::ZERO_EXTEND, {MVT::v16i8}))
16338+ return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16339+ DAG.getNode(ARMISD::VADDVu, dl, MVT::i32, A));
16340+
16341+ if (SDValue A = IsPredVADDV(MVT::i32, ISD::SIGN_EXTEND, {MVT::v8i16, MVT::v16i8}, Mask))
16342+ return DAG.getNode(ARMISD::VADDVps, dl, ResVT, A, Mask);
16343+ if (SDValue A = IsPredVADDV(MVT::i32, ISD::ZERO_EXTEND, {MVT::v8i16, MVT::v16i8}, Mask))
16344+ return DAG.getNode(ARMISD::VADDVpu, dl, ResVT, A, Mask);
16345+ if (SDValue A = IsPredVADDV(MVT::i64, ISD::SIGN_EXTEND, {MVT::v4i32}, Mask))
16346+ return Create64bitNode(ARMISD::VADDLVps, {A, Mask});
16347+ if (SDValue A = IsPredVADDV(MVT::i64, ISD::ZERO_EXTEND, {MVT::v4i32}, Mask))
16348+ return Create64bitNode(ARMISD::VADDLVpu, {A, Mask});
16349+ if (SDValue A = IsPredVADDV(MVT::i16, ISD::SIGN_EXTEND, {MVT::v16i8}, Mask))
16350+ return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16351+ DAG.getNode(ARMISD::VADDVps, dl, MVT::i32, A, Mask));
16352+ if (SDValue A = IsPredVADDV(MVT::i16, ISD::ZERO_EXTEND, {MVT::v16i8}, Mask))
16353+ return DAG.getNode(ISD::TRUNCATE, dl, ResVT,
16354+ DAG.getNode(ARMISD::VADDVpu, dl, MVT::i32, A, Mask));
16355+
1635616356 // Some complications. We can get a case where the two inputs of the mul are
1635716357 // the same, then the output sext will have been helpfully converted to a
1635816358 // zext. Turn it back.
0 commit comments