xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/va_callee.ll (revision b006b60dc993b2e0ba3e412c80709477241b6be6)
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 ptr, align 8
16  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %va)
17  call void @llvm.va_start(ptr nonnull %va)
18  %p1 = va_arg ptr %va, i32
19  %p2 = va_arg ptr %va, i16
20  %p3 = va_arg ptr %va, i8
21  %p4 = va_arg ptr %va, i32
22  %p5 = va_arg ptr %va, i16
23  %p6 = va_arg ptr %va, i8
24  %p7 = va_arg ptr %va, float
25  %p8 = va_arg ptr %va, ptr
26  %p9 = va_arg ptr %va, i64
27  %p10 = va_arg ptr %va, double
28  call void @llvm.va_end(ptr nonnull %va)
29  call void @use_i32(i32 %p1)
30  call void @use_s16(i16 %p2)
31  call void @use_s8(i8 %p3)
32  call void @use_i32(i32 %p4)
33  call void @use_u16(i16 %p5)
34  call void @use_u8(i8 %p6)
35  call void @use_float(float %p7)
36  call void @use_i8p(ptr %p8)
37  call void @use_i64(i64 %p9)
38  call void @use_double(double %p10)
39  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %va)
40  ret i32 0
41}
42
43define i32 @va_copy0(i32, ...) {
44; CHECK-LABEL: va_copy0:
45; CHECK:       ldl.sx %s0,
46; CHECK:       ld2b.sx %s18,
47; CHECK:       ld1b.sx %s19,
48; CHECK:       ldl.sx %s20,
49; CHECK:       ld2b.zx %s21,
50; CHECK:       ld1b.zx %s22,
51; CHECK:       ldu %s23,
52; CHECK:       ld %s24,
53; CHECK:       ld %s25,
54
55  %va = alloca ptr, align 8
56  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %va)
57  call void @llvm.va_start(ptr nonnull %va)
58  %vb = alloca ptr, align 8
59  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %va)
60  call void @llvm.va_copy(ptr nonnull %vb, ptr nonnull %va)
61  call void @llvm.va_end(ptr nonnull %va)
62  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %va)
63  %p1 = va_arg ptr %vb, i32
64  %p2 = va_arg ptr %vb, i16
65  %p3 = va_arg ptr %vb, i8
66  %p4 = va_arg ptr %vb, i32
67  %p5 = va_arg ptr %vb, i16
68  %p6 = va_arg ptr %vb, i8
69  %p7 = va_arg ptr %vb, float
70  %p8 = va_arg ptr %vb, ptr
71  %p9 = va_arg ptr %vb, i64
72  %p10 = va_arg ptr %vb, double
73  call void @llvm.va_end(ptr nonnull %vb)
74  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %vb)
75  call void @use_i32(i32 %p1)
76  call void @use_s16(i16 %p2)
77  call void @use_s8(i8 %p3)
78  call void @use_i32(i32 %p4)
79  call void @use_u16(i16 %p5)
80  call void @use_u8(i8 %p6)
81  call void @use_float(float %p7)
82  call void @use_i8p(ptr %p8)
83  call void @use_i64(i64 %p9)
84  call void @use_double(double %p10)
85  ret i32 0
86}
87
88define i32 @va_copy8(i32, ...) {
89; CHECK-LABEL: va_copy8:
90; CHECK:       ldl.sx %s0,
91; CHECK:       ld2b.sx %s18,
92; CHECK:       ld1b.sx %s19,
93; CHECK:       ldl.sx %s20,
94; CHECK:       ld2b.zx %s21,
95; CHECK:       ld1b.zx %s22,
96; CHECK:       ldu %s23,
97; CHECK:       ld %s24,
98; CHECK:       ld %s25,
99
100  %va = alloca ptr, align 8
101  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %va)
102  call void @llvm.va_start(ptr nonnull %va)
103  %p1 = va_arg ptr %va, i32
104  %p2 = va_arg ptr %va, i16
105  %p3 = va_arg ptr %va, i8
106  %p4 = va_arg ptr %va, i32
107  %p5 = va_arg ptr %va, i16
108  %p6 = va_arg ptr %va, i8
109  %p7 = va_arg ptr %va, float
110
111  %vc = alloca ptr, align 8
112  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %va)
113  call void @llvm.va_copy(ptr nonnull %vc, ptr nonnull %va)
114  call void @llvm.va_end(ptr nonnull %va)
115  %p8 = va_arg ptr %vc, ptr
116  %p9 = va_arg ptr %vc, i64
117  %p10 = va_arg ptr %vc, double
118  call void @llvm.va_end(ptr nonnull %vc)
119  call void @use_i32(i32 %p1)
120  call void @use_s16(i16 %p2)
121  call void @use_s8(i8 %p3)
122  call void @use_i32(i32 %p4)
123  call void @use_u16(i16 %p5)
124  call void @use_u8(i8 %p6)
125  call void @use_float(float %p7)
126  call void @use_i8p(ptr %p8)
127  call void @use_i64(i64 %p9)
128  call void @use_double(double %p10)
129  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %va)
130  ret i32 0
131}
132
133declare void @use_i64(i64)
134declare void @use_i32(i32)
135declare void @use_u16(i16 zeroext)
136declare void @use_u8(i8 zeroext)
137declare void @use_s16(i16 signext)
138declare void @use_s8(i8 signext)
139declare void @use_i8p(ptr)
140declare void @use_float(float)
141declare void @use_double(double)
142
143declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
144declare void @llvm.va_start(ptr)
145declare void @llvm.va_copy(ptr, ptr)
146declare void @llvm.va_end(ptr)
147declare void @llvm.lifetime.end.p0(i64, ptr nocapture)
148