Support segmented stacks on 64-bit FreeBSD.
[oota-llvm.git] / test / CodeGen / X86 / segmented-stacks.ll
1 ; RUN: llc < %s -mtriple=i686-linux -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
2 ; RUN: llc < %s -mtriple=x86_64-linux  -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
3 ; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-Darwin
4 ; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
5 ; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
6 ; RUN: llc < %s -mtriple=x86_64-freebsd -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
7
8 ; We used to crash with filetype=obj
9 ; RUN: llc < %s -mtriple=i686-linux -segmented-stacks -filetype=obj
10 ; RUN: llc < %s -mtriple=x86_64-linux -segmented-stacks -filetype=obj
11 ; RUN: llc < %s -mtriple=i686-darwin -segmented-stacks -filetype=obj
12 ; RUN: llc < %s -mtriple=x86_64-darwin -segmented-stacks -filetype=obj
13 ; RUN: llc < %s -mtriple=i686-mingw32 -segmented-stacks -filetype=obj
14 ; RUN: llc < %s -mtriple=x86_64-freebsd -segmented-stacks -filetype=obj
15
16 ; Just to prevent the alloca from being optimized away
17 declare void @dummy_use(i32*, i32)
18
19 define void @test_basic() {
20         %mem = alloca i32, i32 10
21         call void @dummy_use (i32* %mem, i32 10)
22         ret void
23
24 ; X32-Linux:       test_basic:
25
26 ; X32-Linux:       cmpl %gs:48, %esp
27 ; X32-Linux-NEXT:  ja      .LBB0_2
28
29 ; X32-Linux:       pushl $0
30 ; X32-Linux-NEXT:  pushl $60
31 ; X32-Linux-NEXT:  calll __morestack
32 ; X32-Linux-NEXT:  ret
33
34 ; X64-Linux:       test_basic:
35
36 ; X64-Linux:       cmpq %fs:112, %rsp
37 ; X64-Linux-NEXT:  ja      .LBB0_2
38
39 ; X64-Linux:       movabsq $40, %r10
40 ; X64-Linux-NEXT:  movabsq $0, %r11
41 ; X64-Linux-NEXT:  callq __morestack
42 ; X64-Linux-NEXT:  ret
43
44 ; X32-Darwin:      test_basic:
45
46 ; X32-Darwin:      movl $432, %ecx
47 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
48 ; X32-Darwin-NEXT: ja      LBB0_2
49
50 ; X32-Darwin:      pushl $0
51 ; X32-Darwin-NEXT: pushl $60
52 ; X32-Darwin-NEXT: calll ___morestack
53 ; X32-Darwin-NEXT: ret
54
55 ; X64-Darwin:      test_basic:
56
57 ; X64-Darwin:      cmpq %gs:816, %rsp
58 ; X64-Darwin-NEXT: ja      LBB0_2
59
60 ; X64-Darwin:      movabsq $40, %r10
61 ; X64-Darwin-NEXT: movabsq $0, %r11
62 ; X64-Darwin-NEXT: callq ___morestack
63 ; X64-Darwin-NEXT: ret
64
65 ; X32-MinGW:       test_basic:
66
67 ; X32-MinGW:       cmpl %fs:20, %esp
68 ; X32-MinGW-NEXT:  ja      LBB0_2
69
70 ; X32-MinGW:       pushl $0
71 ; X32-MinGW-NEXT:  pushl $48
72 ; X32-MinGW-NEXT:  calll ___morestack
73 ; X32-MinGW-NEXT:  ret
74
75 ; X64-FreeBSD:       test_basic:
76
77 ; X64-FreeBSD:       cmpq %fs:24, %rsp
78 ; X64-FreeBSD-NEXT:  ja      .LBB0_2
79
80 ; X64-FreeBSD:       movabsq $40, %r10
81 ; X64-FreeBSD-NEXT:  movabsq $0, %r11
82 ; X64-FreeBSD-NEXT:  callq __morestack
83 ; X64-FreeBSD-NEXT:  ret
84
85 }
86
87 define i32 @test_nested(i32 * nest %closure, i32 %other) {
88        %addend = load i32 * %closure
89        %result = add i32 %other, %addend
90        ret i32 %result
91
92 ; X32-Linux:       cmpl %gs:48, %esp
93 ; X32-Linux-NEXT:  ja      .LBB1_2
94
95 ; X32-Linux:       pushl $4
96 ; X32-Linux-NEXT:  pushl $0
97 ; X32-Linux-NEXT:  calll __morestack
98 ; X32-Linux-NEXT:  ret
99
100 ; X64-Linux:       cmpq %fs:112, %rsp
101 ; X64-Linux-NEXT:  ja      .LBB1_2
102
103 ; X64-Linux:       movq %r10, %rax
104 ; X64-Linux-NEXT:  movabsq $0, %r10
105 ; X64-Linux-NEXT:  movabsq $0, %r11
106 ; X64-Linux-NEXT:  callq __morestack
107 ; X64-Linux-NEXT:  ret
108 ; X64-Linux-NEXT:  movq %rax, %r10
109
110 ; X32-Darwin:      movl $432, %edx
111 ; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
112 ; X32-Darwin-NEXT: ja      LBB1_2
113
114 ; X32-Darwin:      pushl $4
115 ; X32-Darwin-NEXT: pushl $0
116 ; X32-Darwin-NEXT: calll ___morestack
117 ; X32-Darwin-NEXT: ret
118
119 ; X64-Darwin:      cmpq %gs:816, %rsp
120 ; X64-Darwin-NEXT: ja      LBB1_2
121
122 ; X64-Darwin:      movq %r10, %rax
123 ; X64-Darwin-NEXT: movabsq $0, %r10
124 ; X64-Darwin-NEXT: movabsq $0, %r11
125 ; X64-Darwin-NEXT: callq ___morestack
126 ; X64-Darwin-NEXT: ret
127 ; X64-Darwin-NEXT: movq %rax, %r10
128
129 ; X32-MinGW:       cmpl %fs:20, %esp
130 ; X32-MinGW-NEXT:  ja      LBB1_2
131
132 ; X32-MinGW:       pushl $4
133 ; X32-MinGW-NEXT:  pushl $0
134 ; X32-MinGW-NEXT:  calll ___morestack
135 ; X32-MinGW-NEXT:  ret
136
137 ; X64-FreeBSD:       cmpq %fs:24, %rsp
138 ; X64-FreeBSD-NEXT:  ja      .LBB1_2
139
140 ; X64-FreeBSD:       movq %r10, %rax
141 ; X64-FreeBSD-NEXT:  movabsq $0, %r10
142 ; X64-FreeBSD-NEXT:  movabsq $0, %r11
143 ; X64-FreeBSD-NEXT:  callq __morestack
144 ; X64-FreeBSD-NEXT:  ret
145 ; X64-FreeBSD-NEXT:  movq %rax, %r10
146
147 }
148
149 define void @test_large() {
150         %mem = alloca i32, i32 10000
151         call void @dummy_use (i32* %mem, i32 0)
152         ret void
153
154 ; X32-Linux:       leal -40012(%esp), %ecx
155 ; X32-Linux-NEXT:  cmpl %gs:48, %ecx
156 ; X32-Linux-NEXT:  ja      .LBB2_2
157
158 ; X32-Linux:       pushl $0
159 ; X32-Linux-NEXT:  pushl $40012
160 ; X32-Linux-NEXT:  calll __morestack
161 ; X32-Linux-NEXT:  ret
162
163 ; X64-Linux:       leaq -40008(%rsp), %r11
164 ; X64-Linux-NEXT:  cmpq %fs:112, %r11
165 ; X64-Linux-NEXT:  ja      .LBB2_2
166
167 ; X64-Linux:       movabsq $40008, %r10
168 ; X64-Linux-NEXT:  movabsq $0, %r11
169 ; X64-Linux-NEXT:  callq __morestack
170 ; X64-Linux-NEXT:  ret
171
172 ; X32-Darwin:      leal -40012(%esp), %ecx
173 ; X32-Darwin-NEXT: movl $432, %eax
174 ; X32-Darwin-NEXT: cmpl %gs:(%eax), %ecx
175 ; X32-Darwin-NEXT: ja      LBB2_2
176
177 ; X32-Darwin:      pushl $0
178 ; X32-Darwin-NEXT: pushl $40012
179 ; X32-Darwin-NEXT: calll ___morestack
180 ; X32-Darwin-NEXT: ret
181
182 ; X64-Darwin:      leaq -40008(%rsp), %r11
183 ; X64-Darwin-NEXT: cmpq %gs:816, %r11
184 ; X64-Darwin-NEXT: ja      LBB2_2
185
186 ; X64-Darwin:      movabsq $40008, %r10
187 ; X64-Darwin-NEXT: movabsq $0, %r11
188 ; X64-Darwin-NEXT: callq ___morestack
189 ; X64-Darwin-NEXT: ret
190
191 ; X32-MinGW:       leal -40008(%esp), %ecx
192 ; X32-MinGW-NEXT:  cmpl %fs:20, %ecx
193 ; X32-MinGW-NEXT:  ja      LBB2_2
194
195 ; X32-MinGW:       pushl $0
196 ; X32-MinGW-NEXT:  pushl $40008
197 ; X32-MinGW-NEXT:  calll ___morestack
198 ; X32-MinGW-NEXT:  ret
199
200 ; X64-FreeBSD:       leaq -40008(%rsp), %r11
201 ; X64-FreeBSD-NEXT:  cmpq %fs:24, %r11
202 ; X64-FreeBSD-NEXT:  ja      .LBB2_2
203
204 ; X64-FreeBSD:       movabsq $40008, %r10
205 ; X64-FreeBSD-NEXT:  movabsq $0, %r11
206 ; X64-FreeBSD-NEXT:  callq __morestack
207 ; X64-FreeBSD-NEXT:  ret
208
209 }
210
211 define fastcc void @test_fastcc() {
212         %mem = alloca i32, i32 10
213         call void @dummy_use (i32* %mem, i32 10)
214         ret void
215
216 ; X32-Linux:       test_fastcc:
217
218 ; X32-Linux:       cmpl %gs:48, %esp
219 ; X32-Linux-NEXT:  ja      .LBB3_2
220
221 ; X32-Linux:       pushl $0
222 ; X32-Linux-NEXT:  pushl $60
223 ; X32-Linux-NEXT:  calll __morestack
224 ; X32-Linux-NEXT:  ret
225
226 ; X64-Linux:       test_fastcc:
227
228 ; X64-Linux:       cmpq %fs:112, %rsp
229 ; X64-Linux-NEXT:  ja      .LBB3_2
230
231 ; X64-Linux:       movabsq $40, %r10
232 ; X64-Linux-NEXT:  movabsq $0, %r11
233 ; X64-Linux-NEXT:  callq __morestack
234 ; X64-Linux-NEXT:  ret
235
236 ; X32-Darwin:      test_fastcc:
237
238 ; X32-Darwin:      movl $432, %eax
239 ; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
240 ; X32-Darwin-NEXT: ja      LBB3_2
241
242 ; X32-Darwin:      pushl $0
243 ; X32-Darwin-NEXT: pushl $60
244 ; X32-Darwin-NEXT: calll ___morestack
245 ; X32-Darwin-NEXT: ret
246
247 ; X64-Darwin:      test_fastcc:
248
249 ; X64-Darwin:      cmpq %gs:816, %rsp
250 ; X64-Darwin-NEXT: ja      LBB3_2
251
252 ; X64-Darwin:      movabsq $40, %r10
253 ; X64-Darwin-NEXT: movabsq $0, %r11
254 ; X64-Darwin-NEXT: callq ___morestack
255 ; X64-Darwin-NEXT: ret
256
257 ; X32-MinGW:       test_fastcc:
258
259 ; X32-MinGW:       cmpl %fs:20, %esp
260 ; X32-MinGW-NEXT:  ja      LBB3_2
261
262 ; X32-MinGW:       pushl $0
263 ; X32-MinGW-NEXT:  pushl $48
264 ; X32-MinGW-NEXT:  calll ___morestack
265 ; X32-MinGW-NEXT:  ret
266
267 ; X64-FreeBSD:       test_fastcc:
268
269 ; X64-FreeBSD:       cmpq %fs:24, %rsp
270 ; X64-FreeBSD-NEXT:  ja      .LBB3_2
271
272 ; X64-FreeBSD:       movabsq $40, %r10
273 ; X64-FreeBSD-NEXT:  movabsq $0, %r11
274 ; X64-FreeBSD-NEXT:  callq __morestack
275 ; X64-FreeBSD-NEXT:  ret
276
277 }
278
279 define fastcc void @test_fastcc_large() {
280         %mem = alloca i32, i32 10000
281         call void @dummy_use (i32* %mem, i32 0)
282         ret void
283
284 ; X32-Linux:       test_fastcc_large:
285
286 ; X32-Linux:       leal -40012(%esp), %eax
287 ; X32-Linux-NEXT:  cmpl %gs:48, %eax
288 ; X32-Linux-NEXT:  ja      .LBB4_2
289
290 ; X32-Linux:       pushl $0
291 ; X32-Linux-NEXT:  pushl $40012
292 ; X32-Linux-NEXT:  calll __morestack
293 ; X32-Linux-NEXT:  ret
294
295 ; X64-Linux:       test_fastcc_large:
296
297 ; X64-Linux:       leaq -40008(%rsp), %r11
298 ; X64-Linux-NEXT:  cmpq %fs:112, %r11
299 ; X64-Linux-NEXT:  ja      .LBB4_2
300
301 ; X64-Linux:       movabsq $40008, %r10
302 ; X64-Linux-NEXT:  movabsq $0, %r11
303 ; X64-Linux-NEXT:  callq __morestack
304 ; X64-Linux-NEXT:  ret
305
306 ; X32-Darwin:      test_fastcc_large:
307
308 ; X32-Darwin:      leal -40012(%esp), %eax
309 ; X32-Darwin-NEXT: movl $432, %ecx
310 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
311 ; X32-Darwin-NEXT: ja      LBB4_2
312
313 ; X32-Darwin:      pushl $0
314 ; X32-Darwin-NEXT: pushl $40012
315 ; X32-Darwin-NEXT: calll ___morestack
316 ; X32-Darwin-NEXT: ret
317
318 ; X64-Darwin:      test_fastcc_large:
319
320 ; X64-Darwin:      leaq -40008(%rsp), %r11
321 ; X64-Darwin-NEXT: cmpq %gs:816, %r11
322 ; X64-Darwin-NEXT: ja      LBB4_2
323
324 ; X64-Darwin:      movabsq $40008, %r10
325 ; X64-Darwin-NEXT: movabsq $0, %r11
326 ; X64-Darwin-NEXT: callq ___morestack
327 ; X64-Darwin-NEXT: ret
328
329 ; X32-MinGW:       test_fastcc_large:
330
331 ; X32-MinGW:       leal -40008(%esp), %eax
332 ; X32-MinGW-NEXT:  cmpl %fs:20, %eax
333 ; X32-MinGW-NEXT:  ja      LBB4_2
334
335 ; X32-MinGW:       pushl $0
336 ; X32-MinGW-NEXT:  pushl $40008
337 ; X32-MinGW-NEXT:  calll ___morestack
338 ; X32-MinGW-NEXT:  ret
339
340 ; X64-FreeBSD:       test_fastcc_large:
341
342 ; X64-FreeBSD:       leaq -40008(%rsp), %r11
343 ; X64-FreeBSD-NEXT:  cmpq %fs:24, %r11
344 ; X64-FreeBSD-NEXT:  ja      .LBB4_2
345
346 ; X64-FreeBSD:       movabsq $40008, %r10
347 ; X64-FreeBSD-NEXT:  movabsq $0, %r11
348 ; X64-FreeBSD-NEXT:  callq __morestack
349 ; X64-FreeBSD-NEXT:  ret
350
351 }
352
353 define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) {
354         %mem = alloca i32, i32 10000
355         call void @dummy_use (i32* %mem, i32 %a)
356         ret void
357
358 ; This is testing that the Mac implementation preserves ecx
359
360 ; X32-Darwin:      test_fastcc_large_with_ecx_arg:
361
362 ; X32-Darwin:      leal -40012(%esp), %eax
363 ; X32-Darwin-NEXT: pushl %ecx
364 ; X32-Darwin-NEXT: movl $432, %ecx
365 ; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
366 ; X32-Darwin-NEXT: popl %ecx
367 ; X32-Darwin-NEXT: ja      LBB5_2
368
369 ; X32-Darwin:      pushl $0
370 ; X32-Darwin-NEXT: pushl $40012
371 ; X32-Darwin-NEXT: calll ___morestack
372 ; X32-Darwin-NEXT: ret
373
374 }