aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-03-24 06:40:32 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-03-24 06:40:32 +0000
commit5217a5b58cf0c34982671ce823634daf8e2460bb (patch)
treeb4d0f4e487e0e748d991672fc70f51ca10e52d16
parent4822bd4308ad8abf1a7127fe81d1d462f6d7a340 (diff)
All v2f64 shuffle cases can be handled.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27044 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/README.txt4
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp5
2 files changed, 8 insertions, 1 deletions
diff --git a/lib/Target/X86/README.txt b/lib/Target/X86/README.txt
index 1c227d3fd1..0cf645c7a8 100644
--- a/lib/Target/X86/README.txt
+++ b/lib/Target/X86/README.txt
@@ -655,3 +655,7 @@ call _foo
Obviously it would have been better for the first mov (or any op) to store
directly %esp[0] if there are no other uses.
+
+//===---------------------------------------------------------------------===//
+
+Add more vector shuffle special cases using unpckhps and unpcklps.
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 4e209e4554..540fc11c1e 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -2329,7 +2329,10 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1,
DAG.getNode(ISD::UNDEF, V1.getValueType()),
PermMask);
- } else if (NumElems == 2 || X86::isSHUFPMask(PermMask.Val)) {
+ } else if (NumElems == 2) {
+ // All v2f64 cases are handled.
+ return SDOperand();
+ } else if (X86::isSHUFPMask(PermMask.Val)) {
SDOperand Elt = PermMask.getOperand(0);
if (cast<ConstantSDNode>(Elt)->getValue() >= NumElems) {
// Swap the operands and change mask.