@@ -11880,47 +11880,6 @@ static bool isEXTMask(ArrayRef<int> M, EVT VT, bool &ReverseEXT,
11880
11880
return true;
11881
11881
}
11882
11882
11883
- /// isREVMask - Check if a vector shuffle corresponds to a REV
11884
- /// instruction with the specified blocksize. (The order of the elements
11885
- /// within each block of the vector is reversed.)
11886
- static bool isREVMask(ArrayRef<int> M, EVT VT, unsigned BlockSize) {
11887
- assert((BlockSize == 16 || BlockSize == 32 || BlockSize == 64 ||
11888
- BlockSize == 128) &&
11889
- "Only possible block sizes for REV are: 16, 32, 64, 128");
11890
-
11891
- unsigned EltSz = VT.getScalarSizeInBits();
11892
- unsigned NumElts = VT.getVectorNumElements();
11893
- unsigned BlockElts = M[0] + 1;
11894
- // If the first shuffle index is UNDEF, be optimistic.
11895
- if (M[0] < 0)
11896
- BlockElts = BlockSize / EltSz;
11897
-
11898
- if (BlockSize <= EltSz || BlockSize != BlockElts * EltSz)
11899
- return false;
11900
-
11901
- for (unsigned i = 0; i < NumElts; ++i) {
11902
- if (M[i] < 0)
11903
- continue; // ignore UNDEF indices
11904
- if ((unsigned)M[i] != (i - i % BlockElts) + (BlockElts - 1 - i % BlockElts))
11905
- return false;
11906
- }
11907
-
11908
- return true;
11909
- }
11910
-
11911
- static bool isTRNMask(ArrayRef<int> M, EVT VT, unsigned &WhichResult) {
11912
- unsigned NumElts = VT.getVectorNumElements();
11913
- if (NumElts % 2 != 0)
11914
- return false;
11915
- WhichResult = (M[0] == 0 ? 0 : 1);
11916
- for (unsigned i = 0; i < NumElts; i += 2) {
11917
- if ((M[i] >= 0 && (unsigned)M[i] != i + WhichResult) ||
11918
- (M[i + 1] >= 0 && (unsigned)M[i + 1] != i + NumElts + WhichResult))
11919
- return false;
11920
- }
11921
- return true;
11922
- }
11923
-
11924
11883
/// isZIP_v_undef_Mask - Special case of isZIPMask for canonical form of
11925
11884
/// "vector_shuffle v, v", i.e., "vector_shuffle v, undef".
11926
11885
/// Mask is e.g., <0, 0, 1, 1> instead of <0, 4, 1, 5>.
@@ -12585,15 +12544,16 @@ SDValue AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
12585
12544
}
12586
12545
}
12587
12546
12588
- if (isREVMask(ShuffleMask, VT, 64))
12547
+ unsigned NumElts = VT.getVectorNumElements();
12548
+ unsigned EltSize = VT.getScalarSizeInBits();
12549
+ if (isREVMask(ShuffleMask, EltSize, NumElts, 64))
12589
12550
return DAG.getNode(AArch64ISD::REV64, dl, V1.getValueType(), V1, V2);
12590
- if (isREVMask(ShuffleMask, VT , 32))
12551
+ if (isREVMask(ShuffleMask, EltSize, NumElts , 32))
12591
12552
return DAG.getNode(AArch64ISD::REV32, dl, V1.getValueType(), V1, V2);
12592
- if (isREVMask(ShuffleMask, VT , 16))
12553
+ if (isREVMask(ShuffleMask, EltSize, NumElts , 16))
12593
12554
return DAG.getNode(AArch64ISD::REV16, dl, V1.getValueType(), V1, V2);
12594
12555
12595
- if (((VT.getVectorNumElements() == 8 && VT.getScalarSizeInBits() == 16) ||
12596
- (VT.getVectorNumElements() == 16 && VT.getScalarSizeInBits() == 8)) &&
12556
+ if (((NumElts == 8 && EltSize == 16) || (NumElts == 16 && EltSize == 8)) &&
12597
12557
ShuffleVectorInst::isReverseMask(ShuffleMask, ShuffleMask.size())) {
12598
12558
SDValue Rev = DAG.getNode(AArch64ISD::REV64, dl, VT, V1);
12599
12559
return DAG.getNode(AArch64ISD::EXT, dl, VT, Rev, Rev,
@@ -12615,15 +12575,15 @@ SDValue AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
12615
12575
}
12616
12576
12617
12577
unsigned WhichResult;
12618
- if (isZIPMask(ShuffleMask, VT , WhichResult)) {
12578
+ if (isZIPMask(ShuffleMask, NumElts , WhichResult)) {
12619
12579
unsigned Opc = (WhichResult == 0) ? AArch64ISD::ZIP1 : AArch64ISD::ZIP2;
12620
12580
return DAG.getNode(Opc, dl, V1.getValueType(), V1, V2);
12621
12581
}
12622
- if (isUZPMask(ShuffleMask, VT , WhichResult)) {
12582
+ if (isUZPMask(ShuffleMask, NumElts , WhichResult)) {
12623
12583
unsigned Opc = (WhichResult == 0) ? AArch64ISD::UZP1 : AArch64ISD::UZP2;
12624
12584
return DAG.getNode(Opc, dl, V1.getValueType(), V1, V2);
12625
12585
}
12626
- if (isTRNMask(ShuffleMask, VT , WhichResult)) {
12586
+ if (isTRNMask(ShuffleMask, NumElts , WhichResult)) {
12627
12587
unsigned Opc = (WhichResult == 0) ? AArch64ISD::TRN1 : AArch64ISD::TRN2;
12628
12588
return DAG.getNode(Opc, dl, V1.getValueType(), V1, V2);
12629
12589
}
@@ -12655,7 +12615,7 @@ SDValue AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
12655
12615
int SrcLane = ShuffleMask[Anomaly];
12656
12616
if (SrcLane >= NumInputElements) {
12657
12617
SrcVec = V2;
12658
- SrcLane -= VT.getVectorNumElements() ;
12618
+ SrcLane -= NumElts ;
12659
12619
}
12660
12620
SDValue SrcLaneV = DAG.getConstant(SrcLane, dl, MVT::i64);
12661
12621
@@ -12675,7 +12635,6 @@ SDValue AArch64TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op,
12675
12635
12676
12636
// If the shuffle is not directly supported and it has 4 elements, use
12677
12637
// the PerfectShuffle-generated table to synthesize it from other shuffles.
12678
- unsigned NumElts = VT.getVectorNumElements();
12679
12638
if (NumElts == 4) {
12680
12639
unsigned PFIndexes[4];
12681
12640
for (unsigned i = 0; i != 4; ++i) {
@@ -14126,16 +14085,20 @@ bool AArch64TargetLowering::isShuffleMaskLegal(ArrayRef<int> M, EVT VT) const {
14126
14085
int DummyInt;
14127
14086
unsigned DummyUnsigned;
14128
14087
14129
- return (ShuffleVectorSDNode::isSplatMask(&M[0], VT) || isREVMask(M, VT, 64) ||
14130
- isREVMask(M, VT, 32) || isREVMask(M, VT, 16) ||
14088
+ unsigned EltSize = VT.getScalarSizeInBits();
14089
+ unsigned NumElts = VT.getVectorNumElements();
14090
+ return (ShuffleVectorSDNode::isSplatMask(&M[0], VT) ||
14091
+ isREVMask(M, EltSize, NumElts, 64) ||
14092
+ isREVMask(M, EltSize, NumElts, 32) ||
14093
+ isREVMask(M, EltSize, NumElts, 16) ||
14131
14094
isEXTMask(M, VT, DummyBool, DummyUnsigned) ||
14132
- // isTBLMask (M, VT ) || // FIXME: Port TBL support from ARM.
14133
- isTRNMask(M, VT, DummyUnsigned) || isUZPMask(M, VT , DummyUnsigned) ||
14134
- isZIPMask(M, VT , DummyUnsigned) ||
14095
+ isTRNMask (M, NumElts, DummyUnsigned ) ||
14096
+ isUZPMask(M, NumElts , DummyUnsigned) ||
14097
+ isZIPMask(M, NumElts , DummyUnsigned) ||
14135
14098
isTRN_v_undef_Mask(M, VT, DummyUnsigned) ||
14136
14099
isUZP_v_undef_Mask(M, VT, DummyUnsigned) ||
14137
14100
isZIP_v_undef_Mask(M, VT, DummyUnsigned) ||
14138
- isINSMask(M, VT.getVectorNumElements() , DummyBool, DummyInt) ||
14101
+ isINSMask(M, NumElts , DummyBool, DummyInt) ||
14139
14102
isConcatMask(M, VT, VT.getSizeInBits() == 128));
14140
14103
}
14141
14104
@@ -27486,15 +27449,15 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
27486
27449
return convertFromScalableVector(DAG, VT, Op);
27487
27450
}
27488
27451
27452
+ unsigned EltSize = VT.getScalarSizeInBits();
27489
27453
for (unsigned LaneSize : {64U, 32U, 16U}) {
27490
- if (isREVMask(ShuffleMask, VT , LaneSize)) {
27454
+ if (isREVMask(ShuffleMask, EltSize, VT.getVectorNumElements() , LaneSize)) {
27491
27455
EVT NewVT =
27492
27456
getPackedSVEVectorVT(EVT::getIntegerVT(*DAG.getContext(), LaneSize));
27493
27457
unsigned RevOp;
27494
- unsigned EltSz = VT.getScalarSizeInBits();
27495
- if (EltSz == 8)
27458
+ if (EltSize == 8)
27496
27459
RevOp = AArch64ISD::BSWAP_MERGE_PASSTHRU;
27497
- else if (EltSz == 16)
27460
+ else if (EltSize == 16)
27498
27461
RevOp = AArch64ISD::REVH_MERGE_PASSTHRU;
27499
27462
else
27500
27463
RevOp = AArch64ISD::REVW_MERGE_PASSTHRU;
@@ -27506,8 +27469,8 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
27506
27469
}
27507
27470
}
27508
27471
27509
- if (Subtarget->hasSVE2p1() && VT.getScalarSizeInBits() == 64 &&
27510
- isREVMask(ShuffleMask, VT , 128)) {
27472
+ if (Subtarget->hasSVE2p1() && EltSize == 64 &&
27473
+ isREVMask(ShuffleMask, EltSize, VT.getVectorNumElements() , 128)) {
27511
27474
if (!VT.isFloatingPoint())
27512
27475
return LowerToPredicatedOp(Op, DAG, AArch64ISD::REVD_MERGE_PASSTHRU);
27513
27476
@@ -27519,11 +27482,12 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
27519
27482
}
27520
27483
27521
27484
unsigned WhichResult;
27522
- if (isZIPMask(ShuffleMask, VT, WhichResult) && WhichResult == 0)
27485
+ if (isZIPMask(ShuffleMask, VT.getVectorNumElements(), WhichResult) &&
27486
+ WhichResult == 0)
27523
27487
return convertFromScalableVector(
27524
27488
DAG, VT, DAG.getNode(AArch64ISD::ZIP1, DL, ContainerVT, Op1, Op2));
27525
27489
27526
- if (isTRNMask(ShuffleMask, VT, WhichResult)) {
27490
+ if (isTRNMask(ShuffleMask, VT.getVectorNumElements() , WhichResult)) {
27527
27491
unsigned Opc = (WhichResult == 0) ? AArch64ISD::TRN1 : AArch64ISD::TRN2;
27528
27492
return convertFromScalableVector(
27529
27493
DAG, VT, DAG.getNode(Opc, DL, ContainerVT, Op1, Op2));
@@ -27566,11 +27530,12 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
27566
27530
return convertFromScalableVector(DAG, VT, Op);
27567
27531
}
27568
27532
27569
- if (isZIPMask(ShuffleMask, VT, WhichResult) && WhichResult != 0)
27533
+ if (isZIPMask(ShuffleMask, VT.getVectorNumElements(), WhichResult) &&
27534
+ WhichResult != 0)
27570
27535
return convertFromScalableVector(
27571
27536
DAG, VT, DAG.getNode(AArch64ISD::ZIP2, DL, ContainerVT, Op1, Op2));
27572
27537
27573
- if (isUZPMask(ShuffleMask, VT, WhichResult)) {
27538
+ if (isUZPMask(ShuffleMask, VT.getVectorNumElements() , WhichResult)) {
27574
27539
unsigned Opc = (WhichResult == 0) ? AArch64ISD::UZP1 : AArch64ISD::UZP2;
27575
27540
return convertFromScalableVector(
27576
27541
DAG, VT, DAG.getNode(Opc, DL, ContainerVT, Op1, Op2));
0 commit comments