Skip to content

Commit 60ef6c9

Browse files
committed
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
1 parent 6e4a9c1 commit 60ef6c9

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

lib/Target/X86/X86ISelLowering.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9358,12 +9358,19 @@ static SDValue LowerVSETCC(SDValue Op, const X86Subtarget *Subtarget,
93589358
Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op1);
93599359

93609360
// Since SSE has no unsigned integer comparisons, we need to flip the sign
9361-
// bits of the inputs before performing those operations.
9361+
// bits of the inputs before performing those operations. The lower
9362+
// compare is always unsigned.
9363+
SDValue SB;
93629364
if (FlipSigns) {
9363-
SDValue SB = DAG.getConstant(0x80000000U, MVT::v4i32);
9364-
Op0 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op0, SB);
9365-
Op1 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op1, SB);
9365+
SB = DAG.getConstant(0x80000000U, MVT::v4i32);
9366+
} else {
9367+
SDValue Sign = DAG.getConstant(0x80000000U, MVT::i32);
9368+
SDValue Zero = DAG.getConstant(0x00000000U, MVT::i32);
9369+
SB = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32,
9370+
Sign, Zero, Sign, Zero);
93669371
}
9372+
Op0 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op0, SB);
9373+
Op1 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op1, SB);
93679374

93689375
// Emulate PCMPGTQ with (hi1 > hi2) | ((hi1 == hi2) & (lo1 > lo2))
93699376
SDValue GT = DAG.getNode(X86ISD::PCMPGT, dl, MVT::v4i32, Op0, Op1);

test/CodeGen/X86/vec_compare.ll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,15 @@ define <2 x i64> @test6(<2 x i64> %A, <2 x i64> %B) nounwind {
6767
}
6868

6969
define <2 x i64> @test7(<2 x i64> %A, <2 x i64> %B) nounwind {
70+
; CHECK: [[CONSTSEG:[A-Z0-9_]*]]:
71+
; CHECK: .long 2147483648
72+
; CHECK-NEXT: .long 0
73+
; CHECK-NEXT: .long 2147483648
74+
; CHECK-NEXT: .long 0
7075
; CHECK: test7:
76+
; CHECK: movdqa [[CONSTSEG]], [[CONSTREG:%xmm[0-9]*]]
77+
; CHECK: pxor [[CONSTREG]]
78+
; CHECK: pxor [[CONSTREG]]
7179
; CHECK: pcmpgtd %xmm1
7280
; CHECK: pshufd $-96
7381
; CHECK: pcmpeqd
@@ -83,6 +91,8 @@ define <2 x i64> @test7(<2 x i64> %A, <2 x i64> %B) nounwind {
8391

8492
define <2 x i64> @test8(<2 x i64> %A, <2 x i64> %B) nounwind {
8593
; CHECK: test8:
94+
; CHECK: pxor
95+
; CHECK: pxor
8696
; CHECK: pcmpgtd %xmm0
8797
; CHECK: pshufd $-96
8898
; CHECK: pcmpeqd
@@ -98,6 +108,8 @@ define <2 x i64> @test8(<2 x i64> %A, <2 x i64> %B) nounwind {
98108

99109
define <2 x i64> @test9(<2 x i64> %A, <2 x i64> %B) nounwind {
100110
; CHECK: test9:
111+
; CHECK: pxor
112+
; CHECK: pxor
101113
; CHECK: pcmpgtd %xmm0
102114
; CHECK: pshufd $-96
103115
; CHECK: pcmpeqd
@@ -115,6 +127,8 @@ define <2 x i64> @test9(<2 x i64> %A, <2 x i64> %B) nounwind {
115127

116128
define <2 x i64> @test10(<2 x i64> %A, <2 x i64> %B) nounwind {
117129
; CHECK: test10:
130+
; CHECK: pxor
131+
; CHECK: pxor
118132
; CHECK: pcmpgtd %xmm1
119133
; CHECK: pshufd $-96
120134
; CHECK: pcmpeqd

0 commit comments

Comments
 (0)