[ARM] Do not use vtrn for vectorshuffle if the order is reversed
[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 , i32 * %closure
59        %result = add i32 %other, %addend
60        %mem = alloca i32, i32 10
61        call void @dummy_use (i32* %mem, i32 10)
62        ret i32 %result
63
64 ; ARM-linux:      test_nested:
65
66 ; ARM-linux:      push    {r4, r5}
67 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
68 ; ARM-linux-NEXT: mov     r5, sp
69 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
70 ; ARM-linux-NEXT: cmp     r4, r5
71 ; ARM-linux-NEXT: blo     .LBB1_2
72
73 ; ARM-linux:      mov     r4, #56
74 ; ARM-linux-NEXT: mov     r5, #0
75 ; ARM-linux-NEXT: stmdb   sp!, {lr}
76 ; ARM-linux-NEXT: bl      __morestack
77 ; ARM-linux-NEXT: ldm     sp!, {lr}
78 ; ARM-linux-NEXT: pop     {r4, r5}
79 ; ARM-linux-NEXT: bx      lr
80
81 ; ARM-linux:      pop     {r4, r5}
82
83 ; ARM-android:      test_nested:
84
85 ; ARM-android:      push    {r4, r5}
86 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
87 ; ARM-android-NEXT: mov     r5, sp
88 ; ARM-android-NEXT: ldr     r4, [r4, #252]
89 ; ARM-android-NEXT: cmp     r4, r5
90 ; ARM-android-NEXT: blo     .LBB1_2
91
92 ; ARM-android:      mov     r4, #56
93 ; ARM-android-NEXT: mov     r5, #0
94 ; ARM-android-NEXT: stmdb   sp!, {lr}
95 ; ARM-android-NEXT: bl      __morestack
96 ; ARM-android-NEXT: ldm     sp!, {lr}
97 ; ARM-android-NEXT: pop     {r4, r5}
98 ; ARM-android-NEXT: bx      lr
99
100 ; ARM-android:      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 ; ARM-linux:      test_large:
110
111 ; ARM-linux:      push    {r4, r5}
112 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
113 ; ARM-linux-NEXT: sub     r5, sp, #40192
114 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
115 ; ARM-linux-NEXT: cmp     r4, r5
116 ; ARM-linux-NEXT: blo     .LBB2_2
117
118 ; ARM-linux:      mov     r4, #40192
119 ; ARM-linux-NEXT: mov     r5, #0
120 ; ARM-linux-NEXT: stmdb   sp!, {lr}
121 ; ARM-linux-NEXT: bl      __morestack
122 ; ARM-linux-NEXT: ldm     sp!, {lr}
123 ; ARM-linux-NEXT: pop     {r4, r5}
124 ; ARM-linux-NEXT: bx      lr
125
126 ; ARM-linux:      pop     {r4, r5}
127
128 ; ARM-android:      test_large:
129
130 ; ARM-android:      push    {r4, r5}
131 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
132 ; ARM-android-NEXT: sub     r5, sp, #40192
133 ; ARM-android-NEXT: ldr     r4, [r4, #252]
134 ; ARM-android-NEXT: cmp     r4, r5
135 ; ARM-android-NEXT: blo     .LBB2_2
136
137 ; ARM-android:      mov     r4, #40192
138 ; ARM-android-NEXT: mov     r5, #0
139 ; ARM-android-NEXT: stmdb   sp!, {lr}
140 ; ARM-android-NEXT: bl      __morestack
141 ; ARM-android-NEXT: ldm     sp!, {lr}
142 ; ARM-android-NEXT: pop     {r4, r5}
143 ; ARM-android-NEXT: bx      lr
144
145 ; ARM-android:      pop     {r4, r5}
146
147 }
148
149 define fastcc void @test_fastcc() #0 {
150         %mem = alloca i32, i32 10
151         call void @dummy_use (i32* %mem, i32 10)
152         ret void
153
154 ; ARM-linux:      test_fastcc:
155
156 ; ARM-linux:      push    {r4, r5}
157 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
158 ; ARM-linux-NEXT: mov     r5, sp
159 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
160 ; ARM-linux-NEXT: cmp     r4, r5
161 ; ARM-linux-NEXT: blo     .LBB3_2
162
163 ; ARM-linux:      mov     r4, #48
164 ; ARM-linux-NEXT: mov     r5, #0
165 ; ARM-linux-NEXT: stmdb   sp!, {lr}
166 ; ARM-linux-NEXT: bl      __morestack
167 ; ARM-linux-NEXT: ldm     sp!, {lr}
168 ; ARM-linux-NEXT: pop     {r4, r5}
169 ; ARM-linux-NEXT: bx      lr
170
171 ; ARM-linux:      pop     {r4, r5}
172
173 ; ARM-android:      test_fastcc:
174
175 ; ARM-android:      push    {r4, r5}
176 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
177 ; ARM-android-NEXT: mov     r5, sp
178 ; ARM-android-NEXT: ldr     r4, [r4, #252]
179 ; ARM-android-NEXT: cmp     r4, r5
180 ; ARM-android-NEXT: blo     .LBB3_2
181
182 ; ARM-android:      mov     r4, #48
183 ; ARM-android-NEXT: mov     r5, #0
184 ; ARM-android-NEXT: stmdb   sp!, {lr}
185 ; ARM-android-NEXT: bl      __morestack
186 ; ARM-android-NEXT: ldm     sp!, {lr}
187 ; ARM-android-NEXT: pop     {r4, r5}
188 ; ARM-android-NEXT: bx      lr
189
190 ; ARM-android:      pop     {r4, r5}
191
192 }
193
194 define fastcc void @test_fastcc_large() #0 {
195         %mem = alloca i32, i32 10000
196         call void @dummy_use (i32* %mem, i32 0)
197         ret void
198
199 ; ARM-linux:      test_fastcc_large:
200
201 ; ARM-linux:      push    {r4, r5}
202 ; ARM-linux-NEXT: mrc     p15, #0, r4, c13, c0, #3
203 ; ARM-linux-NEXT: sub     r5, sp, #40192
204 ; ARM-linux-NEXT: ldr     r4, [r4, #4]
205 ; ARM-linux-NEXT: cmp     r4, r5
206 ; ARM-linux-NEXT: blo     .LBB4_2
207
208 ; ARM-linux:      mov     r4, #40192
209 ; ARM-linux-NEXT: mov     r5, #0
210 ; ARM-linux-NEXT: stmdb   sp!, {lr}
211 ; ARM-linux-NEXT: bl      __morestack
212 ; ARM-linux-NEXT: ldm     sp!, {lr}
213 ; ARM-linux-NEXT: pop     {r4, r5}
214 ; ARM-linux-NEXT: bx      lr
215
216 ; ARM-linux:      pop     {r4, r5}
217
218 ; ARM-android:      test_fastcc_large:
219
220 ; ARM-android:      push    {r4, r5}
221 ; ARM-android-NEXT: mrc     p15, #0, r4, c13, c0, #3
222 ; ARM-android-NEXT: sub     r5, sp, #40192
223 ; ARM-android-NEXT: ldr     r4, [r4, #252]
224 ; ARM-android-NEXT: cmp     r4, r5
225 ; ARM-android-NEXT: blo     .LBB4_2
226
227 ; ARM-android:      mov     r4, #40192
228 ; ARM-android-NEXT: mov     r5, #0
229 ; ARM-android-NEXT: stmdb   sp!, {lr}
230 ; ARM-android-NEXT: bl      __morestack
231 ; ARM-android-NEXT: ldm     sp!, {lr}
232 ; ARM-android-NEXT: pop     {r4, r5}
233 ; ARM-android-NEXT: bx      lr
234
235 ; ARM-android:      pop     {r4, r5}
236
237 }
238
239 define void @test_nostack() #0 {
240         ret void
241
242 ; ARM-linux-LABEL: test_nostack:
243 ; ARM-linux-NOT:   bl __morestack
244
245 ; ARM-android-LABEL: test_nostack:
246 ; ARM-android-NOT:   bl __morestack
247 }
248
249 attributes #0 = { "split-stack" }