xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-fast-isel-icmp.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -fast-isel-abort=1 -verify-machineinstrs -mtriple=arm64-apple-darwin < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_imm(i32 %a) nounwind ssp {
4*9880d681SAndroid Build Coastguard Workerentry:
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_imm
6*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, #31
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, eq
8*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, 31
9*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
10*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_neg_imm(i32 %a) nounwind ssp {
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_neg_imm
16*9880d681SAndroid Build Coastguard Worker; CHECK:       cmn w0, #7
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, eq
18*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, -7
19*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
20*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_i32(i32 %a, i32 %b) nounwind ssp {
24*9880d681SAndroid Build Coastguard Workerentry:
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_i32
26*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, eq
28*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %a, %b
29*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
30*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ne(i32 %a, i32 %b) nounwind ssp {
34*9880d681SAndroid Build Coastguard Workerentry:
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ne
36*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, ne
38*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %a, %b
39*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
40*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_eq_ptr(i8* %a) {
44*9880d681SAndroid Build Coastguard Workerentry:
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_ptr
46*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp x0, #0
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset {{.+}}, eq
48*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8* %a, null
49*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
50*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ne_ptr(i8* %a) {
54*9880d681SAndroid Build Coastguard Workerentry:
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ne_ptr
56*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp x0, #0
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset {{.+}}, ne
58*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8* %a, null
59*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
60*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ugt(i32 %a, i32 %b) nounwind ssp {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ugt
66*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, hi
68*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %a, %b
69*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
70*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_uge(i32 %a, i32 %b) nounwind ssp {
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_uge
76*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, hs
78*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %a, %b
79*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
80*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ult(i32 %a, i32 %b) nounwind ssp {
84*9880d681SAndroid Build Coastguard Workerentry:
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ult
86*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, lo
88*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %a, %b
89*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
90*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_ule(i32 %a, i32 %b) nounwind ssp {
94*9880d681SAndroid Build Coastguard Workerentry:
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_ule
96*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, ls
98*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ule i32 %a, %b
99*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
100*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_sgt(i32 %a, i32 %b) nounwind ssp {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_sgt
106*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, gt
108*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %a, %b
109*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
110*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_sge(i32 %a, i32 %b) nounwind ssp {
114*9880d681SAndroid Build Coastguard Workerentry:
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_sge
116*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, ge
118*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sge i32 %a, %b
119*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
120*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_slt(i32 %a, i32 %b) nounwind ssp {
124*9880d681SAndroid Build Coastguard Workerentry:
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_slt
126*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, lt
128*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %a, %b
129*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
130*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_sle(i32 %a, i32 %b) nounwind ssp {
134*9880d681SAndroid Build Coastguard Workerentry:
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_sle
136*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, le
138*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %a, %b
139*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
140*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i64(i64 %a, i64 %b) nounwind ssp {
144*9880d681SAndroid Build Coastguard Workerentry:
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i64
146*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp  x0, x1
147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w{{[0-9]+}}, le
148*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i64 %a, %b
149*9880d681SAndroid Build Coastguard Worker  %conv = zext i1 %cmp to i32
150*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @icmp_eq_i16(i16 %a, i16 %b) nounwind ssp {
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_i16
156*9880d681SAndroid Build Coastguard Worker; CHECK:       sxth w0, w0
157*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp w0, w1, sxth
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, eq
159*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i16 %a, %b
160*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @icmp_eq_i8(i8 %a, i8 %b) nounwind ssp {
164*9880d681SAndroid Build Coastguard Workerentry:
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_eq_i8
166*9880d681SAndroid Build Coastguard Worker; CHECK:       sxtb w0, w0
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmp w0, w1, sxtb
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, eq
169*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %a, %b
170*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i16_unsigned(i16 %a, i16 %b) nounwind {
174*9880d681SAndroid Build Coastguard Workerentry:
175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i16_unsigned
176*9880d681SAndroid Build Coastguard Worker; CHECK:       uxth w0, w0
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmp w0, w1, uxth
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, lo
179*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i16 %a, %b
180*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i1 %cmp to i32
181*9880d681SAndroid Build Coastguard Worker  ret i32 %conv2
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i8_signed(i8 %a, i8 %b) nounwind {
185*9880d681SAndroid Build Coastguard Workerentry:
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i8_signed
187*9880d681SAndroid Build Coastguard Worker; CHECK:       sxtb w0, w0
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmp w0, w1, sxtb
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, gt
190*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i8 %a, %b
191*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i1 %cmp to i32
192*9880d681SAndroid Build Coastguard Worker  ret i32 %conv2
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i1_signed(i1 %a, i1 %b) nounwind {
196*9880d681SAndroid Build Coastguard Workerentry:
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i1_signed
198*9880d681SAndroid Build Coastguard Worker; CHECK:       sbfx [[REG1:w[0-9]+]], w0, #0, #1
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  sbfx [[REG2:w[0-9]+]], w1, #0, #1
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmp  [[REG1]], [[REG2]]
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, gt
202*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i1 %a, %b
203*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i1 %cmp to i32
204*9880d681SAndroid Build Coastguard Worker  ret i32 %conv2
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i16_signed_const(i16 %a) nounwind {
208*9880d681SAndroid Build Coastguard Workerentry:
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i16_signed_const
210*9880d681SAndroid Build Coastguard Worker; CHECK:       sxth w0, w0
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmn w0, #233
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, lt
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and w0, w0, #0x1
214*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i16 %a, -233
215*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i1 %cmp to i32
216*9880d681SAndroid Build Coastguard Worker  ret i32 %conv2
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i8_signed_const(i8 %a) nounwind {
220*9880d681SAndroid Build Coastguard Workerentry:
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i8_signed_const
222*9880d681SAndroid Build Coastguard Worker; CHECK:       sxtb w0, w0
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmp w0, #124
224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, gt
225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and w0, w0, #0x1
226*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i8 %a, 124
227*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i1 %cmp to i32
228*9880d681SAndroid Build Coastguard Worker  ret i32 %conv2
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdefine i32 @icmp_i1_unsigned_const(i1 %a) nounwind {
232*9880d681SAndroid Build Coastguard Workerentry:
233*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_i1_unsigned_const
234*9880d681SAndroid Build Coastguard Worker; CHECK:       and w0, w0, #0x1
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cmp w0, #0
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  cset w0, lo
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  and w0, w0, #0x1
238*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i1 %a, 0
239*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i1 %cmp to i32
240*9880d681SAndroid Build Coastguard Worker  ret i32 %conv2
241*9880d681SAndroid Build Coastguard Worker}
242