xref: /llvm-project/llvm/test/CodeGen/AArch64/i128-cmp.ll (revision 3651bc83b6f28d2ae2d6b32db661f0d62cb600d7)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64-uknown-uknown -verify-machineinstrs -o - %s | FileCheck %s
3
4declare void @call()
5
6define i1 @cmp_i128_eq(i128 %a, i128 %b) {
7; CHECK-LABEL: cmp_i128_eq:
8; CHECK:       // %bb.0:
9; CHECK-NEXT:    cmp x0, x2
10; CHECK-NEXT:    ccmp x1, x3, #0, eq
11; CHECK-NEXT:    cset w0, eq
12; CHECK-NEXT:    ret
13    %cmp = icmp eq i128 %a, %b
14    ret i1 %cmp
15}
16
17define i1 @cmp_i128_ne(i128 %a, i128 %b) {
18; CHECK-LABEL: cmp_i128_ne:
19; CHECK:       // %bb.0:
20; CHECK-NEXT:    cmp x0, x2
21; CHECK-NEXT:    ccmp x1, x3, #0, eq
22; CHECK-NEXT:    cset w0, ne
23; CHECK-NEXT:    ret
24    %cmp = icmp ne i128 %a, %b
25    ret i1 %cmp
26}
27
28define i1 @cmp_i128_ugt(i128 %a, i128 %b) {
29; CHECK-LABEL: cmp_i128_ugt:
30; CHECK:       // %bb.0:
31; CHECK-NEXT:    cmp x2, x0
32; CHECK-NEXT:    sbcs xzr, x3, x1
33; CHECK-NEXT:    cset w0, lo
34; CHECK-NEXT:    ret
35    %cmp = icmp ugt i128 %a, %b
36    ret i1 %cmp
37}
38
39define i1 @cmp_i128_uge(i128 %a, i128 %b) {
40; CHECK-LABEL: cmp_i128_uge:
41; CHECK:       // %bb.0:
42; CHECK-NEXT:    cmp x0, x2
43; CHECK-NEXT:    sbcs xzr, x1, x3
44; CHECK-NEXT:    cset w0, hs
45; CHECK-NEXT:    ret
46    %cmp = icmp uge i128 %a, %b
47    ret i1 %cmp
48}
49
50define i1 @cmp_i128_ult(i128 %a, i128 %b) {
51; CHECK-LABEL: cmp_i128_ult:
52; CHECK:       // %bb.0:
53; CHECK-NEXT:    cmp x0, x2
54; CHECK-NEXT:    sbcs xzr, x1, x3
55; CHECK-NEXT:    cset w0, lo
56; CHECK-NEXT:    ret
57    %cmp = icmp ult i128 %a, %b
58    ret i1 %cmp
59}
60
61define i1 @cmp_i128_ule(i128 %a, i128 %b) {
62; CHECK-LABEL: cmp_i128_ule:
63; CHECK:       // %bb.0:
64; CHECK-NEXT:    cmp x2, x0
65; CHECK-NEXT:    sbcs xzr, x3, x1
66; CHECK-NEXT:    cset w0, hs
67; CHECK-NEXT:    ret
68    %cmp = icmp ule i128 %a, %b
69    ret i1 %cmp
70}
71
72define i1 @cmp_i128_sgt(i128 %a, i128 %b) {
73; CHECK-LABEL: cmp_i128_sgt:
74; CHECK:       // %bb.0:
75; CHECK-NEXT:    cmp x2, x0
76; CHECK-NEXT:    sbcs xzr, x3, x1
77; CHECK-NEXT:    cset w0, lt
78; CHECK-NEXT:    ret
79    %cmp = icmp sgt i128 %a, %b
80    ret i1 %cmp
81}
82
83define i1 @cmp_i128_sge(i128 %a, i128 %b) {
84; CHECK-LABEL: cmp_i128_sge:
85; CHECK:       // %bb.0:
86; CHECK-NEXT:    cmp x0, x2
87; CHECK-NEXT:    sbcs xzr, x1, x3
88; CHECK-NEXT:    cset w0, ge
89; CHECK-NEXT:    ret
90    %cmp = icmp sge i128 %a, %b
91    ret i1 %cmp
92}
93
94define i1 @cmp_i128_slt(i128 %a, i128 %b) {
95; CHECK-LABEL: cmp_i128_slt:
96; CHECK:       // %bb.0:
97; CHECK-NEXT:    cmp x0, x2
98; CHECK-NEXT:    sbcs xzr, x1, x3
99; CHECK-NEXT:    cset w0, lt
100; CHECK-NEXT:    ret
101    %cmp = icmp slt i128 %a, %b
102    ret i1 %cmp
103}
104
105define i1 @cmp_i128_sle(i128 %a, i128 %b) {
106; CHECK-LABEL: cmp_i128_sle:
107; CHECK:       // %bb.0:
108; CHECK-NEXT:    cmp x2, x0
109; CHECK-NEXT:    sbcs xzr, x3, x1
110; CHECK-NEXT:    cset w0, ge
111; CHECK-NEXT:    ret
112    %cmp = icmp sle i128 %a, %b
113    ret i1 %cmp
114}
115
116define void @br_on_cmp_i128_eq(i128 %a, i128 %b) nounwind {
117; CHECK-LABEL: br_on_cmp_i128_eq:
118; CHECK:       // %bb.0:
119; CHECK-NEXT:    cmp x1, x3
120; CHECK-NEXT:    ccmp x0, x2, #0, eq
121; CHECK-NEXT:    b.ne .LBB10_2
122; CHECK-NEXT:  // %bb.1: // %call
123; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
124; CHECK-NEXT:    bl call
125; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
126; CHECK-NEXT:  .LBB10_2: // %exit
127; CHECK-NEXT:    ret
128    %cmp = icmp eq i128 %a, %b
129    br i1 %cmp, label %call, label %exit
130call:
131    call void @call()
132    br label %exit
133exit:
134    ret void
135}
136
137define void @br_on_cmp_i128_ne(i128 %a, i128 %b) nounwind {
138; CHECK-LABEL: br_on_cmp_i128_ne:
139; CHECK:       // %bb.0:
140; CHECK-NEXT:    cmp x1, x3
141; CHECK-NEXT:    ccmp x0, x2, #0, eq
142; CHECK-NEXT:    b.eq .LBB11_2
143; CHECK-NEXT:  // %bb.1: // %call
144; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
145; CHECK-NEXT:    bl call
146; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
147; CHECK-NEXT:  .LBB11_2: // %exit
148; CHECK-NEXT:    ret
149    %cmp = icmp ne i128 %a, %b
150    br i1 %cmp, label %call, label %exit
151call:
152    call void @call()
153    br label %exit
154exit:
155    ret void
156}
157
158define void @br_on_cmp_i128_ugt(i128 %a, i128 %b) nounwind {
159; CHECK-LABEL: br_on_cmp_i128_ugt:
160; CHECK:       // %bb.0:
161; CHECK-NEXT:    cmp x2, x0
162; CHECK-NEXT:    sbcs xzr, x3, x1
163; CHECK-NEXT:    b.hs .LBB12_2
164; CHECK-NEXT:  // %bb.1: // %call
165; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
166; CHECK-NEXT:    bl call
167; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
168; CHECK-NEXT:  .LBB12_2: // %exit
169; CHECK-NEXT:    ret
170    %cmp = icmp ugt i128 %a, %b
171    br i1 %cmp, label %call, label %exit
172call:
173    call void @call()
174    br label %exit
175exit:
176    ret void
177}
178
179define void @br_on_cmp_i128_uge(i128 %a, i128 %b) nounwind {
180; CHECK-LABEL: br_on_cmp_i128_uge:
181; CHECK:       // %bb.0:
182; CHECK-NEXT:    cmp x0, x2
183; CHECK-NEXT:    sbcs xzr, x1, x3
184; CHECK-NEXT:    b.lo .LBB13_2
185; CHECK-NEXT:  // %bb.1: // %call
186; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
187; CHECK-NEXT:    bl call
188; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
189; CHECK-NEXT:  .LBB13_2: // %exit
190; CHECK-NEXT:    ret
191    %cmp = icmp uge i128 %a, %b
192    br i1 %cmp, label %call, label %exit
193call:
194    call void @call()
195    br label %exit
196exit:
197    ret void
198}
199
200define void @br_on_cmp_i128_ult(i128 %a, i128 %b) nounwind {
201; CHECK-LABEL: br_on_cmp_i128_ult:
202; CHECK:       // %bb.0:
203; CHECK-NEXT:    cmp x0, x2
204; CHECK-NEXT:    sbcs xzr, x1, x3
205; CHECK-NEXT:    b.hs .LBB14_2
206; CHECK-NEXT:  // %bb.1: // %call
207; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
208; CHECK-NEXT:    bl call
209; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
210; CHECK-NEXT:  .LBB14_2: // %exit
211; CHECK-NEXT:    ret
212    %cmp = icmp ult i128 %a, %b
213    br i1 %cmp, label %call, label %exit
214call:
215    call void @call()
216    br label %exit
217exit:
218    ret void
219}
220
221define void @br_on_cmp_i128_ule(i128 %a, i128 %b) nounwind {
222; CHECK-LABEL: br_on_cmp_i128_ule:
223; CHECK:       // %bb.0:
224; CHECK-NEXT:    cmp x2, x0
225; CHECK-NEXT:    sbcs xzr, x3, x1
226; CHECK-NEXT:    b.lo .LBB15_2
227; CHECK-NEXT:  // %bb.1: // %call
228; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
229; CHECK-NEXT:    bl call
230; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
231; CHECK-NEXT:  .LBB15_2: // %exit
232; CHECK-NEXT:    ret
233    %cmp = icmp ule i128 %a, %b
234    br i1 %cmp, label %call, label %exit
235call:
236    call void @call()
237    br label %exit
238exit:
239    ret void
240}
241
242define void @br_on_cmp_i128_sgt(i128 %a, i128 %b) nounwind {
243; CHECK-LABEL: br_on_cmp_i128_sgt:
244; CHECK:       // %bb.0:
245; CHECK-NEXT:    cmp x2, x0
246; CHECK-NEXT:    sbcs xzr, x3, x1
247; CHECK-NEXT:    b.ge .LBB16_2
248; CHECK-NEXT:  // %bb.1: // %call
249; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
250; CHECK-NEXT:    bl call
251; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
252; CHECK-NEXT:  .LBB16_2: // %exit
253; CHECK-NEXT:    ret
254    %cmp = icmp sgt i128 %a, %b
255    br i1 %cmp, label %call, label %exit
256call:
257    call void @call()
258    br label %exit
259exit:
260    ret void
261}
262
263define void @br_on_cmp_i128_sge(i128 %a, i128 %b) nounwind {
264; CHECK-LABEL: br_on_cmp_i128_sge:
265; CHECK:       // %bb.0:
266; CHECK-NEXT:    cmp x0, x2
267; CHECK-NEXT:    sbcs xzr, x1, x3
268; CHECK-NEXT:    b.lt .LBB17_2
269; CHECK-NEXT:  // %bb.1: // %call
270; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
271; CHECK-NEXT:    bl call
272; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
273; CHECK-NEXT:  .LBB17_2: // %exit
274; CHECK-NEXT:    ret
275    %cmp = icmp sge i128 %a, %b
276    br i1 %cmp, label %call, label %exit
277call:
278    call void @call()
279    br label %exit
280exit:
281    ret void
282}
283
284define void @br_on_cmp_i128_slt(i128 %a, i128 %b) nounwind {
285; CHECK-LABEL: br_on_cmp_i128_slt:
286; CHECK:       // %bb.0:
287; CHECK-NEXT:    cmp x0, x2
288; CHECK-NEXT:    sbcs xzr, x1, x3
289; CHECK-NEXT:    b.ge .LBB18_2
290; CHECK-NEXT:  // %bb.1: // %call
291; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
292; CHECK-NEXT:    bl call
293; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
294; CHECK-NEXT:  .LBB18_2: // %exit
295; CHECK-NEXT:    ret
296    %cmp = icmp slt i128 %a, %b
297    br i1 %cmp, label %call, label %exit
298call:
299    call void @call()
300    br label %exit
301exit:
302    ret void
303}
304
305define void @br_on_cmp_i128_sle(i128 %a, i128 %b) nounwind {
306; CHECK-LABEL: br_on_cmp_i128_sle:
307; CHECK:       // %bb.0:
308; CHECK-NEXT:    cmp x2, x0
309; CHECK-NEXT:    sbcs xzr, x3, x1
310; CHECK-NEXT:    b.lt .LBB19_2
311; CHECK-NEXT:  // %bb.1: // %call
312; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
313; CHECK-NEXT:    bl call
314; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
315; CHECK-NEXT:  .LBB19_2: // %exit
316; CHECK-NEXT:    ret
317    %cmp = icmp sle i128 %a, %b
318    br i1 %cmp, label %call, label %exit
319call:
320    call void @call()
321    br label %exit
322exit:
323    ret void
324}
325
326