1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
2
3define i32 @va_func(i32, ...) {
4; CHECK-LABEL: va_func:
5; CHECK:       ldl.sx %s0, 184(, %s9)
6; CHECK:       ld2b.sx %s18, 192(, %s9)
7; CHECK:       ld1b.sx %s19, 200(, %s9)
8; CHECK:       ldl.sx %s20, 208(, %s9)
9; CHECK:       ld2b.zx %s21, 216(, %s9)
10; CHECK:       ld1b.zx %s22, 224(, %s9)
11; CHECK:       ldu %s23, 236(, %s9)
12; CHECK:       ld %s24, 240(, %s9)
13; CHECK:       ld %s25, 248(, %s9)
14
15  %va = alloca i8*, align 8
16  %va.i8 = bitcast i8** %va to i8*
17  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %va.i8)
18  call void @llvm.va_start(i8* nonnull %va.i8)
19  %p1 = va_arg i8** %va, i32
20  %p2 = va_arg i8** %va, i16
21  %p3 = va_arg i8** %va, i8
22  %p4 = va_arg i8** %va, i32
23  %p5 = va_arg i8** %va, i16
24  %p6 = va_arg i8** %va, i8
25  %p7 = va_arg i8** %va, float
26  %p8 = va_arg i8** %va, i8*
27  %p9 = va_arg i8** %va, i64
28  %p10 = va_arg i8** %va, double
29  call void @llvm.va_end(i8* nonnull %va.i8)
30  call void @use_i32(i32 %p1)
31  call void @use_s16(i16 %p2)
32  call void @use_s8(i8 %p3)
33  call void @use_i32(i32 %p4)
34  call void @use_u16(i16 %p5)
35  call void @use_u8(i8 %p6)
36  call void @use_float(float %p7)
37  call void @use_i8p(i8* %p8)
38  call void @use_i64(i64 %p9)
39  call void @use_double(double %p10)
40  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %va.i8)
41  ret i32 0
42}
43
44define i32 @va_copy0(i32, ...) {
45; CHECK-LABEL: va_copy0:
46; CHECK:       ldl.sx %s0,
47; CHECK:       ld2b.sx %s18,
48; CHECK:       ld1b.sx %s19,
49; CHECK:       ldl.sx %s20,
50; CHECK:       ld2b.zx %s21,
51; CHECK:       ld1b.zx %s22,
52; CHECK:       ldu %s23,
53; CHECK:       ld %s24,
54; CHECK:       ld %s25,
55
56  %va = alloca i8*, align 8
57  %va.i8 = bitcast i8** %va to i8*
58  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %va.i8)
59  call void @llvm.va_start(i8* nonnull %va.i8)
60  %vb = alloca i8*, align 8
61  %vb.i8 = bitcast i8** %vb to i8*
62  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %va.i8)
63  call void @llvm.va_copy(i8* nonnull %vb.i8, i8* nonnull %va.i8)
64  call void @llvm.va_end(i8* nonnull %va.i8)
65  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %va.i8)
66  %p1 = va_arg i8** %vb, i32
67  %p2 = va_arg i8** %vb, i16
68  %p3 = va_arg i8** %vb, i8
69  %p4 = va_arg i8** %vb, i32
70  %p5 = va_arg i8** %vb, i16
71  %p6 = va_arg i8** %vb, i8
72  %p7 = va_arg i8** %vb, float
73  %p8 = va_arg i8** %vb, i8*
74  %p9 = va_arg i8** %vb, i64
75  %p10 = va_arg i8** %vb, double
76  call void @llvm.va_end(i8* nonnull %vb.i8)
77  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %vb.i8)
78  call void @use_i32(i32 %p1)
79  call void @use_s16(i16 %p2)
80  call void @use_s8(i8 %p3)
81  call void @use_i32(i32 %p4)
82  call void @use_u16(i16 %p5)
83  call void @use_u8(i8 %p6)
84  call void @use_float(float %p7)
85  call void @use_i8p(i8* %p8)
86  call void @use_i64(i64 %p9)
87  call void @use_double(double %p10)
88  ret i32 0
89}
90
91define i32 @va_copy8(i32, ...) {
92; CHECK-LABEL: va_copy8:
93; CHECK:       ldl.sx %s0,
94; CHECK:       ld2b.sx %s18,
95; CHECK:       ld1b.sx %s19,
96; CHECK:       ldl.sx %s20,
97; CHECK:       ld2b.zx %s21,
98; CHECK:       ld1b.zx %s22,
99; CHECK:       ldu %s23,
100; CHECK:       ld %s24,
101; CHECK:       ld %s25,
102
103  %va = alloca i8*, align 8
104  %va.i8 = bitcast i8** %va to i8*
105  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %va.i8)
106  call void @llvm.va_start(i8* nonnull %va.i8)
107  %p1 = va_arg i8** %va, i32
108  %p2 = va_arg i8** %va, i16
109  %p3 = va_arg i8** %va, i8
110  %p4 = va_arg i8** %va, i32
111  %p5 = va_arg i8** %va, i16
112  %p6 = va_arg i8** %va, i8
113  %p7 = va_arg i8** %va, float
114
115  %vc = alloca i8*, align 8
116  %vc.i8 = bitcast i8** %vc to i8*
117  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull %va.i8)
118  call void @llvm.va_copy(i8* nonnull %vc.i8, i8* nonnull %va.i8)
119  call void @llvm.va_end(i8* nonnull %va.i8)
120  %p8 = va_arg i8** %vc, i8*
121  %p9 = va_arg i8** %vc, i64
122  %p10 = va_arg i8** %vc, double
123  call void @llvm.va_end(i8* nonnull %vc.i8)
124  call void @use_i32(i32 %p1)
125  call void @use_s16(i16 %p2)
126  call void @use_s8(i8 %p3)
127  call void @use_i32(i32 %p4)
128  call void @use_u16(i16 %p5)
129  call void @use_u8(i8 %p6)
130  call void @use_float(float %p7)
131  call void @use_i8p(i8* %p8)
132  call void @use_i64(i64 %p9)
133  call void @use_double(double %p10)
134  call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %va.i8)
135  ret i32 0
136}
137
138declare void @use_i64(i64)
139declare void @use_i32(i32)
140declare void @use_u16(i16 zeroext)
141declare void @use_u8(i8 zeroext)
142declare void @use_s16(i16 signext)
143declare void @use_s8(i8 signext)
144declare void @use_i8p(i8*)
145declare void @use_float(float)
146declare void @use_double(double)
147
148declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
149declare void @llvm.va_start(i8*)
150declare void @llvm.va_copy(i8*, i8*)
151declare void @llvm.va_end(i8*)
152declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
153