1 /* { dg-do compile } */
2 /* { dg-options "-O -g" } */
3 /* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
4 
5 #include <stdint.h>
6 
7 typedef int8_t svint8_t __attribute__ ((vector_size (32)));
8 typedef uint8_t svuint8_t __attribute__ ((vector_size (32)));
9 
10 typedef int16_t svint16_t __attribute__ ((vector_size (32)));
11 typedef uint16_t svuint16_t __attribute__ ((vector_size (32)));
12 typedef __fp16 svfloat16_t __attribute__ ((vector_size (32)));
13 typedef __bf16 svbfloat16_t __attribute__ ((vector_size (32)));
14 
15 typedef int32_t svint32_t __attribute__ ((vector_size (32)));
16 typedef uint32_t svuint32_t __attribute__ ((vector_size (32)));
17 typedef float svfloat32_t __attribute__ ((vector_size (32)));
18 
19 typedef int64_t svint64_t __attribute__ ((vector_size (32)));
20 typedef uint64_t svuint64_t __attribute__ ((vector_size (32)));
21 typedef double svfloat64_t __attribute__ ((vector_size (32)));
22 
23 #define CALLEE(SUFFIX, TYPE)			\
24   TYPE __attribute__((noipa))			\
25   callee_##SUFFIX (TYPE *ptr)			\
26   {						\
27     return *ptr;				\
28   }
29 
30 /*
31 ** callee_s8:
32 ** (
33 **	ld1	({v.*}), \[x0\]
34 **	st1	\1, \[x8\]
35 ** |
36 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
37 **	stp	\2, \[x8\]
38 ** )
39 **	ret
40 */
41 CALLEE (s8, svint8_t)
42 
43 /*
44 ** callee_u8:
45 ** (
46 **	ld1	({v.*}), \[x0\]
47 **	st1	\1, \[x8\]
48 ** |
49 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
50 **	stp	\2, \[x8\]
51 ** )
52 **	ret
53 */
54 CALLEE (u8, svuint8_t)
55 
56 /*
57 ** callee_s16:
58 ** (
59 **	ld1	({v.*}), \[x0\]
60 **	st1	\1, \[x8\]
61 ** |
62 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
63 **	stp	\2, \[x8\]
64 ** )
65 **	ret
66 */
67 CALLEE (s16, svint16_t)
68 
69 /*
70 ** callee_u16:
71 ** (
72 **	ld1	({v.*}), \[x0\]
73 **	st1	\1, \[x8\]
74 ** |
75 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
76 **	stp	\2, \[x8\]
77 ** )
78 **	ret
79 */
80 CALLEE (u16, svuint16_t)
81 
82 /* Currently we scalarize this.  */
83 CALLEE (f16, svfloat16_t)
84 
85 /* Currently we scalarize this.  */
86 CALLEE (bf16, svbfloat16_t)
87 
88 /*
89 ** callee_s32:
90 ** (
91 **	ld1	({v.*}), \[x0\]
92 **	st1	\1, \[x8\]
93 ** |
94 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
95 **	stp	\2, \[x8\]
96 ** )
97 **	ret
98 */
99 CALLEE (s32, svint32_t)
100 
101 /*
102 ** callee_u32:
103 ** (
104 **	ld1	({v.*}), \[x0\]
105 **	st1	\1, \[x8\]
106 ** |
107 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
108 **	stp	\2, \[x8\]
109 ** )
110 **	ret
111 */
112 CALLEE (u32, svuint32_t)
113 
114 /* Currently we scalarize this.  */
115 CALLEE (f32, svfloat32_t)
116 
117 /*
118 ** callee_s64:
119 ** (
120 **	ld1	({v.*}), \[x0\]
121 **	st1	\1, \[x8\]
122 ** |
123 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
124 **	stp	\2, \[x8\]
125 ** )
126 **	ret
127 */
128 CALLEE (s64, svint64_t)
129 
130 /*
131 ** callee_u64:
132 ** (
133 **	ld1	({v.*}), \[x0\]
134 **	st1	\1, \[x8\]
135 ** |
136 **	ldp	(q[0-9]+, q[0-9]+), \[x0\]
137 **	stp	\2, \[x8\]
138 ** )
139 **	ret
140 */
141 CALLEE (u64, svuint64_t)
142 
143 /* Currently we scalarize this.  */
144 CALLEE (f64, svfloat64_t)
145 
146 #define CALLER(SUFFIX, TYPE)		\
147   typeof ((*(TYPE *) 0)[0])		\
148   __attribute__((noipa))		\
149   caller_##SUFFIX (TYPE *ptr1)		\
150   {					\
151     return callee_##SUFFIX (ptr1)[0];	\
152   }
153 
154 /*
155 ** caller_s8:
156 **	...
157 **	bl	callee_s8
158 **	ldrb	w0, \[sp, 16\]
159 **	ldp	x29, x30, \[sp\], 48
160 **	ret
161 */
162 CALLER (s8, svint8_t)
163 
164 /*
165 ** caller_u8:
166 **	...
167 **	bl	callee_u8
168 **	ldrb	w0, \[sp, 16\]
169 **	ldp	x29, x30, \[sp\], 48
170 **	ret
171 */
172 CALLER (u8, svuint8_t)
173 
174 /*
175 ** caller_s16:
176 **	...
177 **	bl	callee_s16
178 **	ldrh	w0, \[sp, 16\]
179 **	ldp	x29, x30, \[sp\], 48
180 **	ret
181 */
182 CALLER (s16, svint16_t)
183 
184 /*
185 ** caller_u16:
186 **	...
187 **	bl	callee_u16
188 **	ldrh	w0, \[sp, 16\]
189 **	ldp	x29, x30, \[sp\], 48
190 **	ret
191 */
192 CALLER (u16, svuint16_t)
193 
194 /*
195 ** caller_f16:
196 **	...
197 **	bl	callee_f16
198 **	ldr	h0, \[sp, 16\]
199 **	ldp	x29, x30, \[sp\], 48
200 **	ret
201 */
202 CALLER (f16, svfloat16_t)
203 
204 /*
205 ** caller_bf16:
206 **	...
207 **	bl	callee_bf16
208 **	ldr	h0, \[sp, 16\]
209 **	ldp	x29, x30, \[sp\], 48
210 **	ret
211 */
212 CALLER (bf16, svbfloat16_t)
213 
214 /*
215 ** caller_s32:
216 **	...
217 **	bl	callee_s32
218 **	ldr	w0, \[sp, 16\]
219 **	ldp	x29, x30, \[sp\], 48
220 **	ret
221 */
222 CALLER (s32, svint32_t)
223 
224 /*
225 ** caller_u32:
226 **	...
227 **	bl	callee_u32
228 **	ldr	w0, \[sp, 16\]
229 **	ldp	x29, x30, \[sp\], 48
230 **	ret
231 */
232 CALLER (u32, svuint32_t)
233 
234 /*
235 ** caller_f32:
236 **	...
237 **	bl	callee_f32
238 **	ldr	s0, \[sp, 16\]
239 **	ldp	x29, x30, \[sp\], 48
240 **	ret
241 */
242 CALLER (f32, svfloat32_t)
243 
244 /*
245 ** caller_s64:
246 **	...
247 **	bl	callee_s64
248 **	ldr	x0, \[sp, 16\]
249 **	ldp	x29, x30, \[sp\], 48
250 **	ret
251 */
252 CALLER (s64, svint64_t)
253 
254 /*
255 ** caller_u64:
256 **	...
257 **	bl	callee_u64
258 **	ldr	x0, \[sp, 16\]
259 **	ldp	x29, x30, \[sp\], 48
260 **	ret
261 */
262 CALLER (u64, svuint64_t)
263 
264 /*
265 ** caller_f64:
266 **	...
267 **	bl	callee_f64
268 **	ldr	d0, \[sp, 16\]
269 **	ldp	x29, x30, \[sp\], 48
270 **	ret
271 */
272 CALLER (f64, svfloat64_t)
273