• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
2; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux  -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
3; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -code-model=large -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux-Large
4; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -verify-machineinstrs | FileCheck %s -check-prefix=X32ABI
5; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X32-Darwin
6; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -verify-machineinstrs | FileCheck %s -check-prefix=X64-Darwin
7; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X32-MinGW
8; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -verify-machineinstrs | FileCheck %s -check-prefix=X64-FreeBSD
9; RUN: llc < %s -mcpu=generic -mtriple=i686-dragonfly -verify-machineinstrs | FileCheck %s -check-prefix=X32-DFlyBSD
10; RUN: llc < %s -mcpu=generic -mtriple=x86_64-dragonfly -verify-machineinstrs | FileCheck %s -check-prefix=X64-DFlyBSD
11; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -verify-machineinstrs | FileCheck %s -check-prefix=X64-MinGW
12
13; We used to crash with filetype=obj
14; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj -o /dev/null
15; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj -o /dev/null
16; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -filetype=obj -o /dev/null
17; RUN: llc < %s -mcpu=generic -mtriple=i686-darwin -filetype=obj -o /dev/null
18; RUN: llc < %s -mcpu=generic -mtriple=x86_64-darwin -filetype=obj -o /dev/null
19; RUN: llc < %s -mcpu=generic -mtriple=i686-mingw32 -filetype=obj -o /dev/null
20; RUN: llc < %s -mcpu=generic -mtriple=x86_64-freebsd -filetype=obj -o /dev/null
21; RUN: llc < %s -mcpu=generic -mtriple=i686-dragonfly -filetype=obj -o /dev/null
22; RUN: llc < %s -mcpu=generic -mtriple=x86_64-dragonfly -filetype=obj -o /dev/null
23; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 -filetype=obj -o /dev/null
24
25; RUN: not llc < %s -mcpu=generic -mtriple=x86_64-solaris 2> %t.log
26; RUN: FileCheck %s -input-file=%t.log -check-prefix=X64-Solaris
27; RUN: not llc < %s -mcpu=generic -mtriple=i686-freebsd 2> %t.log
28; RUN: FileCheck %s -input-file=%t.log -check-prefix=X32-FreeBSD
29
30; X64-Solaris: Segmented stacks not supported on this platform
31; X32-FreeBSD: Segmented stacks not supported on FreeBSD i386
32
33; Just to prevent the alloca from being optimized away
34declare void @dummy_use(i32*, i32)
35
36define void @test_basic() #0 {
37        %mem = alloca i32, i32 10
38        call void @dummy_use (i32* %mem, i32 10)
39	ret void
40
41; X32-Linux-LABEL:       test_basic:
42
43; X32-Linux:       cmpl %gs:48, %esp
44; X32-Linux-NEXT:  ja      .LBB0_2
45
46; X32-Linux:       pushl $0
47; X32-Linux-NEXT:  pushl $44
48; X32-Linux-NEXT:  calll __morestack
49; X32-Linux-NEXT:  ret
50
51; X64-Linux-LABEL:       test_basic:
52
53; X64-Linux:       cmpq %fs:112, %rsp
54; X64-Linux-NEXT:  ja      .LBB0_2
55
56; X64-Linux:       movabsq $40, %r10
57; X64-Linux-NEXT:  movabsq $0, %r11
58; X64-Linux-NEXT:  callq __morestack
59; X64-Linux-NEXT:  ret
60
61; X64-Linux-Large-LABEL:       test_basic:
62
63; X64-Linux-Large:       cmpq %fs:112, %rsp
64; X64-Linux-Large-NEXT:  ja      .LBB0_2
65
66; X64-Linux-Large:       movabsq $40, %r10
67; X64-Linux-Large-NEXT:  movabsq $0, %r11
68; X64-Linux-Large-NEXT:  callq *__morestack_addr(%rip)
69; X64-Linux-Large-NEXT:  ret
70
71; X32ABI-LABEL:       test_basic:
72
73; X32ABI:       cmpl %fs:64, %esp
74; X32ABI-NEXT:  ja      .LBB0_2
75
76; X32ABI:       movl $40, %r10d
77; X32ABI-NEXT:  movl $0, %r11d
78; X32ABI-NEXT:  callq __morestack
79; X32ABI-NEXT:  ret
80
81; X32-Darwin-LABEL:      test_basic:
82
83; X32-Darwin:      movl $432, %ecx
84; X32-Darwin-NEXT: cmpl %gs:(%ecx), %esp
85; X32-Darwin-NEXT: ja      LBB0_2
86
87; X32-Darwin:      pushl $0
88; X32-Darwin-NEXT: pushl $60
89; X32-Darwin-NEXT: calll ___morestack
90; X32-Darwin-NEXT: ret
91
92; X64-Darwin-LABEL:      test_basic:
93
94; X64-Darwin:      cmpq %gs:816, %rsp
95; X64-Darwin-NEXT: ja      LBB0_2
96
97; X64-Darwin:      movabsq $40, %r10
98; X64-Darwin-NEXT: movabsq $0, %r11
99; X64-Darwin-NEXT: callq ___morestack
100; X64-Darwin-NEXT: ret
101
102; X32-MinGW-LABEL:       test_basic:
103
104; X32-MinGW:       cmpl %fs:20, %esp
105; X32-MinGW-NEXT:  ja      LBB0_2
106
107; X32-MinGW:       pushl $0
108; X32-MinGW-NEXT:  pushl $40
109; X32-MinGW-NEXT:  calll ___morestack
110; X32-MinGW-NEXT:  ret
111
112; X64-MinGW-LABEL:       test_basic:
113
114; X64-MinGW:       cmpq %gs:40, %rsp
115; X64-MinGW-NEXT:  ja      .LBB0_2
116
117; X64-MinGW:       movabsq $72, %r10
118; X64-MinGW-NEXT:  movabsq $32, %r11
119; X64-MinGW-NEXT:  callq __morestack
120; X64-MinGW-NEXT:  retq
121
122; X64-FreeBSD-LABEL:       test_basic:
123
124; X64-FreeBSD:       cmpq %fs:24, %rsp
125; X64-FreeBSD-NEXT:  ja      .LBB0_2
126
127; X64-FreeBSD:       movabsq $40, %r10
128; X64-FreeBSD-NEXT:  movabsq $0, %r11
129; X64-FreeBSD-NEXT:  callq __morestack
130; X64-FreeBSD-NEXT:  ret
131
132; X32-DFlyBSD-LABEL:       test_basic:
133
134; X32-DFlyBSD:       cmpl %fs:16, %esp
135; X32-DFlyBSD-NEXT:  ja      .LBB0_2
136
137; X32-DFlyBSD:       pushl $0
138; X32-DFlyBSD-NEXT:  pushl $40
139; X32-DFlyBSD-NEXT:  calll __morestack
140; X32-DFlyBSD-NEXT:  ret
141
142; X64-DFlyBSD-LABEL:       test_basic:
143
144; X64-DFlyBSD:       cmpq %fs:32, %rsp
145; X64-DFlyBSD-NEXT:  ja      .LBB0_2
146
147; X64-DFlyBSD:       movabsq $40, %r10
148; X64-DFlyBSD-NEXT:  movabsq $0, %r11
149; X64-DFlyBSD-NEXT:  callq __morestack
150; X64-DFlyBSD-NEXT:  ret
151
152}
153
154define i32 @test_nested(i32 * nest %closure, i32 %other) #0 {
155       %addend = load i32 , i32 * %closure
156       %result = add i32 %other, %addend
157       %mem = alloca i32, i32 10
158       call void @dummy_use (i32* %mem, i32 10)
159       ret i32 %result
160
161; X32-Linux:       cmpl %gs:48, %esp
162; X32-Linux-NEXT:  ja      .LBB1_2
163
164; X32-Linux:       pushl $4
165; X32-Linux-NEXT:  pushl $44
166; X32-Linux-NEXT:  calll __morestack
167; X32-Linux-NEXT:  ret
168
169; X64-Linux:       cmpq %fs:112, %rsp
170; X64-Linux-NEXT:  ja      .LBB1_2
171
172; X64-Linux:       movq %r10, %rax
173; X64-Linux-NEXT:  movabsq $56, %r10
174; X64-Linux-NEXT:  movabsq $0, %r11
175; X64-Linux-NEXT:  callq __morestack
176; X64-Linux-NEXT:  ret
177; X64-Linux-NEXT:  movq %rax, %r10
178
179; X32ABI:       cmpl %fs:64, %esp
180; X32ABI-NEXT:  ja      .LBB1_2
181
182; X32ABI:       movl %r10d, %eax
183; X32ABI-NEXT:  movl $56, %r10d
184; X32ABI-NEXT:  movl $0, %r11d
185; X32ABI-NEXT:  callq __morestack
186; X32ABI-NEXT:  ret
187; X32ABI-NEXT:  movq %rax, %r10
188
189; X32-Darwin:      movl $432, %edx
190; X32-Darwin-NEXT: cmpl %gs:(%edx), %esp
191; X32-Darwin-NEXT: ja      LBB1_2
192
193; X32-Darwin:      pushl $4
194; X32-Darwin-NEXT: pushl $60
195; X32-Darwin-NEXT: calll ___morestack
196; X32-Darwin-NEXT: ret
197
198; X64-Darwin:      cmpq %gs:816, %rsp
199; X64-Darwin-NEXT: ja      LBB1_2
200
201; X64-Darwin:      movq %r10, %rax
202; X64-Darwin-NEXT: movabsq $56, %r10
203; X64-Darwin-NEXT: movabsq $0, %r11
204; X64-Darwin-NEXT: callq ___morestack
205; X64-Darwin-NEXT: ret
206; X64-Darwin-NEXT: movq %rax, %r10
207
208; X32-MinGW:       cmpl %fs:20, %esp
209; X32-MinGW-NEXT:  ja      LBB1_2
210
211; X32-MinGW:       pushl $4
212; X32-MinGW-NEXT:  pushl $44
213; X32-MinGW-NEXT:  calll ___morestack
214; X32-MinGW-NEXT:  ret
215
216; X64-MinGW-LABEL: test_nested:
217; X64-MinGW:       cmpq %gs:40, %rsp
218; X64-MinGW-NEXT:  ja      .LBB1_2
219
220; X64-MinGW:       movq %r10, %rax
221; X64-MinGW-NEXT:  movabsq $88, %r10
222; X64-MinGW-NEXT:  movabsq $32, %r11
223; X64-MinGW-NEXT:  callq __morestack
224; X64-MinGW-NEXT:  retq
225; X64-MinGW-NEXT:  movq %rax, %r10
226
227; X64-FreeBSD:       cmpq %fs:24, %rsp
228; X64-FreeBSD-NEXT:  ja      .LBB1_2
229
230; X64-FreeBSD:       movq %r10, %rax
231; X64-FreeBSD-NEXT:  movabsq $56, %r10
232; X64-FreeBSD-NEXT:  movabsq $0, %r11
233; X64-FreeBSD-NEXT:  callq __morestack
234; X64-FreeBSD-NEXT:  ret
235; X64-FreeBSD-NEXT:  movq %rax, %r10
236
237; X32-DFlyBSD:       cmpl %fs:16, %esp
238; X32-DFlyBSD-NEXT:  ja      .LBB1_2
239
240; X32-DFlyBSD:       pushl $4
241; X32-DFlyBSD-NEXT:  pushl $44
242; X32-DFlyBSD-NEXT:  calll __morestack
243; X32-DFlyBSD-NEXT:  ret
244
245; X64-DFlyBSD:       cmpq %fs:32, %rsp
246; X64-DFlyBSD-NEXT:  ja      .LBB1_2
247
248; X64-DFlyBSD:       movq %r10, %rax
249; X64-DFlyBSD-NEXT:  movabsq $56, %r10
250; X64-DFlyBSD-NEXT:  movabsq $0, %r11
251; X64-DFlyBSD-NEXT:  callq __morestack
252; X64-DFlyBSD-NEXT:  ret
253; X64-DFlyBSD-NEXT:  movq %rax, %r10
254
255}
256
257define void @test_large() #0 {
258        %mem = alloca i32, i32 10000
259        call void @dummy_use (i32* %mem, i32 0)
260        ret void
261
262; X32-Linux:       leal -40012(%esp), %ecx
263; X32-Linux-NEXT:  cmpl %gs:48, %ecx
264; X32-Linux-NEXT:  ja      .LBB2_2
265
266; X32-Linux:       pushl $0
267; X32-Linux-NEXT:  pushl $40012
268; X32-Linux-NEXT:  calll __morestack
269; X32-Linux-NEXT:  ret
270
271; X64-Linux:       leaq -40008(%rsp), %r11
272; X64-Linux-NEXT:  cmpq %fs:112, %r11
273; X64-Linux-NEXT:  ja      .LBB2_2
274
275; X64-Linux:       movabsq $40008, %r10
276; X64-Linux-NEXT:  movabsq $0, %r11
277; X64-Linux-NEXT:  callq __morestack
278; X64-Linux-NEXT:  ret
279
280; X32ABI:       leal -40008(%rsp), %r11d
281; X32ABI-NEXT:  cmpl %fs:64, %r11d
282; X32ABI-NEXT:  ja      .LBB2_2
283
284; X32ABI:       movl $40008, %r10d
285; X32ABI-NEXT:  movl $0, %r11d
286; X32ABI-NEXT:  callq __morestack
287; X32ABI-NEXT:  ret
288
289; X32-Darwin:      leal -40012(%esp), %ecx
290; X32-Darwin-NEXT: movl $432, %eax
291; X32-Darwin-NEXT: cmpl %gs:(%eax), %ecx
292; X32-Darwin-NEXT: ja      LBB2_2
293
294; X32-Darwin:      pushl $0
295; X32-Darwin-NEXT: pushl $40012
296; X32-Darwin-NEXT: calll ___morestack
297; X32-Darwin-NEXT: ret
298
299; X64-Darwin:      leaq -40008(%rsp), %r11
300; X64-Darwin-NEXT: cmpq %gs:816, %r11
301; X64-Darwin-NEXT: ja      LBB2_2
302
303; X64-Darwin:      movabsq $40008, %r10
304; X64-Darwin-NEXT: movabsq $0, %r11
305; X64-Darwin-NEXT: callq ___morestack
306; X64-Darwin-NEXT: ret
307
308; X32-MinGW:       leal -40000(%esp), %ecx
309; X32-MinGW-NEXT:  cmpl %fs:20, %ecx
310; X32-MinGW-NEXT:  ja      LBB2_2
311
312; X32-MinGW:       pushl $0
313; X32-MinGW-NEXT:  pushl $40000
314; X32-MinGW-NEXT:  calll ___morestack
315; X32-MinGW-NEXT:  ret
316
317; X64-MinGW-LABEL: test_large:
318; X64-MinGW:       leaq -40040(%rsp), %r11
319; X64-MinGW-NEXT:  cmpq %gs:40, %r11
320; X64-MinGW-NEXT:  ja      .LBB2_2
321
322; X64-MinGW:       movabsq $40040, %r10
323; X64-MinGW-NEXT:  movabsq $32, %r11
324; X64-MinGW-NEXT:  callq __morestack
325; X64-MinGW-NEXT:  retq
326
327; X64-FreeBSD:       leaq -40008(%rsp), %r11
328; X64-FreeBSD-NEXT:  cmpq %fs:24, %r11
329; X64-FreeBSD-NEXT:  ja      .LBB2_2
330
331; X64-FreeBSD:       movabsq $40008, %r10
332; X64-FreeBSD-NEXT:  movabsq $0, %r11
333; X64-FreeBSD-NEXT:  callq __morestack
334; X64-FreeBSD-NEXT:  ret
335
336; X32-DFlyBSD:       leal -40000(%esp), %ecx
337; X32-DFlyBSD-NEXT:  cmpl %fs:16, %ecx
338; X32-DFlyBSD-NEXT:  ja      .LBB2_2
339
340; X32-DFlyBSD:       pushl $0
341; X32-DFlyBSD-NEXT:  pushl $40000
342; X32-DFlyBSD-NEXT:  calll __morestack
343; X32-DFlyBSD-NEXT:  ret
344
345; X64-DFlyBSD:       leaq -40008(%rsp), %r11
346; X64-DFlyBSD-NEXT:  cmpq %fs:32, %r11
347; X64-DFlyBSD-NEXT:  ja      .LBB2_2
348
349; X64-DFlyBSD:       movabsq $40008, %r10
350; X64-DFlyBSD-NEXT:  movabsq $0, %r11
351; X64-DFlyBSD-NEXT:  callq __morestack
352; X64-DFlyBSD-NEXT:  ret
353
354}
355
356define fastcc void @test_fastcc() #0 {
357        %mem = alloca i32, i32 10
358        call void @dummy_use (i32* %mem, i32 10)
359        ret void
360
361; X32-Linux-LABEL:       test_fastcc:
362
363; X32-Linux:       cmpl %gs:48, %esp
364; X32-Linux-NEXT:  ja      .LBB3_2
365
366; X32-Linux:       pushl $0
367; X32-Linux-NEXT:  pushl $44
368; X32-Linux-NEXT:  calll __morestack
369; X32-Linux-NEXT:  ret
370
371; X64-Linux-LABEL:       test_fastcc:
372
373; X64-Linux:       cmpq %fs:112, %rsp
374; X64-Linux-NEXT:  ja      .LBB3_2
375
376; X64-Linux:       movabsq $40, %r10
377; X64-Linux-NEXT:  movabsq $0, %r11
378; X64-Linux-NEXT:  callq __morestack
379; X64-Linux-NEXT:  ret
380
381; X32ABI-LABEL:       test_fastcc:
382
383; X32ABI:       cmpl %fs:64, %esp
384; X32ABI-NEXT:  ja      .LBB3_2
385
386; X32ABI:       movl $40, %r10d
387; X32ABI-NEXT:  movl $0, %r11d
388; X32ABI-NEXT:  callq __morestack
389; X32ABI-NEXT:  ret
390
391; X32-Darwin-LABEL:      test_fastcc:
392
393; X32-Darwin:      movl $432, %eax
394; X32-Darwin-NEXT: cmpl %gs:(%eax), %esp
395; X32-Darwin-NEXT: ja      LBB3_2
396
397; X32-Darwin:      pushl $0
398; X32-Darwin-NEXT: pushl $60
399; X32-Darwin-NEXT: calll ___morestack
400; X32-Darwin-NEXT: ret
401
402; X64-Darwin-LABEL:      test_fastcc:
403
404; X64-Darwin:      cmpq %gs:816, %rsp
405; X64-Darwin-NEXT: ja      LBB3_2
406
407; X64-Darwin:      movabsq $40, %r10
408; X64-Darwin-NEXT: movabsq $0, %r11
409; X64-Darwin-NEXT: callq ___morestack
410; X64-Darwin-NEXT: ret
411
412; X32-MinGW-LABEL:       test_fastcc:
413
414; X32-MinGW:       cmpl %fs:20, %esp
415; X32-MinGW-NEXT:  ja      LBB3_2
416
417; X32-MinGW:       pushl $0
418; X32-MinGW-NEXT:  pushl $40
419; X32-MinGW-NEXT:  calll ___morestack
420; X32-MinGW-NEXT:  ret
421
422; X64-MinGW-LABEL:       test_fastcc:
423
424; X64-MinGW:       cmpq %gs:40, %rsp
425; X64-MinGW-NEXT:  ja      .LBB3_2
426
427; X64-MinGW:       movabsq $72, %r10
428; X64-MinGW-NEXT:  movabsq $32, %r11
429; X64-MinGW-NEXT:  callq __morestack
430; X64-MinGW-NEXT:  retq
431
432; X64-FreeBSD-LABEL:       test_fastcc:
433
434; X64-FreeBSD:       cmpq %fs:24, %rsp
435; X64-FreeBSD-NEXT:  ja      .LBB3_2
436
437; X64-FreeBSD:       movabsq $40, %r10
438; X64-FreeBSD-NEXT:  movabsq $0, %r11
439; X64-FreeBSD-NEXT:  callq __morestack
440; X64-FreeBSD-NEXT:  ret
441
442; X32-DFlyBSD-LABEL:       test_fastcc:
443
444; X32-DFlyBSD:       cmpl %fs:16, %esp
445; X32-DFlyBSD-NEXT:  ja      .LBB3_2
446
447; X32-DFlyBSD:       pushl $0
448; X32-DFlyBSD-NEXT:  pushl $40
449; X32-DFlyBSD-NEXT:  calll __morestack
450; X32-DFlyBSD-NEXT:  ret
451
452; X64-DFlyBSD-LABEL:       test_fastcc:
453
454; X64-DFlyBSD:       cmpq %fs:32, %rsp
455; X64-DFlyBSD-NEXT:  ja      .LBB3_2
456
457; X64-DFlyBSD:       movabsq $40, %r10
458; X64-DFlyBSD-NEXT:  movabsq $0, %r11
459; X64-DFlyBSD-NEXT:  callq __morestack
460; X64-DFlyBSD-NEXT:  ret
461
462}
463
464define fastcc void @test_fastcc_large() #0 {
465        %mem = alloca i32, i32 10000
466        call void @dummy_use (i32* %mem, i32 0)
467        ret void
468
469; X32-Linux-LABEL:       test_fastcc_large:
470
471; X32-Linux:       leal -40012(%esp), %eax
472; X32-Linux-NEXT:  cmpl %gs:48, %eax
473; X32-Linux-NEXT:  ja      .LBB4_2
474
475; X32-Linux:       pushl $0
476; X32-Linux-NEXT:  pushl $40012
477; X32-Linux-NEXT:  calll __morestack
478; X32-Linux-NEXT:  ret
479
480; X64-Linux-LABEL:       test_fastcc_large:
481
482; X64-Linux:       leaq -40008(%rsp), %r11
483; X64-Linux-NEXT:  cmpq %fs:112, %r11
484; X64-Linux-NEXT:  ja      .LBB4_2
485
486; X64-Linux:       movabsq $40008, %r10
487; X64-Linux-NEXT:  movabsq $0, %r11
488; X64-Linux-NEXT:  callq __morestack
489; X64-Linux-NEXT:  ret
490
491; X32ABI-LABEL:       test_fastcc_large:
492
493; X32ABI:       leal -40008(%rsp), %r11d
494; X32ABI-NEXT:  cmpl %fs:64, %r11d
495; X32ABI-NEXT:  ja      .LBB4_2
496
497; X32ABI:       movl $40008, %r10d
498; X32ABI-NEXT:  movl $0, %r11d
499; X32ABI-NEXT:  callq __morestack
500; X32ABI-NEXT:  ret
501
502; X32-Darwin-LABEL:      test_fastcc_large:
503
504; X32-Darwin:      leal -40012(%esp), %eax
505; X32-Darwin-NEXT: movl $432, %ecx
506; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
507; X32-Darwin-NEXT: ja      LBB4_2
508
509; X32-Darwin:      pushl $0
510; X32-Darwin-NEXT: pushl $40012
511; X32-Darwin-NEXT: calll ___morestack
512; X32-Darwin-NEXT: ret
513
514; X64-Darwin-LABEL:      test_fastcc_large:
515
516; X64-Darwin:      leaq -40008(%rsp), %r11
517; X64-Darwin-NEXT: cmpq %gs:816, %r11
518; X64-Darwin-NEXT: ja      LBB4_2
519
520; X64-Darwin:      movabsq $40008, %r10
521; X64-Darwin-NEXT: movabsq $0, %r11
522; X64-Darwin-NEXT: callq ___morestack
523; X64-Darwin-NEXT: ret
524
525; X32-MinGW-LABEL:       test_fastcc_large:
526
527; X32-MinGW:       leal -40000(%esp), %eax
528; X32-MinGW-NEXT:  cmpl %fs:20, %eax
529; X32-MinGW-NEXT:  ja      LBB4_2
530
531; X32-MinGW:       pushl $0
532; X32-MinGW-NEXT:  pushl $40000
533; X32-MinGW-NEXT:  calll ___morestack
534; X32-MinGW-NEXT:  ret
535
536; X64-MinGW-LABEL:       test_fastcc_large:
537
538; X64-MinGW:       leaq -40040(%rsp), %r11
539; X64-MinGW-NEXT:  cmpq %gs:40, %r11
540; X64-MinGW-NEXT:  ja      .LBB4_2
541
542; X64-MinGW:       movabsq $40040, %r10
543; X64-MinGW-NEXT:  movabsq $32, %r11
544; X64-MinGW-NEXT:  callq __morestack
545; X64-MinGW-NEXT:  retq
546
547; X64-FreeBSD-LABEL:       test_fastcc_large:
548
549; X64-FreeBSD:       leaq -40008(%rsp), %r11
550; X64-FreeBSD-NEXT:  cmpq %fs:24, %r11
551; X64-FreeBSD-NEXT:  ja      .LBB4_2
552
553; X64-FreeBSD:       movabsq $40008, %r10
554; X64-FreeBSD-NEXT:  movabsq $0, %r11
555; X64-FreeBSD-NEXT:  callq __morestack
556; X64-FreeBSD-NEXT:  ret
557
558; X32-DFlyBSD-LABEL:       test_fastcc_large:
559
560; X32-DFlyBSD:       leal -40000(%esp), %eax
561; X32-DFlyBSD-NEXT:  cmpl %fs:16, %eax
562; X32-DFlyBSD-NEXT:  ja      .LBB4_2
563
564; X32-DFlyBSD:       pushl $0
565; X32-DFlyBSD-NEXT:  pushl $40000
566; X32-DFlyBSD-NEXT:  calll __morestack
567; X32-DFlyBSD-NEXT:  ret
568
569; X64-DFlyBSD-LABEL:       test_fastcc_large:
570
571; X64-DFlyBSD:       leaq -40008(%rsp), %r11
572; X64-DFlyBSD-NEXT:  cmpq %fs:32, %r11
573; X64-DFlyBSD-NEXT:  ja      .LBB4_2
574
575; X64-DFlyBSD:       movabsq $40008, %r10
576; X64-DFlyBSD-NEXT:  movabsq $0, %r11
577; X64-DFlyBSD-NEXT:  callq __morestack
578; X64-DFlyBSD-NEXT:  ret
579
580}
581
582define fastcc void @test_fastcc_large_with_ecx_arg(i32 %a) #0 {
583        %mem = alloca i32, i32 10000
584        call void @dummy_use (i32* %mem, i32 %a)
585        ret void
586
587; This is testing that the Mac implementation preserves ecx
588
589; X32-Darwin-LABEL:      test_fastcc_large_with_ecx_arg:
590
591; X32-Darwin:      leal -40012(%esp), %eax
592; X32-Darwin-NEXT: pushl %ecx
593; X32-Darwin-NEXT: movl $432, %ecx
594; X32-Darwin-NEXT: cmpl %gs:(%ecx), %eax
595; X32-Darwin-NEXT: popl %ecx
596; X32-Darwin-NEXT: ja      LBB5_2
597
598; X32-Darwin:      pushl $0
599; X32-Darwin-NEXT: pushl $40012
600; X32-Darwin-NEXT: calll ___morestack
601; X32-Darwin-NEXT: ret
602
603}
604
605define void @test_nostack() #0 {
606	ret void
607
608; X32-Linux-LABEL: test_nostack:
609; X32-Linux-NOT:   calll __morestack
610
611; X64-Linux-LABEL: test_nostack:
612; X32-Linux-NOT:   callq __morestack
613
614; X32ABI-LABEL: test_nostack:
615; X32ABI-NOT:   callq __morestack
616
617; X32-Darwin-LABEL: test_nostack:
618; X32-Darwin-NOT:   calll __morestack
619
620; X64-Darwin-LABEL: test_nostack:
621; X64-Darwin-NOT:   callq __morestack
622
623; X32-MinGW-LABEL: test_nostack:
624; X32-MinGW-NOT:   calll __morestack
625
626; X64-MinGW-LABEL: test_nostack:
627; X64-MinGW-NOT:   callq __morestack
628
629; X64-FreeBSD-LABEL: test_nostack:
630; X64-FreeBSD-NOT:   callq __morestack
631
632; X32-DFlyBSD-LABEL: test_nostack:
633; X32-DFlyBSD-NOT:   calll __morestack
634
635; X64-DFlyBSD-LABEL: test_nostack:
636; X64-DFlyBSD-NOT:   callq __morestack
637}
638
639attributes #0 = { "split-stack" }
640
641; X64-Linux-Large: .rodata
642; X64-Linux-Large-NEXT: __morestack_addr:
643; X64-Linux-Large-NEXT: .quad	__morestack
644