summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp36
1 files changed, 24 insertions, 12 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index a6cd747999c..08c944ca696 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -8683,24 +8683,36 @@ static SDValue lowerVectorShuffleWithPACK(const SDLoc &DL, MVT VT,
MVT PackSVT = MVT::getIntegerVT(BitSize * 2);
MVT PackVT = MVT::getVectorVT(PackSVT, NumElts / 2);
- // TODO - Add support for unary packs.
- SmallVector<int, 32> BinaryMask;
- createPackShuffleMask(VT, BinaryMask, false);
-
- if (isShuffleEquivalent(V1, V2, Mask, BinaryMask)) {
- SDValue VV1 = DAG.getBitcast(PackVT, V1);
- SDValue VV2 = DAG.getBitcast(PackVT, V2);
- if ((V1.isUndef() || DAG.ComputeNumSignBits(VV1) > BitSize) &&
- (V2.isUndef() || DAG.ComputeNumSignBits(VV2) > BitSize))
+ auto LowerWithPACK = [&](SDValue N1, SDValue N2) {
+ SDValue VV1 = DAG.getBitcast(PackVT, N1);
+ SDValue VV2 = DAG.getBitcast(PackVT, N2);
+ if ((N1.isUndef() || DAG.ComputeNumSignBits(VV1) > BitSize) &&
+ (N2.isUndef() || DAG.ComputeNumSignBits(VV2) > BitSize))
return DAG.getNode(X86ISD::PACKSS, DL, VT, VV1, VV2);
if (Subtarget.hasSSE41() || PackSVT == MVT::i16) {
APInt ZeroMask = APInt::getHighBitsSet(BitSize * 2, BitSize);
- if ((V1.isUndef() || DAG.MaskedValueIsZero(VV1, ZeroMask)) &&
- (V2.isUndef() || DAG.MaskedValueIsZero(VV2, ZeroMask)))
+ if ((N1.isUndef() || DAG.MaskedValueIsZero(VV1, ZeroMask)) &&
+ (N2.isUndef() || DAG.MaskedValueIsZero(VV2, ZeroMask)))
return DAG.getNode(X86ISD::PACKUS, DL, VT, VV1, VV2);
}
- }
+
+ return SDValue();
+ };
+
+ // Try binary shuffle.
+ SmallVector<int, 32> BinaryMask;
+ createPackShuffleMask(VT, BinaryMask, false);
+ if (isShuffleEquivalent(V1, V2, Mask, BinaryMask))
+ if (SDValue Pack = LowerWithPACK(V1, V2))
+ return Pack;
+
+ // Try unary shuffle.
+ SmallVector<int, 32> UnaryMask;
+ createPackShuffleMask(VT, UnaryMask, true);
+ if (isShuffleEquivalent(V1, V2, Mask, UnaryMask))
+ if (SDValue Pack = LowerWithPACK(V1, V1))
+ return Pack;
return SDValue();
}
OpenPOWER on IntegriCloud