1 ; RUN: llc < %s -mtriple=aarch64-pc-win32 | FileCheck %s
3 define void @pass_va(i32 %count, ...) nounwind {
5 ; CHECK: sub sp, sp, #80
6 ; CHECK: add x8, sp, #24
7 ; CHECK: add x0, sp, #24
8 ; CHECK: stp x6, x7, [sp, #64]
9 ; CHECK: stp x4, x5, [sp, #48]
10 ; CHECK: stp x2, x3, [sp, #32]
11 ; CHECK: str x1, [sp, #24]
12 ; CHECK: stp x30, x8, [sp]
13 ; CHECK: bl other_func
14 ; CHECK: ldr x30, [sp], #80
16 %ap = alloca i8*, align 8
17 %ap1 = bitcast i8** %ap to i8*
18 call void @llvm.va_start(i8* %ap1)
19 %ap2 = load i8*, i8** %ap, align 8
20 call void @other_func(i8* %ap2)
24 declare void @other_func(i8*) local_unnamed_addr
26 declare void @llvm.va_start(i8*) nounwind
27 declare void @llvm.va_copy(i8*, i8*) nounwind
30 ; CHECK: sub sp, sp, #16
31 ; CHECK: add x8, sp, #24
32 ; CHECK: add x0, sp, #24
33 ; CHECK: str x8, [sp, #8]
34 ; CHECK: add sp, sp, #16
36 define i8* @f9(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, i64 %a8, ...) nounwind {
38 %ap = alloca i8*, align 8
39 %ap1 = bitcast i8** %ap to i8*
40 call void @llvm.va_start(i8* %ap1)
41 %ap2 = load i8*, i8** %ap, align 8
46 ; CHECK: sub sp, sp, #16
47 ; CHECK: add x8, sp, #16
48 ; CHECK: add x0, sp, #16
49 ; CHECK: str x8, [sp, #8]
50 ; CHECK: add sp, sp, #16
52 define i8* @f8(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, ...) nounwind {
54 %ap = alloca i8*, align 8
55 %ap1 = bitcast i8** %ap to i8*
56 call void @llvm.va_start(i8* %ap1)
57 %ap2 = load i8*, i8** %ap, align 8
62 ; CHECK: sub sp, sp, #32
63 ; CHECK: add x8, sp, #24
64 ; CHECK: str x7, [sp, #24]
65 ; CHECK: add x0, sp, #24
66 ; CHECK: str x8, [sp, #8]
67 ; CHECK: add sp, sp, #32
69 define i8* @f7(i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, ...) nounwind {
71 %ap = alloca i8*, align 8
72 %ap1 = bitcast i8** %ap to i8*
73 call void @llvm.va_start(i8* %ap1)
74 %ap2 = load i8*, i8** %ap, align 8
79 ; CHECK: sub sp, sp, #80
80 ; CHECK: add x8, sp, #24
81 ; CHECK: stp x6, x7, [sp, #64]
82 ; CHECK: stp x4, x5, [sp, #48]
83 ; CHECK: stp x2, x3, [sp, #32]
84 ; CHECK: str x1, [sp, #24]
85 ; CHECK: stp x8, x8, [sp], #80
87 define void @copy1(i64 %a0, ...) nounwind {
89 %ap = alloca i8*, align 8
90 %cp = alloca i8*, align 8
91 %ap1 = bitcast i8** %ap to i8*
92 %cp1 = bitcast i8** %cp to i8*
93 call void @llvm.va_start(i8* %ap1)
94 call void @llvm.va_copy(i8* %cp1, i8* %ap1)
98 declare void @llvm.va_end(i8*)
99 declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
100 declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
102 declare i32 @__stdio_common_vsprintf(i64, i8*, i64, i8*, i8*, i8*) local_unnamed_addr #3
103 declare i64* @__local_stdio_printf_options() local_unnamed_addr #4
105 ; CHECK-LABEL: snprintf
106 ; CHECK: sub sp, sp, #96
107 ; CHECK: stp x21, x20, [sp, #16]
108 ; CHECK: stp x19, x30, [sp, #32]
109 ; CHECK: add x8, sp, #56
113 ; CHECK: stp x6, x7, [sp, #80]
114 ; CHECK: stp x4, x5, [sp, #64]
115 ; CHECK: str x3, [sp, #56]
116 ; CHECK: str x8, [sp, #8]
117 ; CHECK: bl __local_stdio_printf_options
118 ; CHECK: ldr x8, [x0]
119 ; CHECK: add x5, sp, #56
122 ; CHECK: orr x0, x8, #0x2
125 ; CHECK: bl __stdio_common_vsprintf
126 ; CHECK: ldp x19, x30, [sp, #32]
127 ; CHECK: ldp x21, x20, [sp, #16]
129 ; CHECK: csinv w0, w0, wzr, ge
130 ; CHECK: add sp, sp, #96
132 define i32 @snprintf(i8*, i64, i8*, ...) local_unnamed_addr #5 {
133 %4 = alloca i8*, align 8
134 %5 = bitcast i8** %4 to i8*
135 call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %5) #2
136 call void @llvm.va_start(i8* nonnull %5)
137 %6 = load i8*, i8** %4, align 8
138 %7 = call i64* @__local_stdio_printf_options() #2
139 %8 = load i64, i64* %7, align 8
141 %10 = call i32 @__stdio_common_vsprintf(i64 %9, i8* %0, i64 %1, i8* %2, i8* null, i8* %6) #2
142 %11 = icmp sgt i32 %10, -1
143 %12 = select i1 %11, i32 %10, i32 -1
144 call void @llvm.va_end(i8* nonnull %5)
145 call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %5) #2
149 ; CHECK-LABEL: fixed_params
150 ; CHECK: sub sp, sp, #32
154 ; CHECK: str w4, [sp]
162 ; CHECK: str x30, [sp, #16]
163 ; CHECK: str d4, [sp, #8]
165 ; CHECK: ldr x30, [sp, #16]
166 ; CHECK: add sp, sp, #32
168 define void @fixed_params(i32, double, i32, double, i32, double, i32, double, i32, double) nounwind {
169 tail call void (i32, ...) @varargs(i32 %0, double %1, i32 %2, double %3, i32 %4, double %5, i32 %6, double %7, i32 %8, double %9)
173 declare void @varargs(i32, ...) local_unnamed_addr