diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2017-10-01 18:43:48 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2017-10-01 18:43:48 +0000 |
| commit | df23a2700d3c28ddafc05bf1e069bf2c23feadb4 (patch) | |
| tree | 37c55eca212c216bce4e323183017331b66ac4db /llvm/lib/Target | |
| parent | 4f255ad6a0ce17f02c3149dd84ab3e7eeac6055d (diff) | |
| download | bcm5719-llvm-df23a2700d3c28ddafc05bf1e069bf2c23feadb4.tar.gz bcm5719-llvm-df23a2700d3c28ddafc05bf1e069bf2c23feadb4.zip | |
[X86][SSE] Add faux shuffle combining support for PACKUS
llvm-svn: 314631
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index e68a6ed2a84..6abf46f470f 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5931,7 +5931,8 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, Mask.push_back(i == InIdx ? NumElts + ExIdx : i); return true; } - case X86ISD::PACKSS: { + case X86ISD::PACKSS: + case X86ISD::PACKUS: { SDValue N0 = N.getOperand(0); SDValue N1 = N.getOperand(1); assert(N0.getValueType().getVectorNumElements() == (NumElts / 2) && @@ -5940,9 +5941,19 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, // If we know input saturation won't happen we can treat this // as a truncation shuffle. - if (DAG.ComputeNumSignBits(N0) <= NumBitsPerElt || - DAG.ComputeNumSignBits(N1) <= NumBitsPerElt) - return false; + if (Opcode == X86ISD::PACKSS) { + if (DAG.ComputeNumSignBits(N0) <= NumBitsPerElt || + DAG.ComputeNumSignBits(N1) <= NumBitsPerElt) + return false; + } else { + KnownBits Known0, Known1; + DAG.computeKnownBits(N0, Known0); + if (Known0.countMinLeadingZeros() < NumBitsPerElt) + return false; + DAG.computeKnownBits(N1, Known1); + if (Known1.countMinLeadingZeros() < NumBitsPerElt) + return false; + } bool IsUnary = (N0 == N1); unsigned Offset = IsUnary ? 0 : NumElts; |

