@@ -29773,35 +29773,33 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
29773
29773
return convertFromScalableVector(DAG, VT, Op);
29774
29774
}
29775
29775
29776
- auto lowerToRevMergePassthru = [&](unsigned Opcode, SDValue Vec,
29777
- EVT PredVecVT, EVT RevVT) {
29778
- auto Pg = getPredicateForVector(DAG, DL, PredVecVT);
29779
- SDValue RevOp = DAG.getNode(ISD::BITCAST, DL, RevVT, Vec);
29780
- auto Rev = DAG.getNode(Opcode, DL, RevVT, Pg, RevOp, DAG.getUNDEF(RevVT));
29781
- auto Cast = DAG.getNode(ISD::BITCAST, DL, ContainerVT, Rev);
29782
- return convertFromScalableVector(DAG, VT, Cast);
29783
- };
29784
-
29785
29776
unsigned EltSize = VT.getScalarSizeInBits();
29786
- for (unsigned LaneSize : {64U, 32U, 16U}) {
29787
- if (isREVMask(ShuffleMask, EltSize, VT.getVectorNumElements(), LaneSize )) {
29777
+ for (unsigned BlockSize : {64U, 32U, 16U}) {
29778
+ if (isREVMask(ShuffleMask, EltSize, VT.getVectorNumElements(), BlockSize )) {
29788
29779
unsigned RevOp;
29789
29780
if (EltSize == 8)
29790
29781
RevOp = AArch64ISD::BSWAP_MERGE_PASSTHRU;
29791
29782
else if (EltSize == 16)
29792
29783
RevOp = AArch64ISD::REVH_MERGE_PASSTHRU;
29793
29784
else
29794
29785
RevOp = AArch64ISD::REVW_MERGE_PASSTHRU;
29795
- EVT NewVT =
29796
- getPackedSVEVectorVT(EVT::getIntegerVT(*DAG.getContext(), LaneSize));
29797
- return lowerToRevMergePassthru(RevOp, Op1, NewVT, NewVT);
29786
+ EVT BlockedVT =
29787
+ getPackedSVEVectorVT(EVT::getIntegerVT(*DAG.getContext(), BlockSize));
29788
+ SDValue Pg = getPredicateForVector(DAG, DL, BlockedVT);
29789
+ SDValue BlockedOp1 = DAG.getNode(ISD::BITCAST, DL, BlockedVT, Op1);
29790
+ SDValue RevBlocks = DAG.getNode(RevOp, DL, BlockedVT, Pg, BlockedOp1,
29791
+ DAG.getUNDEF(BlockedVT));
29792
+ SDValue Container = DAG.getNode(ISD::BITCAST, DL, ContainerVT, RevBlocks);
29793
+ return convertFromScalableVector(DAG, VT, Container);
29798
29794
}
29799
29795
}
29800
29796
29801
29797
if (Subtarget->hasSVE2p1() && EltSize == 64 &&
29802
29798
isREVMask(ShuffleMask, EltSize, VT.getVectorNumElements(), 128)) {
29803
- return lowerToRevMergePassthru(AArch64ISD::REVD_MERGE_PASSTHRU, Op1, VT,
29804
- ContainerVT);
29799
+ SDValue Pg = getPredicateForVector(DAG, DL, VT);
29800
+ SDValue Revd = DAG.getNode(AArch64ISD::REVD_MERGE_PASSTHRU, DL, ContainerVT,
29801
+ Pg, Op1, DAG.getUNDEF(ContainerVT));
29802
+ return convertFromScalableVector(DAG, VT, Revd);
29805
29803
}
29806
29804
29807
29805
unsigned WhichResult;
0 commit comments