- More shuffle related bug fixes.
- Whenever possible use ops of the right packed types for vector shuffles /
splats.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27246 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 8247167..2ac4955 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -2403,43 +2403,18 @@
return SDOperand();
// PSHUFD's 2nd vector must be undef.
- if (MVT::isInteger(VT) && X86::isPSHUFDMask(PermMask.Val))
- if (V2.getOpcode() == ISD::UNDEF)
- return SDOperand();
- else
+ if (MVT::isInteger(VT) && X86::isPSHUFDMask(PermMask.Val)) {
+ if (V2.getOpcode() != ISD::UNDEF)
return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1,
- DAG.getNode(ISD::UNDEF, V1.getValueType()),
- PermMask);
+ DAG.getNode(ISD::UNDEF, V1.getValueType()),PermMask);
+ return SDOperand();
+ }
if (NumElems == 2 ||
X86::isSplatMask(PermMask.Val) ||
X86::isSHUFPMask(PermMask.Val)) {
return NormalizeVectorShuffle(V1, V2, PermMask, VT, DAG);
}
-#if 0
- else if (X86::isSplatMask(PermMask.Val)) {
- // Handle splat cases.
- if (V2.getOpcode() == ISD::UNDEF)
- // Leave the VECTOR_SHUFFLE alone. It matches SHUFP*.
- return SDOperand();
- else
- // Make it match SHUFP* or UNPCKLPD. Second vector is undef since it's
- // not needed.
- return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1,
- DAG.getNode(ISD::UNDEF, V1.getValueType()),
- PermMask);
- } else if (X86::isPSHUFDMask(PermMask.Val)) {
- if (V2.getOpcode() == ISD::UNDEF)
- // Leave the VECTOR_SHUFFLE alone. It matches PSHUFD.
- return SDOperand();
- else
- // Make it match PSHUFD. Second vector is undef since it's not needed.
- return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1,
- DAG.getNode(ISD::UNDEF, V1.getValueType()),
- PermMask);
- } else if (X86::isSHUFPMask(PermMask.Val))
- return NormalizeVectorShuffle(V1, V2, PermMask, VT, DAG);
-#endif
assert(0 && "Unexpected VECTOR_SHUFFLE to lower");
abort();