Add a triple to switch.ll test.
[oota-llvm.git] / test / CodeGen / X86 / win64_frame.ll
1 ; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s
2
3 define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
4   ; CHECK-LABEL: f1:
5   ; CHECK:       movl    48(%rbp), %eax
6   ret i32 %p5
7 }
8
9 define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
10   ; CHECK-LABEL: f2:
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)
18   ret void
19 }
20
21 define i8* @f3() "no-frame-pointer-elim"="true" {
22   ; CHECK-LABEL: f3:
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)
27   ret i8* %ra
28 }
29
30 define i8* @f4() "no-frame-pointer-elim"="true" {
31   ; CHECK-LABEL: f4:
32   ; CHECK:      pushq   %rbp
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
40   alloca [300 x i8]
41   %ra = call i8* @llvm.returnaddress(i32 0)
42   ret i8* %ra
43 }
44
45 declare void @external(i8*)
46
47 define void @f5() "no-frame-pointer-elim"="true" {
48   ; CHECK-LABEL: f5:
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)
58   ret void
59 }
60
61 define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
62   ; CHECK-LABEL: f6:
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)
72   ret void
73 }
74
75 define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
76   ; CHECK-LABEL: f7:
77   ; CHECK:      pushq   %rbp
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
87   ret i32 %e
88 }
89
90 define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
91   ; CHECK-LABEL: f8:
92   ; CHECK:        subq    $352, %rsp
93   ; CHECK:        .seh_stackalloc 352
94   ; CHECK:        leaq    128(%rsp), %rbp
95   ; CHECK:        .seh_setframe 5, 128
96
97   %alloca = alloca [300 x i8], align 64
98   ; CHECK:        andq    $-64, %rsp
99   ; CHECK:        movq    %rsp, %rbx
100
101   alloca i32, i32 %a
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
107
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
114
115   ret i32 %e
116   ; CHECK:        movl    %esi, %eax
117   ; CHECK:        leaq    224(%rbp), %rsp
118 }
119
120 declare i8* @llvm.returnaddress(i32) nounwind readnone
121
122 declare void @llvm.va_start(i8*) nounwind