OSDN Git Service

Add shuffle splat pattern for x86 sse shifts.
authorMon P Wang <wangmp@apple.com>
Wed, 28 Jan 2009 08:12:05 +0000 (08:12 +0000)
committerMon P Wang <wangmp@apple.com>
Wed, 28 Jan 2009 08:12:05 +0000 (08:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63193 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp

index 406b237..f48d752 100644 (file)
@@ -7678,28 +7678,32 @@ static SDValue PerformShiftCombine(SDNode* N, SelectionDAG &DAG,
   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))