[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / csel-subs-swapped.ll
blob3971da27cdddca3b6efcff5225881679d5cfb605
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) {
5 ; CHECK-LABEL: eq_i32:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    mov w8, #-2097152 // =0xffe00000
8 ; CHECK-NEXT:    subs w8, w8, w0
9 ; CHECK-NEXT:    csel w0, w0, w8, eq
10 ; CHECK-NEXT:    ret
11   %cmp = icmp eq i32 %x, -2097152
12   %sub = sub i32 -2097152, %x
13   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
14   ret i32 %retval.0
17 define i32 @ne_i32(i32 %x) {
18 ; CHECK-LABEL: ne_i32:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    mov w8, #-2097152 // =0xffe00000
21 ; CHECK-NEXT:    subs w8, w8, w0
22 ; CHECK-NEXT:    csel w0, w0, w8, ne
23 ; CHECK-NEXT:    ret
24   %cmp = icmp ne i32 %x, -2097152
25   %sub = sub i32 -2097152, %x
26   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
27   ret i32 %retval.0
30 define i32 @sgt_i32(i32 %x) {
31 ; CHECK-LABEL: sgt_i32:
32 ; CHECK:       // %bb.0:
33 ; CHECK-NEXT:    mov w8, #-2097152 // =0xffe00000
34 ; CHECK-NEXT:    subs w8, w8, w0
35 ; CHECK-NEXT:    csel w0, w0, w8, lt
36 ; CHECK-NEXT:    ret
37   %cmp = icmp sgt i32 %x, -2097152
38   %sub = sub i32 -2097152, %x
39   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
40   ret i32 %retval.0
43 define i32 @sge_i32(i32 %x) {
44 ; CHECK-LABEL: sge_i32:
45 ; CHECK:       // %bb.0:
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
51 ; CHECK-NEXT:    ret
52   %cmp = icmp sge i32 %x, -2097152
53   %sub = sub i32 -2097152, %x
54   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
55   ret i32 %retval.0
58 define i32 @slt_i32(i32 %x) {
59 ; CHECK-LABEL: slt_i32:
60 ; CHECK:       // %bb.0:
61 ; CHECK-NEXT:    mov w8, #-2097152 // =0xffe00000
62 ; CHECK-NEXT:    subs w8, w8, w0
63 ; CHECK-NEXT:    csel w0, w0, w8, gt
64 ; CHECK-NEXT:    ret
65   %cmp = icmp slt i32 %x, -2097152
66   %sub = sub i32 -2097152, %x
67   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
68   ret i32 %retval.0
71 define i32 @sle_i32(i32 %x) {
72 ; CHECK-LABEL: sle_i32:
73 ; CHECK:       // %bb.0:
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
79 ; CHECK-NEXT:    ret
80   %cmp = icmp sle i32 %x, -2097152
81   %sub = sub i32 -2097152, %x
82   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
83   ret i32 %retval.0
86 define i32 @ugt_i32(i32 %x) {
87 ; CHECK-LABEL: ugt_i32:
88 ; CHECK:       // %bb.0:
89 ; CHECK-NEXT:    mov w8, #-2097152 // =0xffe00000
90 ; CHECK-NEXT:    subs w8, w8, w0
91 ; CHECK-NEXT:    csel w0, w0, w8, lo
92 ; CHECK-NEXT:    ret
93   %cmp = icmp ugt i32 %x, -2097152
94   %sub = sub i32 -2097152, %x
95   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
96   ret i32 %retval.0
99 define i32 @uge_i32(i32 %x) {
100 ; CHECK-LABEL: uge_i32:
101 ; CHECK:       // %bb.0:
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
107 ; CHECK-NEXT:    ret
108   %cmp = icmp uge i32 %x, -2097152
109   %sub = sub i32 -2097152, %x
110   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
111   ret i32 %retval.0
114 define i32 @ult_i32(i32 %x) {
115 ; CHECK-LABEL: ult_i32:
116 ; CHECK:       // %bb.0:
117 ; CHECK-NEXT:    mov w8, #-2097152 // =0xffe00000
118 ; CHECK-NEXT:    subs w8, w8, w0
119 ; CHECK-NEXT:    csel w0, w0, w8, hi
120 ; CHECK-NEXT:    ret
121   %cmp = icmp ult i32 %x, -2097152
122   %sub = sub i32 -2097152, %x
123   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
124   ret i32 %retval.0
127 define i32 @ule_i32(i32 %x) {
128 ; CHECK-LABEL: ule_i32:
129 ; CHECK:       // %bb.0:
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
135 ; CHECK-NEXT:    ret
136   %cmp = icmp ule i32 %x, -2097152
137   %sub = sub i32 -2097152, %x
138   %retval.0 = select i1 %cmp, i32 %x, i32 %sub
139   ret i32 %retval.0
143 define i64 @eq_i64(i64 %x) {
144 ; CHECK-LABEL: eq_i64:
145 ; CHECK:       // %bb.0:
146 ; CHECK-NEXT:    mov w8, #100 // =0x64
147 ; CHECK-NEXT:    subs x8, x8, x0
148 ; CHECK-NEXT:    csel x0, x0, x8, eq
149 ; CHECK-NEXT:    ret
150   %cmp = icmp eq i64 %x, 100
151   %sub = sub i64 100, %x
152   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
153   ret i64 %retval.0
156 define i64 @ne_i64(i64 %x) {
157 ; CHECK-LABEL: ne_i64:
158 ; CHECK:       // %bb.0:
159 ; CHECK-NEXT:    mov w8, #100 // =0x64
160 ; CHECK-NEXT:    subs x8, x8, x0
161 ; CHECK-NEXT:    csel x0, x0, x8, ne
162 ; CHECK-NEXT:    ret
163   %cmp = icmp ne i64 %x, 100
164   %sub = sub i64 100, %x
165   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
166   ret i64 %retval.0
169 define i64 @sgt_i64(i64 %x) {
170 ; CHECK-LABEL: sgt_i64:
171 ; CHECK:       // %bb.0:
172 ; CHECK-NEXT:    mov w8, #100 // =0x64
173 ; CHECK-NEXT:    subs x8, x8, x0
174 ; CHECK-NEXT:    csel x0, x0, x8, lt
175 ; CHECK-NEXT:    ret
176   %cmp = icmp sgt i64 %x, 100
177   %sub = sub i64 100, %x
178   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
179   ret i64 %retval.0
182 define i64 @sge_i64(i64 %x) {
183 ; CHECK-LABEL: sge_i64:
184 ; CHECK:       // %bb.0:
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
189 ; CHECK-NEXT:    ret
190   %cmp = icmp sge i64 %x, 100
191   %sub = sub i64 100, %x
192   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
193   ret i64 %retval.0
196 define i64 @slt_i64(i64 %x) {
197 ; CHECK-LABEL: slt_i64:
198 ; CHECK:       // %bb.0:
199 ; CHECK-NEXT:    mov w8, #100 // =0x64
200 ; CHECK-NEXT:    subs x8, x8, x0
201 ; CHECK-NEXT:    csel x0, x0, x8, gt
202 ; CHECK-NEXT:    ret
203   %cmp = icmp slt i64 %x, 100
204   %sub = sub i64 100, %x
205   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
206   ret i64 %retval.0
209 define i64 @sle_i64(i64 %x) {
210 ; CHECK-LABEL: sle_i64:
211 ; CHECK:       // %bb.0:
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
216 ; CHECK-NEXT:    ret
217   %cmp = icmp sle i64 %x, 100
218   %sub = sub i64 100, %x
219   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
220   ret i64 %retval.0
223 define i64 @ugt_i64(i64 %x) {
224 ; CHECK-LABEL: ugt_i64:
225 ; CHECK:       // %bb.0:
226 ; CHECK-NEXT:    mov w8, #100 // =0x64
227 ; CHECK-NEXT:    subs x8, x8, x0
228 ; CHECK-NEXT:    csel x0, x0, x8, lo
229 ; CHECK-NEXT:    ret
230   %cmp = icmp ugt i64 %x, 100
231   %sub = sub i64 100, %x
232   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
233   ret i64 %retval.0
236 define i64 @uge_i64(i64 %x) {
237 ; CHECK-LABEL: uge_i64:
238 ; CHECK:       // %bb.0:
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
243 ; CHECK-NEXT:    ret
244   %cmp = icmp uge i64 %x, 100
245   %sub = sub i64 100, %x
246   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
247   ret i64 %retval.0
250 define i64 @ult_i64(i64 %x) {
251 ; CHECK-LABEL: ult_i64:
252 ; CHECK:       // %bb.0:
253 ; CHECK-NEXT:    mov w8, #100 // =0x64
254 ; CHECK-NEXT:    subs x8, x8, x0
255 ; CHECK-NEXT:    csel x0, x0, x8, hi
256 ; CHECK-NEXT:    ret
257   %cmp = icmp ult i64 %x, 100
258   %sub = sub i64 100, %x
259   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
260   ret i64 %retval.0
263 define i64 @ule_i64(i64 %x) {
264 ; CHECK-LABEL: ule_i64:
265 ; CHECK:       // %bb.0:
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
270 ; CHECK-NEXT:    ret
271   %cmp = icmp ule i64 %x, 100
272   %sub = sub i64 100, %x
273   %retval.0 = select i1 %cmp, i64 %x, i64 %sub
274   ret i64 %retval.0
278 define i64 @both(i64 %x) {
279 ; CHECK-LABEL: both:
280 ; CHECK:       // %bb.0:
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
286 ; CHECK-NEXT:    ret
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
291   ret i64 %retval.0
294 define i32 @qabs(i32 %0) {
295 ; CHECK-LABEL: qabs:
296 ; CHECK:       // %bb.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
303 ; CHECK-NEXT:    ret
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
309   ret i32 %cond6