xref: /llvm-project/llvm/test/CodeGen/AArch64/cmp-to-cmn.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
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
3target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4target triple = "arm64"
5
6define 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
12entry:
13  %add = sub i64 0, %b
14  %cmp = icmp eq i64 %add, %a
15  ret i1 %cmp
16}
17
18define 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
24entry:
25  %conv = sext i32 %b to i64
26  %add = sub i64 0, %a
27  %cmp = icmp eq i64 %conv, %add
28  ret i1 %cmp
29}
30
31define 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
38entry:
39  %conv = sext i16 %b to i64
40  %add = sub i64 0, %a
41  %cmp = icmp eq i64 %conv, %add
42  ret i1 %cmp
43}
44
45define 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
52entry:
53  %conv = zext i8 %b to i64
54  %add = sub i64 0, %a
55  %cmp = icmp eq i64 %conv, %add
56  ret i1 %cmp
57}
58
59define 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
65entry:
66  %conv = sext i32 %a to i64
67  %add = sub i64 0, %b
68  %cmp = icmp eq i64 %conv, %add
69  ret i1 %cmp
70}
71
72define 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
78entry:
79  %add = sub i32 0, %b
80  %cmp = icmp eq i32 %add, %a
81  ret i1 %cmp
82}
83
84define 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
90entry:
91  %conv = sext i16 %b to i32
92  %add = sub i32 0, %a
93  %cmp = icmp eq i32 %conv, %add
94  ret i1 %cmp
95}
96
97define 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
103entry:
104  %conv = zext i8 %b to i32
105  %add = sub i32 0, %a
106  %cmp = icmp eq i32 %conv, %add
107  ret i1 %cmp
108}
109
110define 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
117entry:
118  %conv = sext i16 %a to i64
119  %add = sub i64 0, %b
120  %cmp = icmp eq i64 %conv, %add
121  ret i1 %cmp
122}
123
124define 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
130entry:
131  %conv = sext i16 %a to i32
132  %add = sub i32 0, %b
133  %cmp = icmp eq i32 %conv, %add
134  ret i1 %cmp
135}
136
137define 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
144entry:
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
150}
151
152define 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
159entry:
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
165}
166
167define 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
174entry:
175  %conv = zext i8 %a to i64
176  %add = sub i64 0, %b
177  %cmp = icmp eq i64 %conv, %add
178  ret i1 %cmp
179}
180
181define 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
187entry:
188  %conv = zext i8 %a to i32
189  %add = sub i32 0, %b
190  %cmp = icmp eq i32 %conv, %add
191  ret i1 %cmp
192}
193
194define 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
201entry:
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
207}
208
209define 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
216entry:
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
222}
223
224define 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
230entry:
231  %add = sub i64 0, %b
232  %cmp = icmp ne i64 %add, %a
233  ret i1 %cmp
234}
235
236define 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
242entry:
243  %conv = sext i32 %b to i64
244  %add = sub i64 0, %a
245  %cmp = icmp ne i64 %conv, %add
246  ret i1 %cmp
247}
248
249define 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
256entry:
257  %conv = sext i16 %b to i64
258  %add = sub i64 0, %a
259  %cmp = icmp ne i64 %conv, %add
260  ret i1 %cmp
261}
262
263define 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
270entry:
271  %conv = zext i8 %b to i64
272  %add = sub i64 0, %a
273  %cmp = icmp ne i64 %conv, %add
274  ret i1 %cmp
275}
276
277define 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
283entry:
284  %conv = sext i32 %a to i64
285  %add = sub i64 0, %b
286  %cmp = icmp ne i64 %conv, %add
287  ret i1 %cmp
288}
289
290define 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
296entry:
297  %add = sub i32 0, %b
298  %cmp = icmp ne i32 %add, %a
299  ret i1 %cmp
300}
301
302define 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
308entry:
309  %conv = sext i16 %b to i32
310  %add = sub i32 0, %a
311  %cmp = icmp ne i32 %conv, %add
312  ret i1 %cmp
313}
314
315define 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
321entry:
322  %conv = zext i8 %b to i32
323  %add = sub i32 0, %a
324  %cmp = icmp ne i32 %conv, %add
325  ret i1 %cmp
326}
327
328define 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
335entry:
336  %conv = sext i16 %a to i64
337  %add = sub i64 0, %b
338  %cmp = icmp ne i64 %conv, %add
339  ret i1 %cmp
340}
341
342define 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
348entry:
349  %conv = sext i16 %a to i32
350  %add = sub i32 0, %b
351  %cmp = icmp ne i32 %conv, %add
352  ret i1 %cmp
353}
354
355define 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
362entry:
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
368}
369
370define 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
377entry:
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
383}
384
385define 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
392entry:
393  %conv = zext i8 %a to i64
394  %add = sub i64 0, %b
395  %cmp = icmp ne i64 %conv, %add
396  ret i1 %cmp
397}
398
399define 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
405entry:
406  %conv = zext i8 %a to i32
407  %add = sub i32 0, %b
408  %cmp = icmp ne i32 %conv, %add
409  ret i1 %cmp
410}
411
412define 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
419entry:
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
425}
426
427define 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
434entry:
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
440}
441