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