xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/setcc-combine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_eq_1(<4 x i32> %A, <4 x i32> %B) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_eq_1:
5*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm0, %xmm1
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor {{.*}}(%rip), %xmm1
7*9880d681SAndroid Build Coastguard Worker; CHECK: retq
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %A, %B
10*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
11*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
12*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
13*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
14*9880d681SAndroid Build Coastguard Worker  ret i32 %1
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i32 @test_ne_1(<4 x i32> %A, <4 x i32> %B) {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ne_1:
19*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm0, %xmm1
20*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pxor
21*9880d681SAndroid Build Coastguard Worker; CHECK: retq
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %A, %B
24*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
25*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
26*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
27*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
28*9880d681SAndroid Build Coastguard Worker  ret i32 %1
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine i32 @test_le_1(<4 x i32> %A, <4 x i32> %B) {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_le_1:
33*9880d681SAndroid Build Coastguard Worker; CHECK: movl $-1, %eax
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
35*9880d681SAndroid Build Coastguard Workerentry:
36*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %A, %B
37*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
38*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sle <4 x i32> %sext, zeroinitializer
39*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
40*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
41*9880d681SAndroid Build Coastguard Worker  ret i32 %1
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine i32 @test_ge_1(<4 x i32> %A, <4 x i32> %B) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ge_1:
46*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm0, %xmm1
47*9880d681SAndroid Build Coastguard Worker; CHECK: pxor {{.*}}(%rip), %xmm1
48*9880d681SAndroid Build Coastguard Worker; CHECK: retq
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %A, %B
51*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
52*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sge <4 x i32> %sext, zeroinitializer
53*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
54*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
55*9880d681SAndroid Build Coastguard Worker  ret i32 %1
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workerdefine i32 @test_lt_1(<4 x i32> %A, <4 x i32> %B) {
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lt_1:
60*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm0, %xmm1
61*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pxor
62*9880d681SAndroid Build Coastguard Worker; CHECK: retq
63*9880d681SAndroid Build Coastguard Workerentry:
64*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %A, %B
65*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
66*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp slt <4 x i32> %sext, zeroinitializer
67*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp, i32 1
68*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
69*9880d681SAndroid Build Coastguard Worker  ret i32 %1
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine i32 @test_gt_1(<4 x i32> %A, <4 x i32> %B) {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_gt_1:
74*9880d681SAndroid Build Coastguard Worker; CHECK: xorl %eax, %eax
75*9880d681SAndroid Build Coastguard Worker; CHECK: retq
76*9880d681SAndroid Build Coastguard Workerentry:
77*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %A, %B
78*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
79*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt <4 x i32> %sext, zeroinitializer
80*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
81*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
82*9880d681SAndroid Build Coastguard Worker  ret i32 %1
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine i32 @test_eq_2(<4 x i32> %A, <4 x i32> %B) {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_eq_2:
87*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm1, %xmm0
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor {{.*}}(%rip), %xmm0
89*9880d681SAndroid Build Coastguard Worker; CHECK: retq
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %B, %A
92*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
93*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
94*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
95*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
96*9880d681SAndroid Build Coastguard Worker  ret i32 %1
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine i32 @test_ne_2(<4 x i32> %A, <4 x i32> %B) {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ne_2:
101*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm1, %xmm0
102*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pxor
103*9880d681SAndroid Build Coastguard Worker; CHECK: retq
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %B, %A
106*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
107*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
108*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
109*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
110*9880d681SAndroid Build Coastguard Worker  ret i32 %1
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine i32 @test_le_2(<4 x i32> %A, <4 x i32> %B) {
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_le_2:
115*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm1, %xmm0
116*9880d681SAndroid Build Coastguard Worker; CHECK: pxor {{.*}}(%rip), %xmm0
117*9880d681SAndroid Build Coastguard Worker; CHECK: retq
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %B, %A
120*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
121*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sle <4 x i32> zeroinitializer, %sext
122*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
123*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
124*9880d681SAndroid Build Coastguard Worker  ret i32 %1
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine i32 @test_ge_2(<4 x i32> %A, <4 x i32> %B) {
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ge_2:
129*9880d681SAndroid Build Coastguard Worker; CHECK: movl $-1, %eax
130*9880d681SAndroid Build Coastguard Worker; CHECK: retq
131*9880d681SAndroid Build Coastguard Workerentry:
132*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %B, %A
133*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
134*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sge <4 x i32> zeroinitializer, %sext
135*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
136*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
137*9880d681SAndroid Build Coastguard Worker  ret i32 %1
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine i32 @test_lt_2(<4 x i32> %A, <4 x i32> %B) {
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lt_2:
142*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm1, %xmm0
143*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pxor
144*9880d681SAndroid Build Coastguard Worker; CHECK: retq
145*9880d681SAndroid Build Coastguard Workerentry:
146*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %B, %A
147*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
148*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp slt <4 x i32> zeroinitializer, %sext
149*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp, i32 1
150*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
151*9880d681SAndroid Build Coastguard Worker  ret i32 %1
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdefine i32 @test_gt_2(<4 x i32> %A, <4 x i32> %B) {
155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_gt_2:
156*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtd %xmm1, %xmm0
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pxor
158*9880d681SAndroid Build Coastguard Worker; CHECK: retq
159*9880d681SAndroid Build Coastguard Workerentry:
160*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt <4 x i32> %B, %A
161*9880d681SAndroid Build Coastguard Worker  %sext = sext <4 x i1> %cmp to <4 x i32>
162*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt <4 x i32> zeroinitializer, %sext
163*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i1> %cmp1, i32 1
164*9880d681SAndroid Build Coastguard Worker  %1 = sext i1 %0 to i32
165*9880d681SAndroid Build Coastguard Worker  ret i32 %1
166*9880d681SAndroid Build Coastguard Worker}
167