Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AArch64 / cmp-to-cmn.ll
blob1cc194e77b94b1210cc9be376f815fa96a87b183
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
3 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4 target triple = "arm64"
6 define i1 @test_EQ_IllEbT(i64 %a, i64 %b) {
7 ; CHECK-LABEL: test_EQ_IllEbT:
8 ; CHECK:       // %bb.0: // %entry
9 ; CHECK-NEXT:    cmn x0, x1
10 ; CHECK-NEXT:    cset w0, eq
11 ; CHECK-NEXT:    ret
12 entry:
13   %add = sub i64 0, %b
14   %cmp = icmp eq i64 %add, %a
15   ret i1 %cmp
18 define i1 @test_EQ_IliEbT(i64 %a, i32 %b) {
19 ; CHECK-LABEL: test_EQ_IliEbT:
20 ; CHECK:       // %bb.0: // %entry
21 ; CHECK-NEXT:    cmn x0, w1, sxtw
22 ; CHECK-NEXT:    cset w0, eq
23 ; CHECK-NEXT:    ret
24 entry:
25   %conv = sext i32 %b to i64
26   %add = sub i64 0, %a
27   %cmp = icmp eq i64 %conv, %add
28   ret i1 %cmp
31 define i1 @test_EQ_IlsEbT(i64 %a, i16 %b) {
32 ; CHECK-LABEL: test_EQ_IlsEbT:
33 ; CHECK:       // %bb.0: // %entry
34 ; CHECK-NEXT:    // kill: def $w1 killed $w1 def $x1
35 ; CHECK-NEXT:    cmn x0, w1, sxth
36 ; CHECK-NEXT:    cset w0, eq
37 ; CHECK-NEXT:    ret
38 entry:
39   %conv = sext i16 %b to i64
40   %add = sub i64 0, %a
41   %cmp = icmp eq i64 %conv, %add
42   ret i1 %cmp
45 define i1 @test_EQ_IlcEbT(i64 %a, i8 %b) {
46 ; CHECK-LABEL: test_EQ_IlcEbT:
47 ; CHECK:       // %bb.0: // %entry
48 ; CHECK-NEXT:    // kill: def $w1 killed $w1 def $x1
49 ; CHECK-NEXT:    cmn x0, w1, uxtb
50 ; CHECK-NEXT:    cset w0, eq
51 ; CHECK-NEXT:    ret
52 entry:
53   %conv = zext i8 %b to i64
54   %add = sub i64 0, %a
55   %cmp = icmp eq i64 %conv, %add
56   ret i1 %cmp
59 define i1 @test_EQ_IilEbT(i32 %a, i64 %b) {
60 ; CHECK-LABEL: test_EQ_IilEbT:
61 ; CHECK:       // %bb.0: // %entry
62 ; CHECK-NEXT:    cmn x1, w0, sxtw
63 ; CHECK-NEXT:    cset w0, eq
64 ; CHECK-NEXT:    ret
65 entry:
66   %conv = sext i32 %a to i64
67   %add = sub i64 0, %b
68   %cmp = icmp eq i64 %conv, %add
69   ret i1 %cmp
72 define i1 @test_EQ_IiiEbT(i32 %a, i32 %b) {
73 ; CHECK-LABEL: test_EQ_IiiEbT:
74 ; CHECK:       // %bb.0: // %entry
75 ; CHECK-NEXT:    cmn w0, w1
76 ; CHECK-NEXT:    cset w0, eq
77 ; CHECK-NEXT:    ret
78 entry:
79   %add = sub i32 0, %b
80   %cmp = icmp eq i32 %add, %a
81   ret i1 %cmp
84 define i1 @test_EQ_IisEbT(i32 %a, i16 %b) {
85 ; CHECK-LABEL: test_EQ_IisEbT:
86 ; CHECK:       // %bb.0: // %entry
87 ; CHECK-NEXT:    cmn w0, w1, sxth
88 ; CHECK-NEXT:    cset w0, eq
89 ; CHECK-NEXT:    ret
90 entry:
91   %conv = sext i16 %b to i32
92   %add = sub i32 0, %a
93   %cmp = icmp eq i32 %conv, %add
94   ret i1 %cmp
97 define i1 @test_EQ_IicEbT(i32 %a, i8 %b) {
98 ; CHECK-LABEL: test_EQ_IicEbT:
99 ; CHECK:       // %bb.0: // %entry
100 ; CHECK-NEXT:    cmn w0, w1, uxtb
101 ; CHECK-NEXT:    cset w0, eq
102 ; CHECK-NEXT:    ret
103 entry:
104   %conv = zext i8 %b to i32
105   %add = sub i32 0, %a
106   %cmp = icmp eq i32 %conv, %add
107   ret i1 %cmp
110 define i1 @test_EQ_IslEbT(i16 %a, i64 %b) {
111 ; CHECK-LABEL: test_EQ_IslEbT:
112 ; CHECK:       // %bb.0: // %entry
113 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
114 ; CHECK-NEXT:    cmn x1, w0, sxth
115 ; CHECK-NEXT:    cset w0, eq
116 ; CHECK-NEXT:    ret
117 entry:
118   %conv = sext i16 %a to i64
119   %add = sub i64 0, %b
120   %cmp = icmp eq i64 %conv, %add
121   ret i1 %cmp
124 define i1 @test_EQ_IsiEbT(i16 %a, i32 %b) {
125 ; CHECK-LABEL: test_EQ_IsiEbT:
126 ; CHECK:       // %bb.0: // %entry
127 ; CHECK-NEXT:    cmn w1, w0, sxth
128 ; CHECK-NEXT:    cset w0, eq
129 ; CHECK-NEXT:    ret
130 entry:
131   %conv = sext i16 %a to i32
132   %add = sub i32 0, %b
133   %cmp = icmp eq i32 %conv, %add
134   ret i1 %cmp
137 define i1 @test_EQ_IssEbT(i16 %a, i16 %b) {
138 ; CHECK-LABEL: test_EQ_IssEbT:
139 ; CHECK:       // %bb.0: // %entry
140 ; CHECK-NEXT:    sxth w8, w0
141 ; CHECK-NEXT:    cmn w8, w1, sxth
142 ; CHECK-NEXT:    cset w0, eq
143 ; CHECK-NEXT:    ret
144 entry:
145   %conv = sext i16 %a to i32
146   %conv1 = sext i16 %b to i32
147   %add = sub nsw i32 0, %conv1
148   %cmp = icmp eq i32 %conv, %add
149   ret i1 %cmp
152 define i1 @test_EQ_IscEbT(i16 %a, i8 %b) {
153 ; CHECK-LABEL: test_EQ_IscEbT:
154 ; CHECK:       // %bb.0: // %entry
155 ; CHECK-NEXT:    sxth w8, w0
156 ; CHECK-NEXT:    cmn w8, w1, uxtb
157 ; CHECK-NEXT:    cset w0, eq
158 ; CHECK-NEXT:    ret
159 entry:
160   %conv = sext i16 %a to i32
161   %conv1 = zext i8 %b to i32
162   %add = sub nsw i32 0, %conv1
163   %cmp = icmp eq i32 %conv, %add
164   ret i1 %cmp
167 define i1 @test_EQ_IclEbT(i8 %a, i64 %b) {
168 ; CHECK-LABEL: test_EQ_IclEbT:
169 ; CHECK:       // %bb.0: // %entry
170 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
171 ; CHECK-NEXT:    cmn x1, w0, uxtb
172 ; CHECK-NEXT:    cset w0, eq
173 ; CHECK-NEXT:    ret
174 entry:
175   %conv = zext i8 %a to i64
176   %add = sub i64 0, %b
177   %cmp = icmp eq i64 %conv, %add
178   ret i1 %cmp
181 define i1 @test_EQ_IciEbT(i8 %a, i32 %b) {
182 ; CHECK-LABEL: test_EQ_IciEbT:
183 ; CHECK:       // %bb.0: // %entry
184 ; CHECK-NEXT:    cmn w1, w0, uxtb
185 ; CHECK-NEXT:    cset w0, eq
186 ; CHECK-NEXT:    ret
187 entry:
188   %conv = zext i8 %a to i32
189   %add = sub i32 0, %b
190   %cmp = icmp eq i32 %conv, %add
191   ret i1 %cmp
194 define i1 @test_EQ_IcsEbT(i8 %a, i16 %b) {
195 ; CHECK-LABEL: test_EQ_IcsEbT:
196 ; CHECK:       // %bb.0: // %entry
197 ; CHECK-NEXT:    and w8, w0, #0xff
198 ; CHECK-NEXT:    cmn w8, w1, sxth
199 ; CHECK-NEXT:    cset w0, eq
200 ; CHECK-NEXT:    ret
201 entry:
202   %conv = zext i8 %a to i32
203   %conv1 = sext i16 %b to i32
204   %add = sub nsw i32 0, %conv1
205   %cmp = icmp eq i32 %conv, %add
206   ret i1 %cmp
209 define i1 @test_EQ_IccEbT(i8 %a, i8 %b) {
210 ; CHECK-LABEL: test_EQ_IccEbT:
211 ; CHECK:       // %bb.0: // %entry
212 ; CHECK-NEXT:    and w8, w0, #0xff
213 ; CHECK-NEXT:    cmn w8, w1, uxtb
214 ; CHECK-NEXT:    cset w0, eq
215 ; CHECK-NEXT:    ret
216 entry:
217   %conv = zext i8 %a to i32
218   %conv1 = zext i8 %b to i32
219   %add = sub nsw i32 0, %conv1
220   %cmp = icmp eq i32 %conv, %add
221   ret i1 %cmp
224 define i1 @test_NE_IllEbT(i64 %a, i64 %b) {
225 ; CHECK-LABEL: test_NE_IllEbT:
226 ; CHECK:       // %bb.0: // %entry
227 ; CHECK-NEXT:    cmn x0, x1
228 ; CHECK-NEXT:    cset w0, ne
229 ; CHECK-NEXT:    ret
230 entry:
231   %add = sub i64 0, %b
232   %cmp = icmp ne i64 %add, %a
233   ret i1 %cmp
236 define i1 @test_NE_IliEbT(i64 %a, i32 %b) {
237 ; CHECK-LABEL: test_NE_IliEbT:
238 ; CHECK:       // %bb.0: // %entry
239 ; CHECK-NEXT:    cmn x0, w1, sxtw
240 ; CHECK-NEXT:    cset w0, ne
241 ; CHECK-NEXT:    ret
242 entry:
243   %conv = sext i32 %b to i64
244   %add = sub i64 0, %a
245   %cmp = icmp ne i64 %conv, %add
246   ret i1 %cmp
249 define i1 @test_NE_IlsEbT(i64 %a, i16 %b) {
250 ; CHECK-LABEL: test_NE_IlsEbT:
251 ; CHECK:       // %bb.0: // %entry
252 ; CHECK-NEXT:    // kill: def $w1 killed $w1 def $x1
253 ; CHECK-NEXT:    cmn x0, w1, sxth
254 ; CHECK-NEXT:    cset w0, ne
255 ; CHECK-NEXT:    ret
256 entry:
257   %conv = sext i16 %b to i64
258   %add = sub i64 0, %a
259   %cmp = icmp ne i64 %conv, %add
260   ret i1 %cmp
263 define i1 @test_NE_IlcEbT(i64 %a, i8 %b) {
264 ; CHECK-LABEL: test_NE_IlcEbT:
265 ; CHECK:       // %bb.0: // %entry
266 ; CHECK-NEXT:    // kill: def $w1 killed $w1 def $x1
267 ; CHECK-NEXT:    cmn x0, w1, uxtb
268 ; CHECK-NEXT:    cset w0, ne
269 ; CHECK-NEXT:    ret
270 entry:
271   %conv = zext i8 %b to i64
272   %add = sub i64 0, %a
273   %cmp = icmp ne i64 %conv, %add
274   ret i1 %cmp
277 define i1 @test_NE_IilEbT(i32 %a, i64 %b) {
278 ; CHECK-LABEL: test_NE_IilEbT:
279 ; CHECK:       // %bb.0: // %entry
280 ; CHECK-NEXT:    cmn x1, w0, sxtw
281 ; CHECK-NEXT:    cset w0, ne
282 ; CHECK-NEXT:    ret
283 entry:
284   %conv = sext i32 %a to i64
285   %add = sub i64 0, %b
286   %cmp = icmp ne i64 %conv, %add
287   ret i1 %cmp
290 define i1 @test_NE_IiiEbT(i32 %a, i32 %b) {
291 ; CHECK-LABEL: test_NE_IiiEbT:
292 ; CHECK:       // %bb.0: // %entry
293 ; CHECK-NEXT:    cmn w0, w1
294 ; CHECK-NEXT:    cset w0, ne
295 ; CHECK-NEXT:    ret
296 entry:
297   %add = sub i32 0, %b
298   %cmp = icmp ne i32 %add, %a
299   ret i1 %cmp
302 define i1 @test_NE_IisEbT(i32 %a, i16 %b) {
303 ; CHECK-LABEL: test_NE_IisEbT:
304 ; CHECK:       // %bb.0: // %entry
305 ; CHECK-NEXT:    cmn w0, w1, sxth
306 ; CHECK-NEXT:    cset w0, ne
307 ; CHECK-NEXT:    ret
308 entry:
309   %conv = sext i16 %b to i32
310   %add = sub i32 0, %a
311   %cmp = icmp ne i32 %conv, %add
312   ret i1 %cmp
315 define i1 @test_NE_IicEbT(i32 %a, i8 %b) {
316 ; CHECK-LABEL: test_NE_IicEbT:
317 ; CHECK:       // %bb.0: // %entry
318 ; CHECK-NEXT:    cmn w0, w1, uxtb
319 ; CHECK-NEXT:    cset w0, ne
320 ; CHECK-NEXT:    ret
321 entry:
322   %conv = zext i8 %b to i32
323   %add = sub i32 0, %a
324   %cmp = icmp ne i32 %conv, %add
325   ret i1 %cmp
328 define i1 @test_NE_IslEbT(i16 %a, i64 %b) {
329 ; CHECK-LABEL: test_NE_IslEbT:
330 ; CHECK:       // %bb.0: // %entry
331 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
332 ; CHECK-NEXT:    cmn x1, w0, sxth
333 ; CHECK-NEXT:    cset w0, ne
334 ; CHECK-NEXT:    ret
335 entry:
336   %conv = sext i16 %a to i64
337   %add = sub i64 0, %b
338   %cmp = icmp ne i64 %conv, %add
339   ret i1 %cmp
342 define i1 @test_NE_IsiEbT(i16 %a, i32 %b) {
343 ; CHECK-LABEL: test_NE_IsiEbT:
344 ; CHECK:       // %bb.0: // %entry
345 ; CHECK-NEXT:    cmn w1, w0, sxth
346 ; CHECK-NEXT:    cset w0, ne
347 ; CHECK-NEXT:    ret
348 entry:
349   %conv = sext i16 %a to i32
350   %add = sub i32 0, %b
351   %cmp = icmp ne i32 %conv, %add
352   ret i1 %cmp
355 define i1 @test_NE_IssEbT(i16 %a, i16 %b) {
356 ; CHECK-LABEL: test_NE_IssEbT:
357 ; CHECK:       // %bb.0: // %entry
358 ; CHECK-NEXT:    sxth w8, w0
359 ; CHECK-NEXT:    cmn w8, w1, sxth
360 ; CHECK-NEXT:    cset w0, ne
361 ; CHECK-NEXT:    ret
362 entry:
363   %conv = sext i16 %a to i32
364   %conv1 = sext i16 %b to i32
365   %add = sub nsw i32 0, %conv1
366   %cmp = icmp ne i32 %conv, %add
367   ret i1 %cmp
370 define i1 @test_NE_IscEbT(i16 %a, i8 %b) {
371 ; CHECK-LABEL: test_NE_IscEbT:
372 ; CHECK:       // %bb.0: // %entry
373 ; CHECK-NEXT:    sxth w8, w0
374 ; CHECK-NEXT:    cmn w8, w1, uxtb
375 ; CHECK-NEXT:    cset w0, ne
376 ; CHECK-NEXT:    ret
377 entry:
378   %conv = sext i16 %a to i32
379   %conv1 = zext i8 %b to i32
380   %add = sub nsw i32 0, %conv1
381   %cmp = icmp ne i32 %conv, %add
382   ret i1 %cmp
385 define i1 @test_NE_IclEbT(i8 %a, i64 %b) {
386 ; CHECK-LABEL: test_NE_IclEbT:
387 ; CHECK:       // %bb.0: // %entry
388 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
389 ; CHECK-NEXT:    cmn x1, w0, uxtb
390 ; CHECK-NEXT:    cset w0, ne
391 ; CHECK-NEXT:    ret
392 entry:
393   %conv = zext i8 %a to i64
394   %add = sub i64 0, %b
395   %cmp = icmp ne i64 %conv, %add
396   ret i1 %cmp
399 define i1 @test_NE_IciEbT(i8 %a, i32 %b) {
400 ; CHECK-LABEL: test_NE_IciEbT:
401 ; CHECK:       // %bb.0: // %entry
402 ; CHECK-NEXT:    cmn w1, w0, uxtb
403 ; CHECK-NEXT:    cset w0, ne
404 ; CHECK-NEXT:    ret
405 entry:
406   %conv = zext i8 %a to i32
407   %add = sub i32 0, %b
408   %cmp = icmp ne i32 %conv, %add
409   ret i1 %cmp
412 define i1 @test_NE_IcsEbT(i8 %a, i16 %b) {
413 ; CHECK-LABEL: test_NE_IcsEbT:
414 ; CHECK:       // %bb.0: // %entry
415 ; CHECK-NEXT:    and w8, w0, #0xff
416 ; CHECK-NEXT:    cmn w8, w1, sxth
417 ; CHECK-NEXT:    cset w0, ne
418 ; CHECK-NEXT:    ret
419 entry:
420   %conv = zext i8 %a to i32
421   %conv1 = sext i16 %b to i32
422   %add = sub nsw i32 0, %conv1
423   %cmp = icmp ne i32 %conv, %add
424   ret i1 %cmp
427 define i1 @test_NE_IccEbT(i8 %a, i8 %b) {
428 ; CHECK-LABEL: test_NE_IccEbT:
429 ; CHECK:       // %bb.0: // %entry
430 ; CHECK-NEXT:    and w8, w0, #0xff
431 ; CHECK-NEXT:    cmn w8, w1, uxtb
432 ; CHECK-NEXT:    cset w0, ne
433 ; CHECK-NEXT:    ret
434 entry:
435   %conv = zext i8 %a to i32
436   %conv1 = zext i8 %b to i32
437   %add = sub nsw i32 0, %conv1
438   %cmp = icmp ne i32 %conv, %add
439   ret i1 %cmp