summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2017-10-01 18:43:48 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2017-10-01 18:43:48 +0000
commitdf23a2700d3c28ddafc05bf1e069bf2c23feadb4 (patch)
tree37c55eca212c216bce4e323183017331b66ac4db /llvm/lib/Target
parent4f255ad6a0ce17f02c3149dd84ab3e7eeac6055d (diff)
downloadbcm5719-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.cpp19
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;
OpenPOWER on IntegriCloud