blob: 251c29534727e1477e395c359ee0298c0cf65507 [file] [log] [blame]
Reid Kleckner9c658212014-04-10 22:58:43 +00001; RUN: llc < %s -mtriple=thumb-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android
2; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux
3; RUN: llc < %s -mtriple=thumb-linux-androideabi -filetype=obj
4; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -filetype=obj
Oliver Stannardb14c6252014-04-02 16:10:33 +00005
6
7; Just to prevent the alloca from being optimized away
8declare void @dummy_use(i32*, i32)
9
Reid Kleckner9c658212014-04-10 22:58:43 +000010define void @test_basic() #0 {
Oliver Stannardb14c6252014-04-02 16:10:33 +000011 %mem = alloca i32, i32 10
12 call void @dummy_use (i32* %mem, i32 10)
13 ret void
14
Tim Northover956b0082015-10-02 18:07:13 +000015; Thumb-android-LABEL: test_basic:
Oliver Stannardb14c6252014-04-02 16:10:33 +000016
17; Thumb-android: push {r4, r5}
18; Thumb-android-NEXT: mov r5, sp
19; Thumb-android-NEXT: ldr r4, .LCPI0_0
20; Thumb-android-NEXT: ldr r4, [r4]
21; Thumb-android-NEXT: cmp r4, r5
22; Thumb-android-NEXT: blo .LBB0_2
23
24; Thumb-android: mov r4, #48
25; Thumb-android-NEXT: mov r5, #0
26; Thumb-android-NEXT: push {lr}
27; Thumb-android-NEXT: bl __morestack
28; Thumb-android-NEXT: pop {r4}
29; Thumb-android-NEXT: mov lr, r4
30; Thumb-android-NEXT: pop {r4, r5}
31; Thumb-android-NEXT: bx lr
32
33; Thumb-android: pop {r4, r5}
34
Tim Northover956b0082015-10-02 18:07:13 +000035; Thumb-android: .align 2
36; Thumb-android: .LCPI0_0:
37; Thumb-android-NEXT: .long __STACK_LIMIT
38
39; Thumb-linux-LABEL: test_basic:
Oliver Stannardb14c6252014-04-02 16:10:33 +000040
41; Thumb-linux: push {r4, r5}
42; Thumb-linux-NEXT: mov r5, sp
43; Thumb-linux-NEXT: ldr r4, .LCPI0_0
44; Thumb-linux-NEXT: ldr r4, [r4]
45; Thumb-linux-NEXT: cmp r4, r5
46; Thumb-linux-NEXT: blo .LBB0_2
47
48; Thumb-linux: mov r4, #48
49; Thumb-linux-NEXT: mov r5, #0
50; Thumb-linux-NEXT: push {lr}
51; Thumb-linux-NEXT: bl __morestack
52; Thumb-linux-NEXT: pop {r4}
53; Thumb-linux-NEXT: mov lr, r4
54; Thumb-linux-NEXT: pop {r4, r5}
55; Thumb-linux-NEXT: bx lr
56
57; Thumb-linux: pop {r4, r5}
58
59}
60
Reid Kleckner9c658212014-04-10 22:58:43 +000061define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
David Blaikiea79ac142015-02-27 21:17:42 +000062 %addend = load i32 , i32 * %closure
Oliver Stannardb14c6252014-04-02 16:10:33 +000063 %result = add i32 %other, %addend
Tim Northoverf9e798b2014-05-22 13:03:43 +000064 %mem = alloca i32, i32 10
65 call void @dummy_use (i32* %mem, i32 10)
Oliver Stannardb14c6252014-04-02 16:10:33 +000066 ret i32 %result
67
Tim Northover956b0082015-10-02 18:07:13 +000068; Thumb-android-LABEL: test_nested:
Oliver Stannardb14c6252014-04-02 16:10:33 +000069
70; Thumb-android: push {r4, r5}
71; Thumb-android-NEXT: mov r5, sp
72; Thumb-android-NEXT: ldr r4, .LCPI1_0
73; Thumb-android-NEXT: ldr r4, [r4]
74; Thumb-android-NEXT: cmp r4, r5
75; Thumb-android-NEXT: blo .LBB1_2
76
Tim Northoverf9e798b2014-05-22 13:03:43 +000077; Thumb-android: mov r4, #56
Oliver Stannardb14c6252014-04-02 16:10:33 +000078; Thumb-android-NEXT: mov r5, #0
79; Thumb-android-NEXT: push {lr}
80; Thumb-android-NEXT: bl __morestack
81; Thumb-android-NEXT: pop {r4}
82; Thumb-android-NEXT: mov lr, r4
83; Thumb-android-NEXT: pop {r4, r5}
84; Thumb-android-NEXT: bx lr
85
86; Thumb-android: pop {r4, r5}
87
Tim Northover956b0082015-10-02 18:07:13 +000088; Thumb-linux-LABEL: test_nested:
Oliver Stannardb14c6252014-04-02 16:10:33 +000089
90; Thumb-linux: push {r4, r5}
91; Thumb-linux-NEXT: mov r5, sp
92; Thumb-linux-NEXT: ldr r4, .LCPI1_0
93; Thumb-linux-NEXT: ldr r4, [r4]
94; Thumb-linux-NEXT: cmp r4, r5
95; Thumb-linux-NEXT: blo .LBB1_2
96
Tim Northoverf9e798b2014-05-22 13:03:43 +000097; Thumb-linux: mov r4, #56
Oliver Stannardb14c6252014-04-02 16:10:33 +000098; Thumb-linux-NEXT: mov r5, #0
99; Thumb-linux-NEXT: push {lr}
100; Thumb-linux-NEXT: bl __morestack
101; Thumb-linux-NEXT: pop {r4}
102; Thumb-linux-NEXT: mov lr, r4
103; Thumb-linux-NEXT: pop {r4, r5}
104; Thumb-linux-NEXT: bx lr
105
106; Thumb-linux: pop {r4, r5}
107
108}
109
Reid Kleckner9c658212014-04-10 22:58:43 +0000110define void @test_large() #0 {
Oliver Stannardb14c6252014-04-02 16:10:33 +0000111 %mem = alloca i32, i32 10000
112 call void @dummy_use (i32* %mem, i32 0)
113 ret void
114
Tim Northover956b0082015-10-02 18:07:13 +0000115; Thumb-android-LABEL: test_large:
Oliver Stannardb14c6252014-04-02 16:10:33 +0000116
117; Thumb-android: push {r4, r5}
118; Thumb-android-NEXT: mov r5, sp
119; Thumb-android-NEXT: sub r5, #40192
120; Thumb-android-NEXT: ldr r4, .LCPI2_2
121; Thumb-android-NEXT: ldr r4, [r4]
122; Thumb-android-NEXT: cmp r4, r5
123; Thumb-android-NEXT: blo .LBB2_2
124
125; Thumb-android: mov r4, #40192
126; Thumb-android-NEXT: mov r5, #0
127; Thumb-android-NEXT: push {lr}
128; Thumb-android-NEXT: bl __morestack
129; Thumb-android-NEXT: pop {r4}
130; Thumb-android-NEXT: mov lr, r4
131; Thumb-android-NEXT: pop {r4, r5}
132; Thumb-android-NEXT: bx lr
133
134; Thumb-android: pop {r4, r5}
135
Tim Northover956b0082015-10-02 18:07:13 +0000136; Thumb-linux-LABEL: test_large:
Oliver Stannardb14c6252014-04-02 16:10:33 +0000137
138; Thumb-linux: push {r4, r5}
139; Thumb-linux-NEXT: mov r5, sp
140; Thumb-linux-NEXT: sub r5, #40192
141; Thumb-linux-NEXT: ldr r4, .LCPI2_2
142; Thumb-linux-NEXT: ldr r4, [r4]
143; Thumb-linux-NEXT: cmp r4, r5
144; Thumb-linux-NEXT: blo .LBB2_2
145
146; Thumb-linux: mov r4, #40192
147; Thumb-linux-NEXT: mov r5, #0
148; Thumb-linux-NEXT: push {lr}
149; Thumb-linux-NEXT: bl __morestack
150; Thumb-linux-NEXT: pop {r4}
151; Thumb-linux-NEXT: mov lr, r4
152; Thumb-linux-NEXT: pop {r4, r5}
153; Thumb-linux-NEXT: bx lr
154
155; Thumb-linux: pop {r4, r5}
156
157}
158
Reid Kleckner9c658212014-04-10 22:58:43 +0000159define fastcc void @test_fastcc() #0 {
Oliver Stannardb14c6252014-04-02 16:10:33 +0000160 %mem = alloca i32, i32 10
161 call void @dummy_use (i32* %mem, i32 10)
162 ret void
163
Tim Northover956b0082015-10-02 18:07:13 +0000164; Thumb-android-LABEL: test_fastcc:
Oliver Stannardb14c6252014-04-02 16:10:33 +0000165
166; Thumb-android: push {r4, r5}
167; Thumb-android-NEXT: mov r5, sp
168; Thumb-android-NEXT: ldr r4, .LCPI3_0
169; Thumb-android-NEXT: ldr r4, [r4]
170; Thumb-android-NEXT: cmp r4, r5
171; Thumb-android-NEXT: blo .LBB3_2
172
173; Thumb-android: mov r4, #48
174; Thumb-android-NEXT: mov r5, #0
175; Thumb-android-NEXT: push {lr}
176; Thumb-android-NEXT: bl __morestack
177; Thumb-android-NEXT: pop {r4}
178; Thumb-android-NEXT: mov lr, r4
179; Thumb-android-NEXT: pop {r4, r5}
180; Thumb-android-NEXT: bx lr
181
182; Thumb-android: pop {r4, r5}
183
Tim Northover956b0082015-10-02 18:07:13 +0000184; Thumb-linux-LABEL: test_fastcc:
Oliver Stannardb14c6252014-04-02 16:10:33 +0000185
186; Thumb-linux: push {r4, r5}
187; Thumb-linux-NEXT: mov r5, sp
188; Thumb-linux-NEXT: ldr r4, .LCPI3_0
189; Thumb-linux-NEXT: ldr r4, [r4]
190; Thumb-linux-NEXT: cmp r4, r5
191; Thumb-linux-NEXT: blo .LBB3_2
192
193; Thumb-linux: mov r4, #48
194; Thumb-linux-NEXT: mov r5, #0
195; Thumb-linux-NEXT: push {lr}
196; Thumb-linux-NEXT: bl __morestack
197; Thumb-linux-NEXT: pop {r4}
198; Thumb-linux-NEXT: mov lr, r4
199; Thumb-linux-NEXT: pop {r4, r5}
200; Thumb-linux-NEXT: bx lr
201
202; Thumb-linux: pop {r4, r5}
203
204}
205
Reid Kleckner9c658212014-04-10 22:58:43 +0000206define fastcc void @test_fastcc_large() #0 {
Oliver Stannardb14c6252014-04-02 16:10:33 +0000207 %mem = alloca i32, i32 10000
208 call void @dummy_use (i32* %mem, i32 0)
209 ret void
210
Tim Northover956b0082015-10-02 18:07:13 +0000211; Thumb-android-LABEL: test_fastcc_large:
Oliver Stannardb14c6252014-04-02 16:10:33 +0000212
213; Thumb-android: push {r4, r5}
214; Thumb-android-NEXT: mov r5, sp
215; Thumb-android-NEXT: sub r5, #40192
216; Thumb-android-NEXT: ldr r4, .LCPI4_2
217; Thumb-android-NEXT: ldr r4, [r4]
218; Thumb-android-NEXT: cmp r4, r5
219; Thumb-android-NEXT: blo .LBB4_2
220
221; Thumb-android: mov r4, #40192
222; Thumb-android-NEXT: mov r5, #0
223; Thumb-android-NEXT: push {lr}
224; Thumb-android-NEXT: bl __morestack
225; Thumb-android-NEXT: pop {r4}
226; Thumb-android-NEXT: mov lr, r4
227; Thumb-android-NEXT: pop {r4, r5}
228; Thumb-android-NEXT: bx lr
229
230; Thumb-android: pop {r4, r5}
231
Tim Northover956b0082015-10-02 18:07:13 +0000232; Thumb-linux-LABEL: test_fastcc_large:
Oliver Stannardb14c6252014-04-02 16:10:33 +0000233
234; Thumb-linux: push {r4, r5}
235; Thumb-linux-NEXT: mov r5, sp
236; Thumb-linux-NEXT: sub r5, #40192
237; Thumb-linux-NEXT: ldr r4, .LCPI4_2
238; Thumb-linux-NEXT: ldr r4, [r4]
239; Thumb-linux-NEXT: cmp r4, r5
240; Thumb-linux-NEXT: blo .LBB4_2
241
242; Thumb-linux: mov r4, #40192
243; Thumb-linux-NEXT: mov r5, #0
244; Thumb-linux-NEXT: push {lr}
245; Thumb-linux-NEXT: bl __morestack
246; Thumb-linux-NEXT: pop {r4}
247; Thumb-linux-NEXT: mov lr, r4
248; Thumb-linux-NEXT: pop {r4, r5}
249; Thumb-linux-NEXT: bx lr
250
251; Thumb-linux: pop {r4, r5}
252
253}
Reid Kleckner9c658212014-04-10 22:58:43 +0000254
Tim Northoverf9e798b2014-05-22 13:03:43 +0000255define void @test_nostack() #0 {
256 ret void
257
258; Thumb-android-LABEL: test_nostack:
259; Thumb-android-NOT: bl __morestack
260
261; Thumb-linux-LABEL: test_nostack:
262; Thumb-linux-NOT: bl __morestack
263}
264
Reid Kleckner9c658212014-04-10 22:58:43 +0000265attributes #0 = { "split-stack" }