xref: /llvm-project/llvm/test/CodeGen/ARM/wide-compares.ll (revision e0ed0333f0fed2e73f805afd58b61176a87aa3ad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=armv7-unknown-linux < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-ARM %s
3; RUN: llc -mtriple=thumb-eabi < %s  -verify-machineinstrs | FileCheck --check-prefix=CHECK-THUMB1-NOMOV %s
4; RUN: llc -mtriple=thumbv6-unknown-linux < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-THUMB1 %s
5; RUN: llc -mtriple=thumbv7-unknown-linux < %s -verify-machineinstrs | FileCheck --check-prefix=CHECK-THUMB2 %s
6
7define i32 @test_slt1(i64 %a, i64 %b) {
8; CHECK-ARM-LABEL: test_slt1:
9; CHECK-ARM:       @ %bb.0: @ %entry
10; CHECK-ARM-NEXT:    subs r0, r0, r2
11; CHECK-ARM-NEXT:    mov r12, #2
12; CHECK-ARM-NEXT:    sbcs r0, r1, r3
13; CHECK-ARM-NEXT:    movwlt r12, #1
14; CHECK-ARM-NEXT:    mov r0, r12
15; CHECK-ARM-NEXT:    bx lr
16;
17; CHECK-THUMB1-NOMOV-LABEL: test_slt1:
18; CHECK-THUMB1-NOMOV:       @ %bb.0: @ %entry
19; CHECK-THUMB1-NOMOV-NEXT:    subs r0, r0, r2
20; CHECK-THUMB1-NOMOV-NEXT:    sbcs r1, r3
21; CHECK-THUMB1-NOMOV-NEXT:    bge .LBB0_2
22; CHECK-THUMB1-NOMOV-NEXT:  @ %bb.1: @ %bb1
23; CHECK-THUMB1-NOMOV-NEXT:    movs r0, #1
24; CHECK-THUMB1-NOMOV-NEXT:    bx lr
25; CHECK-THUMB1-NOMOV-NEXT:  .LBB0_2: @ %bb2
26; CHECK-THUMB1-NOMOV-NEXT:    movs r0, #2
27; CHECK-THUMB1-NOMOV-NEXT:    bx lr
28;
29; CHECK-THUMB1-LABEL: test_slt1:
30; CHECK-THUMB1:       @ %bb.0: @ %entry
31; CHECK-THUMB1-NEXT:    subs r0, r0, r2
32; CHECK-THUMB1-NEXT:    sbcs r1, r3
33; CHECK-THUMB1-NEXT:    bge .LBB0_2
34; CHECK-THUMB1-NEXT:  @ %bb.1: @ %bb1
35; CHECK-THUMB1-NEXT:    movs r0, #1
36; CHECK-THUMB1-NEXT:    bx lr
37; CHECK-THUMB1-NEXT:  .LBB0_2: @ %bb2
38; CHECK-THUMB1-NEXT:    movs r0, #2
39; CHECK-THUMB1-NEXT:    bx lr
40;
41; CHECK-THUMB2-LABEL: test_slt1:
42; CHECK-THUMB2:       @ %bb.0: @ %entry
43; CHECK-THUMB2-NEXT:    subs r0, r0, r2
44; CHECK-THUMB2-NEXT:    mov.w r12, #2
45; CHECK-THUMB2-NEXT:    sbcs.w r0, r1, r3
46; CHECK-THUMB2-NEXT:    it lt
47; CHECK-THUMB2-NEXT:    movlt.w r12, #1
48; CHECK-THUMB2-NEXT:    mov r0, r12
49; CHECK-THUMB2-NEXT:    bx lr
50entry:
51  %cmp = icmp slt i64 %a, %b
52  br i1 %cmp, label %bb1, label %bb2
53bb1:
54  ret i32 1
55bb2:
56  ret i32 2
57}
58
59define void @test_slt2(i64 %a, i64 %b) {
60; CHECK-ARM-LABEL: test_slt2:
61; CHECK-ARM:       @ %bb.0: @ %entry
62; CHECK-ARM-NEXT:    push {r11, lr}
63; CHECK-ARM-NEXT:    subs r0, r0, r2
64; CHECK-ARM-NEXT:    sbcs r0, r1, r3
65; CHECK-ARM-NEXT:    bge .LBB1_2
66; CHECK-ARM-NEXT:  @ %bb.1: @ %bb1
67; CHECK-ARM-NEXT:    bl f
68; CHECK-ARM-NEXT:    pop {r11, pc}
69; CHECK-ARM-NEXT:  .LBB1_2: @ %bb2
70; CHECK-ARM-NEXT:    bl g
71; CHECK-ARM-NEXT:    pop {r11, pc}
72;
73; CHECK-THUMB1-NOMOV-LABEL: test_slt2:
74; CHECK-THUMB1-NOMOV:       @ %bb.0: @ %entry
75; CHECK-THUMB1-NOMOV-NEXT:    .save {r7, lr}
76; CHECK-THUMB1-NOMOV-NEXT:    push {r7, lr}
77; CHECK-THUMB1-NOMOV-NEXT:    subs r0, r0, r2
78; CHECK-THUMB1-NOMOV-NEXT:    sbcs r1, r3
79; CHECK-THUMB1-NOMOV-NEXT:    bge .LBB1_2
80; CHECK-THUMB1-NOMOV-NEXT:  @ %bb.1: @ %bb1
81; CHECK-THUMB1-NOMOV-NEXT:    bl f
82; CHECK-THUMB1-NOMOV-NEXT:    b .LBB1_3
83; CHECK-THUMB1-NOMOV-NEXT:  .LBB1_2: @ %bb2
84; CHECK-THUMB1-NOMOV-NEXT:    bl g
85; CHECK-THUMB1-NOMOV-NEXT:  .LBB1_3: @ %bb1
86; CHECK-THUMB1-NOMOV-NEXT:    pop {r7}
87; CHECK-THUMB1-NOMOV-NEXT:    pop {r0}
88; CHECK-THUMB1-NOMOV-NEXT:    bx r0
89;
90; CHECK-THUMB1-LABEL: test_slt2:
91; CHECK-THUMB1:       @ %bb.0: @ %entry
92; CHECK-THUMB1-NEXT:    push {r7, lr}
93; CHECK-THUMB1-NEXT:    subs r0, r0, r2
94; CHECK-THUMB1-NEXT:    sbcs r1, r3
95; CHECK-THUMB1-NEXT:    bge .LBB1_2
96; CHECK-THUMB1-NEXT:  @ %bb.1: @ %bb1
97; CHECK-THUMB1-NEXT:    bl f
98; CHECK-THUMB1-NEXT:    pop {r7, pc}
99; CHECK-THUMB1-NEXT:  .LBB1_2: @ %bb2
100; CHECK-THUMB1-NEXT:    bl g
101; CHECK-THUMB1-NEXT:    pop {r7, pc}
102;
103; CHECK-THUMB2-LABEL: test_slt2:
104; CHECK-THUMB2:       @ %bb.0: @ %entry
105; CHECK-THUMB2-NEXT:    push {r7, lr}
106; CHECK-THUMB2-NEXT:    subs r0, r0, r2
107; CHECK-THUMB2-NEXT:    sbcs.w r0, r1, r3
108; CHECK-THUMB2-NEXT:    bge .LBB1_2
109; CHECK-THUMB2-NEXT:  @ %bb.1: @ %bb1
110; CHECK-THUMB2-NEXT:    bl f
111; CHECK-THUMB2-NEXT:    pop {r7, pc}
112; CHECK-THUMB2-NEXT:  .LBB1_2: @ %bb2
113; CHECK-THUMB2-NEXT:    bl g
114; CHECK-THUMB2-NEXT:    pop {r7, pc}
115entry:
116  %cmp = icmp slt i64 %a, %b
117  br i1 %cmp, label %bb1, label %bb2
118bb1:
119  call void @f()
120  ret void
121bb2:
122  call void @g()
123  ret void
124}
125
126declare void @f()
127declare void @g()
128
129define i64 @test_slt_select(i64 %c, i64 %d, i64 %a, i64 %b) {
130; CHECK-ARM-LABEL: test_slt_select:
131; CHECK-ARM:       @ %bb.0: @ %entry
132; CHECK-ARM-NEXT:    push {r4, r5, r6, lr}
133; CHECK-ARM-NEXT:    ldr r12, [sp, #24]
134; CHECK-ARM-NEXT:    ldr lr, [sp, #16]
135; CHECK-ARM-NEXT:    ldr r6, [sp, #28]
136; CHECK-ARM-NEXT:    ldr r5, [sp, #20]
137; CHECK-ARM-NEXT:    subs r4, lr, r12
138; CHECK-ARM-NEXT:    sbcs r6, r5, r6
139; CHECK-ARM-NEXT:    movhs r0, r2
140; CHECK-ARM-NEXT:    movhs r1, r3
141; CHECK-ARM-NEXT:    pop {r4, r5, r6, pc}
142;
143; CHECK-THUMB1-NOMOV-LABEL: test_slt_select:
144; CHECK-THUMB1-NOMOV:       @ %bb.0: @ %entry
145; CHECK-THUMB1-NOMOV-NEXT:    .save {r4, r5, r6, r7, lr}
146; CHECK-THUMB1-NOMOV-NEXT:    push {r4, r5, r6, r7, lr}
147; CHECK-THUMB1-NOMOV-NEXT:    .pad #4
148; CHECK-THUMB1-NOMOV-NEXT:    sub sp, #4
149; CHECK-THUMB1-NOMOV-NEXT:    ldr r4, [sp, #36]
150; CHECK-THUMB1-NOMOV-NEXT:    ldr r5, [sp, #28]
151; CHECK-THUMB1-NOMOV-NEXT:    ldr r6, [sp, #32]
152; CHECK-THUMB1-NOMOV-NEXT:    ldr r7, [sp, #24]
153; CHECK-THUMB1-NOMOV-NEXT:    subs r6, r7, r6
154; CHECK-THUMB1-NOMOV-NEXT:    sbcs r5, r4
155; CHECK-THUMB1-NOMOV-NEXT:    blo .LBB2_2
156; CHECK-THUMB1-NOMOV-NEXT:  @ %bb.1: @ %entry
157; CHECK-THUMB1-NOMOV-NEXT:    mov r12, r2
158; CHECK-THUMB1-NOMOV-NEXT:    mov r0, r12
159; CHECK-THUMB1-NOMOV-NEXT:  .LBB2_2: @ %entry
160; CHECK-THUMB1-NOMOV-NEXT:    blo .LBB2_4
161; CHECK-THUMB1-NOMOV-NEXT:  @ %bb.3: @ %entry
162; CHECK-THUMB1-NOMOV-NEXT:    movs r1, r3
163; CHECK-THUMB1-NOMOV-NEXT:  .LBB2_4: @ %entry
164; CHECK-THUMB1-NOMOV-NEXT:    add sp, #4
165; CHECK-THUMB1-NOMOV-NEXT:    pop {r4, r5, r6, r7}
166; CHECK-THUMB1-NOMOV-NEXT:    pop {r2}
167; CHECK-THUMB1-NOMOV-NEXT:    bx r2
168;
169; CHECK-THUMB1-LABEL: test_slt_select:
170; CHECK-THUMB1:       @ %bb.0: @ %entry
171; CHECK-THUMB1-NEXT:    push {r4, r5, r6, r7, lr}
172; CHECK-THUMB1-NEXT:    sub sp, #4
173; CHECK-THUMB1-NEXT:    ldr r4, [sp, #36]
174; CHECK-THUMB1-NEXT:    ldr r5, [sp, #28]
175; CHECK-THUMB1-NEXT:    ldr r6, [sp, #32]
176; CHECK-THUMB1-NEXT:    ldr r7, [sp, #24]
177; CHECK-THUMB1-NEXT:    subs r6, r7, r6
178; CHECK-THUMB1-NEXT:    sbcs r5, r4
179; CHECK-THUMB1-NEXT:    bhs .LBB2_3
180; CHECK-THUMB1-NEXT:  @ %bb.1: @ %entry
181; CHECK-THUMB1-NEXT:    bhs .LBB2_4
182; CHECK-THUMB1-NEXT:  .LBB2_2: @ %entry
183; CHECK-THUMB1-NEXT:    add sp, #4
184; CHECK-THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
185; CHECK-THUMB1-NEXT:  .LBB2_3: @ %entry
186; CHECK-THUMB1-NEXT:    mov r0, r2
187; CHECK-THUMB1-NEXT:    blo .LBB2_2
188; CHECK-THUMB1-NEXT:  .LBB2_4: @ %entry
189; CHECK-THUMB1-NEXT:    mov r1, r3
190; CHECK-THUMB1-NEXT:    add sp, #4
191; CHECK-THUMB1-NEXT:    pop {r4, r5, r6, r7, pc}
192;
193; CHECK-THUMB2-LABEL: test_slt_select:
194; CHECK-THUMB2:       @ %bb.0: @ %entry
195; CHECK-THUMB2-NEXT:    push {r4, r5, r6, lr}
196; CHECK-THUMB2-NEXT:    ldrd r12, r6, [sp, #24]
197; CHECK-THUMB2-NEXT:    ldrd lr, r5, [sp, #16]
198; CHECK-THUMB2-NEXT:    subs.w r4, lr, r12
199; CHECK-THUMB2-NEXT:    sbcs.w r6, r5, r6
200; CHECK-THUMB2-NEXT:    itt hs
201; CHECK-THUMB2-NEXT:    movhs r0, r2
202; CHECK-THUMB2-NEXT:    movhs r1, r3
203; CHECK-THUMB2-NEXT:    pop {r4, r5, r6, pc}
204entry:
205    %cmp = icmp ult i64 %a, %b
206    %r1 = select i1 %cmp, i64 %c, i64 %d
207    ret i64 %r1
208}
209
210define {i32, i32} @test_slt_not(i32 %c, i32 %d, i64 %a, i64 %b) {
211; CHECK-ARM-LABEL: test_slt_not:
212; CHECK-ARM:       @ %bb.0: @ %entry
213; CHECK-ARM-NEXT:    ldr r12, [sp]
214; CHECK-ARM-NEXT:    mov r1, #0
215; CHECK-ARM-NEXT:    ldr r0, [sp, #4]
216; CHECK-ARM-NEXT:    subs r2, r2, r12
217; CHECK-ARM-NEXT:    sbcs r0, r3, r0
218; CHECK-ARM-NEXT:    mov r0, #0
219; CHECK-ARM-NEXT:    movwge r1, #1
220; CHECK-ARM-NEXT:    movwlt r0, #1
221; CHECK-ARM-NEXT:    bx lr
222;
223; CHECK-THUMB1-NOMOV-LABEL: test_slt_not:
224; CHECK-THUMB1-NOMOV:       @ %bb.0: @ %entry
225; CHECK-THUMB1-NOMOV-NEXT:    .save {r4, r5, r7, lr}
226; CHECK-THUMB1-NOMOV-NEXT:    push {r4, r5, r7, lr}
227; CHECK-THUMB1-NOMOV-NEXT:    movs r1, #1
228; CHECK-THUMB1-NOMOV-NEXT:    movs r4, #0
229; CHECK-THUMB1-NOMOV-NEXT:    ldr r0, [sp, #20]
230; CHECK-THUMB1-NOMOV-NEXT:    ldr r5, [sp, #16]
231; CHECK-THUMB1-NOMOV-NEXT:    subs r2, r2, r5
232; CHECK-THUMB1-NOMOV-NEXT:    sbcs r3, r0
233; CHECK-THUMB1-NOMOV-NEXT:    mov r12, r1
234; CHECK-THUMB1-NOMOV-NEXT:    mov r0, r12
235; CHECK-THUMB1-NOMOV-NEXT:    blt .LBB3_2
236; CHECK-THUMB1-NOMOV-NEXT:  @ %bb.1: @ %entry
237; CHECK-THUMB1-NOMOV-NEXT:    mov r12, r4
238; CHECK-THUMB1-NOMOV-NEXT:    mov r0, r12
239; CHECK-THUMB1-NOMOV-NEXT:  .LBB3_2: @ %entry
240; CHECK-THUMB1-NOMOV-NEXT:    bge .LBB3_4
241; CHECK-THUMB1-NOMOV-NEXT:  @ %bb.3: @ %entry
242; CHECK-THUMB1-NOMOV-NEXT:    movs r1, r4
243; CHECK-THUMB1-NOMOV-NEXT:  .LBB3_4: @ %entry
244; CHECK-THUMB1-NOMOV-NEXT:    pop {r4, r5, r7}
245; CHECK-THUMB1-NOMOV-NEXT:    pop {r2}
246; CHECK-THUMB1-NOMOV-NEXT:    bx r2
247;
248; CHECK-THUMB1-LABEL: test_slt_not:
249; CHECK-THUMB1:       @ %bb.0: @ %entry
250; CHECK-THUMB1-NEXT:    push {r4, r5, r7, lr}
251; CHECK-THUMB1-NEXT:    movs r1, #1
252; CHECK-THUMB1-NEXT:    movs r4, #0
253; CHECK-THUMB1-NEXT:    ldr r0, [sp, #20]
254; CHECK-THUMB1-NEXT:    ldr r5, [sp, #16]
255; CHECK-THUMB1-NEXT:    subs r2, r2, r5
256; CHECK-THUMB1-NEXT:    sbcs r3, r0
257; CHECK-THUMB1-NEXT:    mov r0, r1
258; CHECK-THUMB1-NEXT:    bge .LBB3_3
259; CHECK-THUMB1-NEXT:  @ %bb.1: @ %entry
260; CHECK-THUMB1-NEXT:    blt .LBB3_4
261; CHECK-THUMB1-NEXT:  .LBB3_2: @ %entry
262; CHECK-THUMB1-NEXT:    pop {r4, r5, r7, pc}
263; CHECK-THUMB1-NEXT:  .LBB3_3: @ %entry
264; CHECK-THUMB1-NEXT:    mov r0, r4
265; CHECK-THUMB1-NEXT:    bge .LBB3_2
266; CHECK-THUMB1-NEXT:  .LBB3_4: @ %entry
267; CHECK-THUMB1-NEXT:    mov r1, r4
268; CHECK-THUMB1-NEXT:    pop {r4, r5, r7, pc}
269;
270; CHECK-THUMB2-LABEL: test_slt_not:
271; CHECK-THUMB2:       @ %bb.0: @ %entry
272; CHECK-THUMB2-NEXT:    ldr.w r12, [sp]
273; CHECK-THUMB2-NEXT:    movs r1, #0
274; CHECK-THUMB2-NEXT:    ldr r0, [sp, #4]
275; CHECK-THUMB2-NEXT:    subs.w r2, r2, r12
276; CHECK-THUMB2-NEXT:    sbcs.w r0, r3, r0
277; CHECK-THUMB2-NEXT:    mov.w r0, #0
278; CHECK-THUMB2-NEXT:    ite lt
279; CHECK-THUMB2-NEXT:    movlt r0, #1
280; CHECK-THUMB2-NEXT:    movge r1, #1
281; CHECK-THUMB2-NEXT:    bx lr
282entry:
283    %cmp = icmp slt i64 %a, %b
284    %not = xor i1 %cmp, true
285    %r1 = zext i1 %cmp to i32
286    %r2 = zext i1 %not to i32
287    %z = insertvalue { i32, i32 } undef, i32 %r1, 0
288    %z2 = insertvalue { i32, i32 } %z, i32 %r2, 1
289    ret { i32, i32 } %z2
290}
291