X86: When expanding PCMPGTQ to PCMPGTD we always want to compare the lower halves...
[oota-llvm.git] / lib / Target / X86 / X86ISelLowering.cpp
index 1f35056f21efb08ab5c61a9e565a18859f429e4a..769f90172ba2685d1ff32b27afa4c5db755299dc 100644 (file)
@@ -9358,12 +9358,19 @@ static SDValue LowerVSETCC(SDValue Op, const X86Subtarget *Subtarget,
       Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op1);
 
       // Since SSE has no unsigned integer comparisons, we need to flip the sign
-      // bits of the inputs before performing those operations.
+      // bits of the inputs before performing those operations. The lower
+      // compare is always unsigned.
+      SDValue SB;
       if (FlipSigns) {
-        SDValue SB = DAG.getConstant(0x80000000U, MVT::v4i32);
-        Op0 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op0, SB);
-        Op1 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op1, SB);
+        SB = DAG.getConstant(0x80000000U, MVT::v4i32);
+      } else {
+        SDValue Sign = DAG.getConstant(0x80000000U, MVT::i32);
+        SDValue Zero = DAG.getConstant(0x00000000U, MVT::i32);
+        SB = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
+                         Sign, Zero, Sign, Zero);
       }
+      Op0 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op0, SB);
+      Op1 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op1, SB);
 
       // Emulate PCMPGTQ with (hi1 > hi2) | ((hi1 == hi2) & (lo1 > lo2))
       SDValue GT = DAG.getNode(X86ISD::PCMPGT, dl, MVT::v4i32, Op0, Op1);