1 ; RUN: llc -O0 -fast-isel-abort=1 -verify-machineinstrs -mtriple=arm64-apple-darwin < %s | FileCheck %s
3 define i32 @icmp_eq_imm(i32 %a) nounwind ssp {
5 ; CHECK-LABEL: icmp_eq_imm
7 ; CHECK-NEXT: cset w0, eq
8 %cmp = icmp eq i32 %a, 31
9 %conv = zext i1 %cmp to i32
13 define i32 @icmp_eq_neg_imm(i32 %a) nounwind ssp {
15 ; CHECK-LABEL: icmp_eq_neg_imm
17 ; CHECK-NEXT: cset w0, eq
18 %cmp = icmp eq i32 %a, -7
19 %conv = zext i1 %cmp to i32
23 define i32 @icmp_eq_i32(i32 %a, i32 %b) nounwind ssp {
25 ; CHECK-LABEL: icmp_eq_i32
27 ; CHECK-NEXT: cset w0, eq
28 %cmp = icmp eq i32 %a, %b
29 %conv = zext i1 %cmp to i32
33 define i32 @icmp_ne(i32 %a, i32 %b) nounwind ssp {
35 ; CHECK-LABEL: icmp_ne
37 ; CHECK-NEXT: cset w0, ne
38 %cmp = icmp ne i32 %a, %b
39 %conv = zext i1 %cmp to i32
43 define i32 @icmp_eq_ptr(i8* %a) {
45 ; CHECK-LABEL: icmp_eq_ptr
47 ; CHECK-NEXT: cset {{.+}}, eq
48 %cmp = icmp eq i8* %a, null
49 %conv = zext i1 %cmp to i32
53 define i32 @icmp_ne_ptr(i8* %a) {
55 ; CHECK-LABEL: icmp_ne_ptr
57 ; CHECK-NEXT: cset {{.+}}, ne
58 %cmp = icmp ne i8* %a, null
59 %conv = zext i1 %cmp to i32
63 define i32 @icmp_ugt(i32 %a, i32 %b) nounwind ssp {
65 ; CHECK-LABEL: icmp_ugt
67 ; CHECK-NEXT: cset w0, hi
68 %cmp = icmp ugt i32 %a, %b
69 %conv = zext i1 %cmp to i32
73 define i32 @icmp_uge(i32 %a, i32 %b) nounwind ssp {
75 ; CHECK-LABEL: icmp_uge
77 ; CHECK-NEXT: cset w0, hs
78 %cmp = icmp uge i32 %a, %b
79 %conv = zext i1 %cmp to i32
83 define i32 @icmp_ult(i32 %a, i32 %b) nounwind ssp {
85 ; CHECK-LABEL: icmp_ult
87 ; CHECK-NEXT: cset w0, lo
88 %cmp = icmp ult i32 %a, %b
89 %conv = zext i1 %cmp to i32
93 define i32 @icmp_ule(i32 %a, i32 %b) nounwind ssp {
95 ; CHECK-LABEL: icmp_ule
97 ; CHECK-NEXT: cset w0, ls
98 %cmp = icmp ule i32 %a, %b
99 %conv = zext i1 %cmp to i32
103 define i32 @icmp_sgt(i32 %a, i32 %b) nounwind ssp {
105 ; CHECK-LABEL: icmp_sgt
107 ; CHECK-NEXT: cset w0, gt
108 %cmp = icmp sgt i32 %a, %b
109 %conv = zext i1 %cmp to i32
113 define i32 @icmp_sge(i32 %a, i32 %b) nounwind ssp {
115 ; CHECK-LABEL: icmp_sge
117 ; CHECK-NEXT: cset w0, ge
118 %cmp = icmp sge i32 %a, %b
119 %conv = zext i1 %cmp to i32
123 define i32 @icmp_slt(i32 %a, i32 %b) nounwind ssp {
125 ; CHECK-LABEL: icmp_slt
127 ; CHECK-NEXT: cset w0, lt
128 %cmp = icmp slt i32 %a, %b
129 %conv = zext i1 %cmp to i32
133 define i32 @icmp_sle(i32 %a, i32 %b) nounwind ssp {
135 ; CHECK-LABEL: icmp_sle
137 ; CHECK-NEXT: cset w0, le
138 %cmp = icmp sle i32 %a, %b
139 %conv = zext i1 %cmp to i32
143 define i32 @icmp_i64(i64 %a, i64 %b) nounwind ssp {
145 ; CHECK-LABEL: icmp_i64
147 ; CHECK-NEXT: cset w{{[0-9]+}}, le
148 %cmp = icmp sle i64 %a, %b
149 %conv = zext i1 %cmp to i32
153 define zeroext i1 @icmp_eq_i16(i16 %a, i16 %b) nounwind ssp {
155 ; CHECK-LABEL: icmp_eq_i16
157 ; CHECK: cmp w0, w1, sxth
158 ; CHECK-NEXT: cset w0, eq
159 %cmp = icmp eq i16 %a, %b
163 define zeroext i1 @icmp_eq_i8(i8 %a, i8 %b) nounwind ssp {
165 ; CHECK-LABEL: icmp_eq_i8
167 ; CHECK-NEXT: cmp w0, w1, sxtb
168 ; CHECK-NEXT: cset w0, eq
169 %cmp = icmp eq i8 %a, %b
173 define i32 @icmp_i16_unsigned(i16 %a, i16 %b) nounwind {
175 ; CHECK-LABEL: icmp_i16_unsigned
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
184 define i32 @icmp_i8_signed(i8 %a, i8 %b) nounwind {
186 ; CHECK-LABEL: icmp_i8_signed
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
195 define i32 @icmp_i1_signed(i1 %a, i1 %b) nounwind {
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
207 define i32 @icmp_i16_signed_const(i16 %a) nounwind {
209 ; CHECK-LABEL: icmp_i16_signed_const
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
219 define i32 @icmp_i8_signed_const(i8 %a) nounwind {
221 ; CHECK-LABEL: icmp_i8_signed_const
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
231 define i32 @icmp_i1_unsigned_const(i1 %a) nounwind {
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