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