1 ; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s
3 define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
5 ; CHECK: movl 48(%rbp), %eax
9 define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
11 ; CHECK: .seh_stackalloc 8
12 ; CHECK: movq %rsp, %rbp
13 ; CHECK: .seh_setframe 5, 0
14 ; CHECK: movq %rdx, 32(%rbp)
15 ; CHECK: leaq 32(%rbp), %rax
16 %ap = alloca i8, align 8
17 call void @llvm.va_start(i8* %ap)
21 define i8* @f3() "no-frame-pointer-elim"="true" {
23 ; CHECK: movq %rsp, %rbp
24 ; CHECK: .seh_setframe 5, 0
25 ; CHECK: movq 8(%rbp), %rax
26 %ra = call i8* @llvm.returnaddress(i32 0)
30 define i8* @f4() "no-frame-pointer-elim"="true" {
33 ; CHECK: .seh_pushreg 5
34 ; CHECK: subq $304, %rsp
35 ; CHECK: .seh_stackalloc 304
36 ; CHECK: leaq 128(%rsp), %rbp
37 ; CHECK: .seh_setframe 5, 128
38 ; CHECK: .seh_endprologue
39 ; CHECK: movq 184(%rbp), %rax
41 %ra = call i8* @llvm.returnaddress(i32 0)
45 declare void @external(i8*)
47 define void @f5() "no-frame-pointer-elim"="true" {
49 ; CHECK: subq $336, %rsp
50 ; CHECK: .seh_stackalloc 336
51 ; CHECK: leaq 128(%rsp), %rbp
52 ; CHECK: .seh_setframe 5, 128
53 ; CHECK: leaq -92(%rbp), %rcx
54 ; CHECK: callq external
55 %a = alloca [300 x i8]
56 %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
57 call void @external(i8* %gep)
61 define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
63 ; CHECK: subq $336, %rsp
64 ; CHECK: .seh_stackalloc 336
65 ; CHECK: leaq 128(%rsp), %rbp
66 ; CHECK: .seh_setframe 5, 128
67 ; CHECK: leaq -92(%rbp), %rcx
68 ; CHECK: callq external
69 %a = alloca [300 x i8]
70 %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
71 call void @external(i8* %gep)
75 define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
78 ; CHECK: .seh_pushreg 5
79 ; CHECK: subq $304, %rsp
80 ; CHECK: .seh_stackalloc 304
81 ; CHECK: leaq 128(%rsp), %rbp
82 ; CHECK: .seh_setframe 5, 128
83 ; CHECK: andq $-64, %rsp
84 ; CHECK: movl 224(%rbp), %eax
85 ; CHECK: leaq 176(%rbp), %rsp
86 alloca [300 x i8], align 64
90 define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
92 ; CHECK: subq $352, %rsp
93 ; CHECK: .seh_stackalloc 352
94 ; CHECK: leaq 128(%rsp), %rbp
95 ; CHECK: .seh_setframe 5, 128
97 %alloca = alloca [300 x i8], align 64
98 ; CHECK: andq $-64, %rsp
99 ; CHECK: movq %rsp, %rbx
102 ; CHECK: movl %ecx, %eax
103 ; CHECK: leaq 15(,%rax,4), %rax
104 ; CHECK: andq $-16, %rax
105 ; CHECK: callq __chkstk
106 ; CHECK: subq %rax, %rsp
108 %gep = getelementptr [300 x i8], [300 x i8]* %alloca, i32 0, i32 0
109 call void @external(i8* %gep)
110 ; CHECK: subq $32, %rsp
111 ; CHECK: leaq (%rbx), %rcx
112 ; CHECK: callq external
113 ; CHECK: addq $32, %rsp
116 ; CHECK: movl %esi, %eax
117 ; CHECK: leaq 224(%rbp), %rsp
120 declare i8* @llvm.returnaddress(i32) nounwind readnone
122 declare void @llvm.va_start(i8*) nounwind