1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
4 define i32 @eq_i32(i32 %x) {
7 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
8 ; CHECK-NEXT: subs w8, w8, w0
9 ; CHECK-NEXT: csel w0, w0, w8, eq
11 %cmp = icmp eq i32 %x, -2097152
12 %sub = sub i32 -2097152, %x
13 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
17 define i32 @ne_i32(i32 %x) {
18 ; CHECK-LABEL: ne_i32:
20 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
21 ; CHECK-NEXT: subs w8, w8, w0
22 ; CHECK-NEXT: csel w0, w0, w8, ne
24 %cmp = icmp ne i32 %x, -2097152
25 %sub = sub i32 -2097152, %x
26 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
30 define i32 @sgt_i32(i32 %x) {
31 ; CHECK-LABEL: sgt_i32:
33 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
34 ; CHECK-NEXT: subs w8, w8, w0
35 ; CHECK-NEXT: csel w0, w0, w8, lt
37 %cmp = icmp sgt i32 %x, -2097152
38 %sub = sub i32 -2097152, %x
39 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
43 define i32 @sge_i32(i32 %x) {
44 ; CHECK-LABEL: sge_i32:
46 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
47 ; CHECK-NEXT: mov w9, #-2097153 // =0xffdfffff
48 ; CHECK-NEXT: sub w8, w8, w0
49 ; CHECK-NEXT: cmp w0, w9
50 ; CHECK-NEXT: csel w0, w0, w8, gt
52 %cmp = icmp sge i32 %x, -2097152
53 %sub = sub i32 -2097152, %x
54 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
58 define i32 @slt_i32(i32 %x) {
59 ; CHECK-LABEL: slt_i32:
61 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
62 ; CHECK-NEXT: subs w8, w8, w0
63 ; CHECK-NEXT: csel w0, w0, w8, gt
65 %cmp = icmp slt i32 %x, -2097152
66 %sub = sub i32 -2097152, %x
67 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
71 define i32 @sle_i32(i32 %x) {
72 ; CHECK-LABEL: sle_i32:
74 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
75 ; CHECK-NEXT: mov w9, #-2097151 // =0xffe00001
76 ; CHECK-NEXT: sub w8, w8, w0
77 ; CHECK-NEXT: cmp w0, w9
78 ; CHECK-NEXT: csel w0, w0, w8, lt
80 %cmp = icmp sle i32 %x, -2097152
81 %sub = sub i32 -2097152, %x
82 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
86 define i32 @ugt_i32(i32 %x) {
87 ; CHECK-LABEL: ugt_i32:
89 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
90 ; CHECK-NEXT: subs w8, w8, w0
91 ; CHECK-NEXT: csel w0, w0, w8, lo
93 %cmp = icmp ugt i32 %x, -2097152
94 %sub = sub i32 -2097152, %x
95 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
99 define i32 @uge_i32(i32 %x) {
100 ; CHECK-LABEL: uge_i32:
102 ; CHECK-NEXT: lsr w9, w0, #21
103 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
104 ; CHECK-NEXT: sub w8, w8, w0
105 ; CHECK-NEXT: cmp w9, #2046
106 ; CHECK-NEXT: csel w0, w0, w8, hi
108 %cmp = icmp uge i32 %x, -2097152
109 %sub = sub i32 -2097152, %x
110 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
114 define i32 @ult_i32(i32 %x) {
115 ; CHECK-LABEL: ult_i32:
117 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
118 ; CHECK-NEXT: subs w8, w8, w0
119 ; CHECK-NEXT: csel w0, w0, w8, hi
121 %cmp = icmp ult i32 %x, -2097152
122 %sub = sub i32 -2097152, %x
123 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
127 define i32 @ule_i32(i32 %x) {
128 ; CHECK-LABEL: ule_i32:
130 ; CHECK-NEXT: mov w8, #-2097152 // =0xffe00000
131 ; CHECK-NEXT: mov w9, #-2097151 // =0xffe00001
132 ; CHECK-NEXT: sub w8, w8, w0
133 ; CHECK-NEXT: cmp w0, w9
134 ; CHECK-NEXT: csel w0, w0, w8, lo
136 %cmp = icmp ule i32 %x, -2097152
137 %sub = sub i32 -2097152, %x
138 %retval.0 = select i1 %cmp, i32 %x, i32 %sub
143 define i64 @eq_i64(i64 %x) {
144 ; CHECK-LABEL: eq_i64:
146 ; CHECK-NEXT: mov w8, #100 // =0x64
147 ; CHECK-NEXT: subs x8, x8, x0
148 ; CHECK-NEXT: csel x0, x0, x8, eq
150 %cmp = icmp eq i64 %x, 100
151 %sub = sub i64 100, %x
152 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
156 define i64 @ne_i64(i64 %x) {
157 ; CHECK-LABEL: ne_i64:
159 ; CHECK-NEXT: mov w8, #100 // =0x64
160 ; CHECK-NEXT: subs x8, x8, x0
161 ; CHECK-NEXT: csel x0, x0, x8, ne
163 %cmp = icmp ne i64 %x, 100
164 %sub = sub i64 100, %x
165 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
169 define i64 @sgt_i64(i64 %x) {
170 ; CHECK-LABEL: sgt_i64:
172 ; CHECK-NEXT: mov w8, #100 // =0x64
173 ; CHECK-NEXT: subs x8, x8, x0
174 ; CHECK-NEXT: csel x0, x0, x8, lt
176 %cmp = icmp sgt i64 %x, 100
177 %sub = sub i64 100, %x
178 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
182 define i64 @sge_i64(i64 %x) {
183 ; CHECK-LABEL: sge_i64:
185 ; CHECK-NEXT: mov w8, #100 // =0x64
186 ; CHECK-NEXT: cmp x0, #99
187 ; CHECK-NEXT: sub x8, x8, x0
188 ; CHECK-NEXT: csel x0, x0, x8, gt
190 %cmp = icmp sge i64 %x, 100
191 %sub = sub i64 100, %x
192 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
196 define i64 @slt_i64(i64 %x) {
197 ; CHECK-LABEL: slt_i64:
199 ; CHECK-NEXT: mov w8, #100 // =0x64
200 ; CHECK-NEXT: subs x8, x8, x0
201 ; CHECK-NEXT: csel x0, x0, x8, gt
203 %cmp = icmp slt i64 %x, 100
204 %sub = sub i64 100, %x
205 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
209 define i64 @sle_i64(i64 %x) {
210 ; CHECK-LABEL: sle_i64:
212 ; CHECK-NEXT: mov w8, #100 // =0x64
213 ; CHECK-NEXT: cmp x0, #101
214 ; CHECK-NEXT: sub x8, x8, x0
215 ; CHECK-NEXT: csel x0, x0, x8, lt
217 %cmp = icmp sle i64 %x, 100
218 %sub = sub i64 100, %x
219 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
223 define i64 @ugt_i64(i64 %x) {
224 ; CHECK-LABEL: ugt_i64:
226 ; CHECK-NEXT: mov w8, #100 // =0x64
227 ; CHECK-NEXT: subs x8, x8, x0
228 ; CHECK-NEXT: csel x0, x0, x8, lo
230 %cmp = icmp ugt i64 %x, 100
231 %sub = sub i64 100, %x
232 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
236 define i64 @uge_i64(i64 %x) {
237 ; CHECK-LABEL: uge_i64:
239 ; CHECK-NEXT: mov w8, #100 // =0x64
240 ; CHECK-NEXT: cmp x0, #99
241 ; CHECK-NEXT: sub x8, x8, x0
242 ; CHECK-NEXT: csel x0, x0, x8, hi
244 %cmp = icmp uge i64 %x, 100
245 %sub = sub i64 100, %x
246 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
250 define i64 @ult_i64(i64 %x) {
251 ; CHECK-LABEL: ult_i64:
253 ; CHECK-NEXT: mov w8, #100 // =0x64
254 ; CHECK-NEXT: subs x8, x8, x0
255 ; CHECK-NEXT: csel x0, x0, x8, hi
257 %cmp = icmp ult i64 %x, 100
258 %sub = sub i64 100, %x
259 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
263 define i64 @ule_i64(i64 %x) {
264 ; CHECK-LABEL: ule_i64:
266 ; CHECK-NEXT: mov w8, #100 // =0x64
267 ; CHECK-NEXT: cmp x0, #101
268 ; CHECK-NEXT: sub x8, x8, x0
269 ; CHECK-NEXT: csel x0, x0, x8, lo
271 %cmp = icmp ule i64 %x, 100
272 %sub = sub i64 100, %x
273 %retval.0 = select i1 %cmp, i64 %x, i64 %sub
278 define i64 @both(i64 %x) {
281 ; CHECK-NEXT: mov w8, #100 // =0x64
282 ; CHECK-NEXT: sub x9, x0, #100
283 ; CHECK-NEXT: cmp x0, #101
284 ; CHECK-NEXT: sub x8, x8, x0
285 ; CHECK-NEXT: csel x0, x8, x9, lo
287 %cmp = icmp ule i64 %x, 100
288 %sub1 = sub i64 100, %x
289 %sub2 = sub i64 %x, 100
290 %retval.0 = select i1 %cmp, i64 %sub1, i64 %sub2
294 define i32 @qabs(i32 %0) {
297 ; CHECK-NEXT: mov w8, #-2147483648 // =0x80000000
298 ; CHECK-NEXT: cmp w0, w8
299 ; CHECK-NEXT: mov w8, #2147483647 // =0x7fffffff
300 ; CHECK-NEXT: csneg w8, w8, w0, eq
301 ; CHECK-NEXT: cmp w0, #0
302 ; CHECK-NEXT: csel w0, w0, w8, gt
304 %cmp1 = icmp sgt i32 %0, 0
305 %cmp2 = icmp eq i32 %0, -2147483648
306 %sub = sub nsw i32 0, %0
307 %cond = select i1 %cmp2, i32 2147483647, i32 %sub
308 %cond6 = select i1 %cmp1, i32 %0, i32 %cond