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