diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 36 |
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(); } |

