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

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Tue Aug 31 14:38:49 PDT 2010


Author: bruno
Date: Tue Aug 31 16:38:49 2010
New Revision: 112644

URL: http://llvm.org/viewvc/llvm-project?rev=112644&view=rev
Log:
Use MOVHLPS node instead of matching using movhlps and movhlps_undef pattern fragments

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=112644&r1=112643&r2=112644&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Tue Aug 31 16:38:49 2010
@@ -2585,6 +2585,7 @@
   case X86ISD::SHUFPD:
   case X86ISD::SHUFPS:
   case X86ISD::MOVLHPS:
+  case X86ISD::MOVHLPS:
   case X86ISD::MOVSS:
   case X86ISD::MOVSD:
   case X86ISD::PUNPCKLDQ:
@@ -2624,6 +2625,7 @@
   default: llvm_unreachable("Unknown x86 shuffle node");
   case X86ISD::MOVLHPS:
   case X86ISD::MOVLHPD:
+  case X86ISD::MOVHLPS:
   case X86ISD::MOVSS:
   case X86ISD::MOVSD:
   case X86ISD::PUNPCKLDQ:
@@ -5021,6 +5023,22 @@
   return getTargetShuffleNode(X86ISD::MOVLHPS, dl, VT, V1, V2, DAG);
 }
 
+static
+SDValue getMOVHighToLow(SDValue &Op, DebugLoc &dl, SelectionDAG &DAG) {
+  SDValue V1 = Op.getOperand(0);
+  SDValue V2 = Op.getOperand(1);
+  EVT VT = Op.getValueType();
+
+  assert((VT == MVT::v4i32 || VT == MVT::v4f32) &&
+         "unsupported shuffle type");
+
+  if (V2.getOpcode() == ISD::UNDEF)
+    V2 = V1;
+
+  // v4i32 or v4f32
+  return getTargetShuffleNode(X86ISD::MOVHLPS, dl, VT, V1, V2, DAG);
+}
+
 SDValue
 X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const {
   ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);
@@ -5131,6 +5149,9 @@
     if (X86::isMOVLHPSMask(SVOp) && !X86::isUNPCKLMask(SVOp))
       return getMOVLowToHigh(Op, dl, DAG, HasSSE2);
 
+    if (X86::isMOVHLPSMask(SVOp))
+      return getMOVHighToLow(Op, dl, DAG);
+
     if (X86::isMOVSHDUPMask(SVOp) ||
         X86::isMOVSLDUPMask(SVOp) ||
         X86::isMOVHLPSMask(SVOp) ||





More information about the llvm-commits mailing list