summaryrefslogtreecommitdiff
path: root/lib/Target/X86
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2013-05-22 17:01:12 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2013-05-22 17:01:12 +0000
commit60ef6c9295844038406c6083b67ea24b3646f2dd (patch)
treec539a166c46559d9958ada6ca6ba02a0cd4ad2d9 /lib/Target/X86
parent6e4a9c14f6e59b075b3a24825d2dc7dc9e163281 (diff)
downloadllvm-60ef6c9295844038406c6083b67ea24b3646f2dd.tar.gz
llvm-60ef6c9295844038406c6083b67ea24b3646f2dd.tar.bz2
llvm-60ef6c9295844038406c6083b67ea24b3646f2dd.tar.xz
X86: When expanding PCMPGTQ to PCMPGTD we always want to compare the lower halves as unsigned.
Take #2 on fixing PR15977. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182486 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 1f35056f21..769f90172b 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/lib/Target/X86/X86ISelLowering.cpp
@@ -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);