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