[llvm-commits] [llvm] r63193 - /llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Mon P Wang wangmp at apple.com
Wed Jan 28 00:12:06 PST 2009


Author: wangmp
Date: Wed Jan 28 02:12:05 2009
New Revision: 63193

URL: http://llvm.org/viewvc/llvm-project?rev=63193&view=rev
Log:
Add shuffle splat pattern for x86 sse shifts.

Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=63193&r1=63192&r2=63193&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Jan 28 02:12:05 2009
@@ -7678,28 +7678,32 @@
   if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16)
     return SDValue();
     
-  SDValue  ShAmtOp = N->getOperand(1);
-  if (ShAmtOp.getOpcode() != ISD::BUILD_VECTOR)
-    return SDValue();
-
-  unsigned NumElts = VT.getVectorNumElements();
-  unsigned i = 0;
+  SDValue ShAmtOp = N->getOperand(1);
+  MVT EltVT = VT.getVectorElementType();
   SDValue BaseShAmt;
-  for (; i != NumElts; ++i) {
-    SDValue Arg = ShAmtOp.getOperand(i);
-    if (Arg.getOpcode() == ISD::UNDEF) continue;
-    BaseShAmt = Arg;
-    break;
-  }
-  for (; i != NumElts; ++i) {
-    SDValue Arg = ShAmtOp.getOperand(i);
-    if (Arg.getOpcode() == ISD::UNDEF) continue;
-    if (Arg != BaseShAmt) {
-      return SDValue();
+  if (ShAmtOp.getOpcode() == ISD::BUILD_VECTOR) {
+    unsigned NumElts = VT.getVectorNumElements();
+    unsigned i = 0;
+    for (; i != NumElts; ++i) {
+      SDValue Arg = ShAmtOp.getOperand(i);
+      if (Arg.getOpcode() == ISD::UNDEF) continue;
+      BaseShAmt = Arg;
+      break;
     }
-  }
+    for (; i != NumElts; ++i) {
+      SDValue Arg = ShAmtOp.getOperand(i);
+      if (Arg.getOpcode() == ISD::UNDEF) continue;
+      if (Arg != BaseShAmt) {
+        return SDValue();
+      }
+    }
+  } else if (ShAmtOp.getOpcode() == ISD::VECTOR_SHUFFLE &&
+             isSplatMask(ShAmtOp.getOperand(2).getNode())) {
+      BaseShAmt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, ShAmtOp,
+                              DAG.getIntPtrConstant(0));
+  } else
+    return SDValue();
 
-  MVT EltVT = VT.getVectorElementType();
   if (EltVT.bitsGT(MVT::i32))
     BaseShAmt = DAG.getNode(ISD::TRUNCATE, MVT::i32, BaseShAmt);
   else if (EltVT.bitsLT(MVT::i32))





More information about the llvm-commits mailing list