1 ; 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
7 ; Just to prevent the alloca from being optimized away
8 declare void @dummy_use(i32*, i32)
10 define void @test_basic() #0 {
11 %mem = alloca i32, i32 10
12 call void @dummy_use (i32* %mem, i32 10)
15 ; Thumb-android: test_basic:
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
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
33 ; Thumb-android: pop {r4, r5}
35 ; Thumb-linux: test_basic:
37 ; Thumb-linux: push {r4, r5}
38 ; Thumb-linux-NEXT: mov r5, sp
39 ; Thumb-linux-NEXT: ldr r4, .LCPI0_0
40 ; Thumb-linux-NEXT: ldr r4, [r4]
41 ; Thumb-linux-NEXT: cmp r4, r5
42 ; Thumb-linux-NEXT: blo .LBB0_2
44 ; Thumb-linux: mov r4, #48
45 ; Thumb-linux-NEXT: mov r5, #0
46 ; Thumb-linux-NEXT: push {lr}
47 ; Thumb-linux-NEXT: bl __morestack
48 ; Thumb-linux-NEXT: pop {r4}
49 ; Thumb-linux-NEXT: mov lr, r4
50 ; Thumb-linux-NEXT: pop {r4, r5}
51 ; Thumb-linux-NEXT: bx lr
53 ; Thumb-linux: pop {r4, r5}
57 define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
58 %addend = load i32 * %closure
59 %result = add i32 %other, %addend
62 ; Thumb-android: test_nested:
64 ; Thumb-android: push {r4, r5}
65 ; Thumb-android-NEXT: mov r5, sp
66 ; Thumb-android-NEXT: ldr r4, .LCPI1_0
67 ; Thumb-android-NEXT: ldr r4, [r4]
68 ; Thumb-android-NEXT: cmp r4, r5
69 ; Thumb-android-NEXT: blo .LBB1_2
71 ; Thumb-android: mov r4, #0
72 ; Thumb-android-NEXT: mov r5, #0
73 ; Thumb-android-NEXT: push {lr}
74 ; Thumb-android-NEXT: bl __morestack
75 ; Thumb-android-NEXT: pop {r4}
76 ; Thumb-android-NEXT: mov lr, r4
77 ; Thumb-android-NEXT: pop {r4, r5}
78 ; Thumb-android-NEXT: bx lr
80 ; Thumb-android: pop {r4, r5}
82 ; Thumb-linux: test_nested:
84 ; Thumb-linux: push {r4, r5}
85 ; Thumb-linux-NEXT: mov r5, sp
86 ; Thumb-linux-NEXT: ldr r4, .LCPI1_0
87 ; Thumb-linux-NEXT: ldr r4, [r4]
88 ; Thumb-linux-NEXT: cmp r4, r5
89 ; Thumb-linux-NEXT: blo .LBB1_2
91 ; Thumb-linux: mov r4, #0
92 ; Thumb-linux-NEXT: mov r5, #0
93 ; Thumb-linux-NEXT: push {lr}
94 ; Thumb-linux-NEXT: bl __morestack
95 ; Thumb-linux-NEXT: pop {r4}
96 ; Thumb-linux-NEXT: mov lr, r4
97 ; Thumb-linux-NEXT: pop {r4, r5}
98 ; Thumb-linux-NEXT: bx lr
100 ; Thumb-linux: pop {r4, r5}
104 define void @test_large() #0 {
105 %mem = alloca i32, i32 10000
106 call void @dummy_use (i32* %mem, i32 0)
109 ; Thumb-android: test_large:
111 ; Thumb-android: push {r4, r5}
112 ; Thumb-android-NEXT: mov r5, sp
113 ; Thumb-android-NEXT: sub r5, #40192
114 ; Thumb-android-NEXT: ldr r4, .LCPI2_2
115 ; Thumb-android-NEXT: ldr r4, [r4]
116 ; Thumb-android-NEXT: cmp r4, r5
117 ; Thumb-android-NEXT: blo .LBB2_2
119 ; Thumb-android: mov r4, #40192
120 ; Thumb-android-NEXT: mov r5, #0
121 ; Thumb-android-NEXT: push {lr}
122 ; Thumb-android-NEXT: bl __morestack
123 ; Thumb-android-NEXT: pop {r4}
124 ; Thumb-android-NEXT: mov lr, r4
125 ; Thumb-android-NEXT: pop {r4, r5}
126 ; Thumb-android-NEXT: bx lr
128 ; Thumb-android: pop {r4, r5}
130 ; Thumb-linux: test_large:
132 ; Thumb-linux: push {r4, r5}
133 ; Thumb-linux-NEXT: mov r5, sp
134 ; Thumb-linux-NEXT: sub r5, #40192
135 ; Thumb-linux-NEXT: ldr r4, .LCPI2_2
136 ; Thumb-linux-NEXT: ldr r4, [r4]
137 ; Thumb-linux-NEXT: cmp r4, r5
138 ; Thumb-linux-NEXT: blo .LBB2_2
140 ; Thumb-linux: mov r4, #40192
141 ; Thumb-linux-NEXT: mov r5, #0
142 ; Thumb-linux-NEXT: push {lr}
143 ; Thumb-linux-NEXT: bl __morestack
144 ; Thumb-linux-NEXT: pop {r4}
145 ; Thumb-linux-NEXT: mov lr, r4
146 ; Thumb-linux-NEXT: pop {r4, r5}
147 ; Thumb-linux-NEXT: bx lr
149 ; Thumb-linux: pop {r4, r5}
153 define fastcc void @test_fastcc() #0 {
154 %mem = alloca i32, i32 10
155 call void @dummy_use (i32* %mem, i32 10)
158 ; Thumb-android: test_fastcc:
160 ; Thumb-android: push {r4, r5}
161 ; Thumb-android-NEXT: mov r5, sp
162 ; Thumb-android-NEXT: ldr r4, .LCPI3_0
163 ; Thumb-android-NEXT: ldr r4, [r4]
164 ; Thumb-android-NEXT: cmp r4, r5
165 ; Thumb-android-NEXT: blo .LBB3_2
167 ; Thumb-android: mov r4, #48
168 ; Thumb-android-NEXT: mov r5, #0
169 ; Thumb-android-NEXT: push {lr}
170 ; Thumb-android-NEXT: bl __morestack
171 ; Thumb-android-NEXT: pop {r4}
172 ; Thumb-android-NEXT: mov lr, r4
173 ; Thumb-android-NEXT: pop {r4, r5}
174 ; Thumb-android-NEXT: bx lr
176 ; Thumb-android: pop {r4, r5}
178 ; Thumb-linux: test_fastcc:
180 ; Thumb-linux: push {r4, r5}
181 ; Thumb-linux-NEXT: mov r5, sp
182 ; Thumb-linux-NEXT: ldr r4, .LCPI3_0
183 ; Thumb-linux-NEXT: ldr r4, [r4]
184 ; Thumb-linux-NEXT: cmp r4, r5
185 ; Thumb-linux-NEXT: blo .LBB3_2
187 ; Thumb-linux: mov r4, #48
188 ; Thumb-linux-NEXT: mov r5, #0
189 ; Thumb-linux-NEXT: push {lr}
190 ; Thumb-linux-NEXT: bl __morestack
191 ; Thumb-linux-NEXT: pop {r4}
192 ; Thumb-linux-NEXT: mov lr, r4
193 ; Thumb-linux-NEXT: pop {r4, r5}
194 ; Thumb-linux-NEXT: bx lr
196 ; Thumb-linux: pop {r4, r5}
200 define fastcc void @test_fastcc_large() #0 {
201 %mem = alloca i32, i32 10000
202 call void @dummy_use (i32* %mem, i32 0)
205 ; Thumb-android: test_fastcc_large:
207 ; Thumb-android: push {r4, r5}
208 ; Thumb-android-NEXT: mov r5, sp
209 ; Thumb-android-NEXT: sub r5, #40192
210 ; Thumb-android-NEXT: ldr r4, .LCPI4_2
211 ; Thumb-android-NEXT: ldr r4, [r4]
212 ; Thumb-android-NEXT: cmp r4, r5
213 ; Thumb-android-NEXT: blo .LBB4_2
215 ; Thumb-android: mov r4, #40192
216 ; Thumb-android-NEXT: mov r5, #0
217 ; Thumb-android-NEXT: push {lr}
218 ; Thumb-android-NEXT: bl __morestack
219 ; Thumb-android-NEXT: pop {r4}
220 ; Thumb-android-NEXT: mov lr, r4
221 ; Thumb-android-NEXT: pop {r4, r5}
222 ; Thumb-android-NEXT: bx lr
224 ; Thumb-android: pop {r4, r5}
226 ; Thumb-linux: test_fastcc_large:
228 ; Thumb-linux: push {r4, r5}
229 ; Thumb-linux-NEXT: mov r5, sp
230 ; Thumb-linux-NEXT: sub r5, #40192
231 ; Thumb-linux-NEXT: ldr r4, .LCPI4_2
232 ; Thumb-linux-NEXT: ldr r4, [r4]
233 ; Thumb-linux-NEXT: cmp r4, r5
234 ; Thumb-linux-NEXT: blo .LBB4_2
236 ; Thumb-linux: mov r4, #40192
237 ; Thumb-linux-NEXT: mov r5, #0
238 ; Thumb-linux-NEXT: push {lr}
239 ; Thumb-linux-NEXT: bl __morestack
240 ; Thumb-linux-NEXT: pop {r4}
241 ; Thumb-linux-NEXT: mov lr, r4
242 ; Thumb-linux-NEXT: pop {r4, r5}
243 ; Thumb-linux-NEXT: bx lr
245 ; Thumb-linux: pop {r4, r5}
249 attributes #0 = { "split-stack" }