[X86] Improve the lowering of packed shifts by constant build_vector.
[oota-llvm.git] / test / CodeGen / Thumb / segmented-stacks.ll
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
5
6
7 ; Just to prevent the alloca from being optimized away
8 declare void @dummy_use(i32*, i32)
9
10 define void @test_basic() #0 {
11         %mem = alloca i32, i32 10
12         call void @dummy_use (i32* %mem, i32 10)
13         ret void
14
15 ; Thumb-android:      test_basic:
16
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
35 ; Thumb-linux:      test_basic:
36
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
43
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
52
53 ; Thumb-linux:      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 ; Thumb-android:      test_nested:
63
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
70
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
79
80 ; Thumb-android:      pop     {r4, r5}
81
82 ; Thumb-linux:      test_nested:
83
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
90
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
99
100 ; Thumb-linux:      pop     {r4, r5}
101
102 }
103
104 define void @test_large() #0 {
105         %mem = alloca i32, i32 10000
106         call void @dummy_use (i32* %mem, i32 0)
107         ret void
108
109 ; Thumb-android:      test_large:
110
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
118
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
127
128 ; Thumb-android:      pop     {r4, r5}
129
130 ; Thumb-linux:      test_large:
131
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
139
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
148
149 ; Thumb-linux:      pop     {r4, r5}
150
151 }
152
153 define fastcc void @test_fastcc() #0 {
154         %mem = alloca i32, i32 10
155         call void @dummy_use (i32* %mem, i32 10)
156         ret void
157
158 ; Thumb-android:      test_fastcc:
159
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
166
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
175
176 ; Thumb-android:      pop     {r4, r5}
177
178 ; Thumb-linux:      test_fastcc:
179
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
186
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
195
196 ; Thumb-linux:      pop     {r4, r5}
197
198 }
199
200 define fastcc void @test_fastcc_large() #0 {
201         %mem = alloca i32, i32 10000
202         call void @dummy_use (i32* %mem, i32 0)
203         ret void
204
205 ; Thumb-android:      test_fastcc_large:
206
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
214
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
223
224 ; Thumb-android:      pop     {r4, r5}
225
226 ; Thumb-linux:      test_fastcc_large:
227
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
235
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
244
245 ; Thumb-linux:      pop     {r4, r5}
246
247 }
248
249 attributes #0 = { "split-stack" }