[mips] MIPS-IV is broadly the same as MIPS64 so duplicate all -mcpu=mips64 tests...
[oota-llvm.git] / test / CodeGen / ARM / segmented-stacks.ll
1 ; RUN: llc < %s -mtriple=arm-linux-androideabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-android
2 ; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -verify-machineinstrs | FileCheck %s -check-prefix=ARM-linux
3
4 ; We used to crash with filetype=obj
5 ; RUN: llc < %s -mtriple=arm-linux-androideabi -filetype=obj
6 ; RUN: llc < %s -mtriple=arm-linux-unknown-gnueabi -filetype=obj
7
8
9 ; Just to prevent the alloca from being optimized away
10 declare void @dummy_use(i32*, i32)
11
12 define void @test_basic() #0 {
13         %mem = alloca i32, i32 10
14         call void @dummy_use (i32* %mem, i32 10)
15         ret void
16
17 ; ARM-linux:      test_basic:
18
19 ; ARM-linux:      push    {r4, r5}
20 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
21 ; ARM-linux-NEXT: mov     r5, sp
22 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
23 ; ARM-linux-NEXT: cmp     r4, r5
24 ; ARM-linux-NEXT: blo     .LBB0_2
25
26 ; ARM-linux:      mov     r4, #48
27 ; ARM-linux-NEXT: mov     r5, #0
28 ; ARM-linux-NEXT: stmdb   sp!, {lr}
29 ; ARM-linux-NEXT: bl      __morestack
30 ; ARM-linux-NEXT: ldm     sp!, {lr}
31 ; ARM-linux-NEXT: pop     {r4, r5}
32 ; ARM-linux-NEXT: bx      lr
33
34 ; ARM-linux:      pop     {r4, r5}
35
36 ; ARM-android:      test_basic:
37
38 ; ARM-android:      push    {r4, r5}
39 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
40 ; ARM-android-NEXT: mov     r5, sp
41 ; ARM-android-NEXT: ldr     r4, [r4, #252]
42 ; ARM-android-NEXT: cmp     r4, r5
43 ; ARM-android-NEXT: blo     .LBB0_2
44
45 ; ARM-android:      mov     r4, #48
46 ; ARM-android-NEXT: mov     r5, #0
47 ; ARM-android-NEXT: stmdb   sp!, {lr}
48 ; ARM-android-NEXT: bl      __morestack
49 ; ARM-android-NEXT: ldm     sp!, {lr}
50 ; ARM-android-NEXT: pop     {r4, r5}
51 ; ARM-android-NEXT: bx      lr
52
53 ; ARM-android:      pop     {r4, r5}
54
55 }
56
57 define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
58        %addend = load i32 * %closure
59        %result = add i32 %other, %addend
60        ret i32 %result
61
62 ; ARM-linux:      test_nested:
63
64 ; ARM-linux:      push    {r4, r5}
65 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
66 ; ARM-linux-NEXT: mov     r5, sp
67 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
68 ; ARM-linux-NEXT: cmp     r4, r5
69 ; ARM-linux-NEXT: blo     .LBB1_2
70
71 ; ARM-linux:      mov     r4, #0
72 ; ARM-linux-NEXT: mov     r5, #0
73 ; ARM-linux-NEXT: stmdb   sp!, {lr}
74 ; ARM-linux-NEXT: bl      __morestack
75 ; ARM-linux-NEXT: ldm     sp!, {lr}
76 ; ARM-linux-NEXT: pop     {r4, r5}
77 ; ARM-linux-NEXT: bx      lr
78
79 ; ARM-linux:      pop     {r4, r5}
80
81 ; ARM-android:      test_nested:
82
83 ; ARM-android:      push    {r4, r5}
84 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
85 ; ARM-android-NEXT: mov     r5, sp
86 ; ARM-android-NEXT: ldr     r4, [r4, #252]
87 ; ARM-android-NEXT: cmp     r4, r5
88 ; ARM-android-NEXT: blo     .LBB1_2
89
90 ; ARM-android:      mov     r4, #0
91 ; ARM-android-NEXT: mov     r5, #0
92 ; ARM-android-NEXT: stmdb   sp!, {lr}
93 ; ARM-android-NEXT: bl      __morestack
94 ; ARM-android-NEXT: ldm     sp!, {lr}
95 ; ARM-android-NEXT: pop     {r4, r5}
96 ; ARM-android-NEXT: bx      lr
97
98 ; ARM-android:      pop     {r4, r5}
99
100 }
101
102 define void @test_large() #0 {
103         %mem = alloca i32, i32 10000
104         call void @dummy_use (i32* %mem, i32 0)
105         ret void
106
107 ; ARM-linux:      test_large:
108
109 ; ARM-linux:      push    {r4, r5}
110 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
111 ; ARM-linux-NEXT: sub     r5, sp, #40192
112 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
113 ; ARM-linux-NEXT: cmp     r4, r5
114 ; ARM-linux-NEXT: blo     .LBB2_2
115
116 ; ARM-linux:      mov     r4, #40192
117 ; ARM-linux-NEXT: mov     r5, #0
118 ; ARM-linux-NEXT: stmdb   sp!, {lr}
119 ; ARM-linux-NEXT: bl      __morestack
120 ; ARM-linux-NEXT: ldm     sp!, {lr}
121 ; ARM-linux-NEXT: pop     {r4, r5}
122 ; ARM-linux-NEXT: bx      lr
123
124 ; ARM-linux:      pop     {r4, r5}
125
126 ; ARM-android:      test_large:
127
128 ; ARM-android:      push    {r4, r5}
129 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
130 ; ARM-android-NEXT: sub     r5, sp, #40192
131 ; ARM-android-NEXT: ldr     r4, [r4, #252]
132 ; ARM-android-NEXT: cmp     r4, r5
133 ; ARM-android-NEXT: blo     .LBB2_2
134
135 ; ARM-android:      mov     r4, #40192
136 ; ARM-android-NEXT: mov     r5, #0
137 ; ARM-android-NEXT: stmdb   sp!, {lr}
138 ; ARM-android-NEXT: bl      __morestack
139 ; ARM-android-NEXT: ldm     sp!, {lr}
140 ; ARM-android-NEXT: pop     {r4, r5}
141 ; ARM-android-NEXT: bx      lr
142
143 ; ARM-android:      pop     {r4, r5}
144
145 }
146
147 define fastcc void @test_fastcc() #0 {
148         %mem = alloca i32, i32 10
149         call void @dummy_use (i32* %mem, i32 10)
150         ret void
151
152 ; ARM-linux:      test_fastcc:
153
154 ; ARM-linux:      push    {r4, r5}
155 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
156 ; ARM-linux-NEXT: mov     r5, sp
157 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
158 ; ARM-linux-NEXT: cmp     r4, r5
159 ; ARM-linux-NEXT: blo     .LBB3_2
160
161 ; ARM-linux:      mov     r4, #48
162 ; ARM-linux-NEXT: mov     r5, #0
163 ; ARM-linux-NEXT: stmdb   sp!, {lr}
164 ; ARM-linux-NEXT: bl      __morestack
165 ; ARM-linux-NEXT: ldm     sp!, {lr}
166 ; ARM-linux-NEXT: pop     {r4, r5}
167 ; ARM-linux-NEXT: bx      lr
168
169 ; ARM-linux:      pop     {r4, r5}
170
171 ; ARM-android:      test_fastcc:
172
173 ; ARM-android:      push    {r4, r5}
174 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
175 ; ARM-android-NEXT: mov     r5, sp
176 ; ARM-android-NEXT: ldr     r4, [r4, #252]
177 ; ARM-android-NEXT: cmp     r4, r5
178 ; ARM-android-NEXT: blo     .LBB3_2
179
180 ; ARM-android:      mov     r4, #48
181 ; ARM-android-NEXT: mov     r5, #0
182 ; ARM-android-NEXT: stmdb   sp!, {lr}
183 ; ARM-android-NEXT: bl      __morestack
184 ; ARM-android-NEXT: ldm     sp!, {lr}
185 ; ARM-android-NEXT: pop     {r4, r5}
186 ; ARM-android-NEXT: bx      lr
187
188 ; ARM-android:      pop     {r4, r5}
189
190 }
191
192 define fastcc void @test_fastcc_large() #0 {
193         %mem = alloca i32, i32 10000
194         call void @dummy_use (i32* %mem, i32 0)
195         ret void
196
197 ; ARM-linux:      test_fastcc_large:
198
199 ; ARM-linux:      push    {r4, r5}
200 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
201 ; ARM-linux-NEXT: sub     r5, sp, #40192
202 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
203 ; ARM-linux-NEXT: cmp     r4, r5
204 ; ARM-linux-NEXT: blo     .LBB4_2
205
206 ; ARM-linux:      mov     r4, #40192
207 ; ARM-linux-NEXT: mov     r5, #0
208 ; ARM-linux-NEXT: stmdb   sp!, {lr}
209 ; ARM-linux-NEXT: bl      __morestack
210 ; ARM-linux-NEXT: ldm     sp!, {lr}
211 ; ARM-linux-NEXT: pop     {r4, r5}
212 ; ARM-linux-NEXT: bx      lr
213
214 ; ARM-linux:      pop     {r4, r5}
215
216 ; ARM-android:      test_fastcc_large:
217
218 ; ARM-android:      push    {r4, r5}
219 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
220 ; ARM-android-NEXT: sub     r5, sp, #40192
221 ; ARM-android-NEXT: ldr     r4, [r4, #252]
222 ; ARM-android-NEXT: cmp     r4, r5
223 ; ARM-android-NEXT: blo     .LBB4_2
224
225 ; ARM-android:      mov     r4, #40192
226 ; ARM-android-NEXT: mov     r5, #0
227 ; ARM-android-NEXT: stmdb   sp!, {lr}
228 ; ARM-android-NEXT: bl      __morestack
229 ; ARM-android-NEXT: ldm     sp!, {lr}
230 ; ARM-android-NEXT: pop     {r4, r5}
231 ; ARM-android-NEXT: bx      lr
232
233 ; ARM-android:      pop     {r4, r5}
234
235 }
236
237 attributes #0 = { "split-stack" }