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