10#ifndef __RISCV_PACKED_SIMD_H
11#define __RISCV_PACKED_SIMD_H
15#if defined(__cplusplus)
33#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
35#define __packed_splat2(ty, x) ((ty){(x), (x)})
36#define __packed_splat4(ty, x) ((ty){(x), (x), (x), (x)})
37#define __packed_splat8(ty, x) ((ty){(x), (x), (x), (x), (x), (x), (x), (x)})
39#define __packed_splat(name, ty, scalar_ty, splat) \
40 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(scalar_ty __x) { \
41 return splat(ty, __x); \
44#define __packed_shift(name, ty, op, mask) \
45 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
47 return __rs1 op(__rs2 & (mask)); \
49#define __packed_shift8(name, ty, op) __packed_shift(name, ty, op, 0x7)
50#define __packed_shift16(name, ty, op) __packed_shift(name, ty, op, 0xf)
51#define __packed_shift32(name, ty, op) __packed_shift(name, ty, op, 0x1f)
53#define __packed_scalar_binary_op(name, ty, scalar_ty, op, splat) \
54 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
56 return __rs1 op splat(ty, __rs2); \
59#define __packed_binary_op(name, ty, op) \
60 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
61 return __rs1 op __rs2; \
64#define __packed_unary_op(name, ty, op) \
65 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
69#define __packed_extract(name, rty, ty, max_idx) \
70 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __v, \
72 __attribute__((__enable_if__( \
74 "index must be a constant integer from 0 to " #max_idx))) { \
78#define __packed_subvector_extract8(name, rty, ty) \
79 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __v, \
81 __attribute__((__enable_if__( \
82 __idx <= 1, "index must be a constant integer from 0 to 1"))) { \
83 return __idx ? __builtin_shufflevector(__v, __v, 4, 5, 6, 7) \
84 : __builtin_shufflevector(__v, __v, 0, 1, 2, 3); \
86#define __packed_subvector_extract4(name, rty, ty) \
87 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __v, \
89 __attribute__((__enable_if__( \
90 __idx <= 1, "index must be a constant integer from 0 to 1"))) { \
91 return __idx ? __builtin_shufflevector(__v, __v, 2, 3) \
92 : __builtin_shufflevector(__v, __v, 0, 1); \
95#define __packed_store(name, ty, elt_ty) \
96 static __inline__ void __DEFAULT_FN_ATTRS __riscv_##name(elt_ty *__p, \
98 typedef ty __attribute__((__aligned__(1))) ua_ty; \
99 *(ua_ty *)__p = __v; \
102#define __packed_binary_builtin(name, ty, builtin) \
103 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
104 return builtin(__rs1, __rs2); \
107#define __packed_binary_builtin_mixed(name, rty, ty1, ty2, builtin) \
108 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty1 __rs1, \
110 return builtin(__rs1, __rs2); \
113#define __packed_ternary_builtin(name, ty, builtin) \
114 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rd, ty __rs1, \
116 return builtin(__rd, __rs1, __rs2); \
119#define __packed_ternary_builtin_mixed(name, rty, ty1, ty2, builtin) \
120 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(rty __rd, ty1 __rs1, \
122 return builtin(__rd, __rs1, __rs2); \
125#define __packed_sh1add(name, ty) \
126 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
127 return (__rs1 << 1) + __rs2; \
134#define __packed_sh1sadd(name, ty) \
135 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
136 return __builtin_elementwise_add_sat( \
137 __builtin_elementwise_add_sat(__rs1, __rs1), __rs2); \
140#define __packed_cmp(name, ty, rty, op) \
141 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
143 return (rty)(__rs1 op __rs2); \
146#define __packed_pabs(name, ty, rty) \
147 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
148 return (rty)__builtin_elementwise_abs(__rs1); \
151#define __packed_binary_builtin_cast(name, ty, rty, builtin) \
152 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
154 return (rty)builtin(__rs1, __rs2); \
157#define __packed_reduction(name, rty, ty, builtin) \
158 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
160 return builtin(__rs1, __rs2); \
163#define __packed_merge_builtin(name, ty, mask_ty, builtin) \
164 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2, \
166 return (ty)builtin(__rs1, __rs2, __rd); \
169#define __packed_unary_builtin(name, ty, builtin) \
170 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
171 return builtin(__rs1); \
174#define __packed_widen_convert(name, rty, ty) \
175 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
176 return __builtin_convertvector(__rs1, rty); \
178#define __packed_widen_binary_op(name, rty, ty, op) \
179 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
181 return __builtin_convertvector(__rs1, rty) \
182 op __builtin_convertvector(__rs2, rty); \
184#define __packed_widen_binary_acc_op(name, rty, ty, op) \
185 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(rty __rd, ty __rs1, \
187 return __rd op __builtin_convertvector(__rs1, rty) \
188 op __builtin_convertvector(__rs2, rty); \
190#define __packed_widen_mul(name, rty, ty) \
191 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
193 return __builtin_convertvector(__rs1, rty) * \
194 __builtin_convertvector(__rs2, rty); \
196#define __packed_widen_mulsu(name, rty, ty1, ty2, uty) \
197 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty1 __rs1, \
199 return __builtin_convertvector(__rs1, rty) * \
200 (rty) __builtin_convertvector(__rs2, uty); \
202#define __packed_widen_high2(name, rty, ty) \
203 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
204 return (rty)__builtin_shufflevector((ty){0}, __rs1, 0, 2, 1, 3); \
206#define __packed_widen_high4(name, rty, ty) \
207 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
208 return (rty)__builtin_shufflevector((ty){0}, __rs1, 0, 4, 1, 5, 2, 6, 3, \
212#define __packed_narrow_even2(name, rty, ty, sty) \
213 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
214 return __builtin_convertvector(__rs1, rty); \
216#define __packed_narrow_even4(name, rty, ty, sty) \
217 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
218 return __builtin_convertvector(__rs1, rty); \
220#define __packed_narrow_odd2(name, rty, ty, sty, uty) \
221 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
222 return __builtin_shufflevector((sty)__rs1, (sty)__rs1, 1, 3); \
224#define __packed_narrow_odd4(name, rty, ty, sty, uty) \
225 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
226 return __builtin_shufflevector((sty)__rs1, (sty)__rs1, 1, 3, 5, 7); \
231#define __packed_reverse2(name, ty) \
232 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
233 return __builtin_shufflevector(__rs1, __rs1, 1, 0); \
235#define __packed_reverse4(name, ty) \
236 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
237 return __builtin_shufflevector(__rs1, __rs1, 3, 2, 1, 0); \
239#define __packed_reverse8(name, ty) \
240 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
241 return __builtin_shufflevector(__rs1, __rs1, 7, 6, 5, 4, 3, 2, 1, 0); \
244#define __packed_zip2(name, rty, ty) \
245 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
247 return __builtin_shufflevector(__rs1, __rs2, 0, 2, 1, 3); \
249#define __packed_zip4(name, rty, ty) \
250 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
252 return __builtin_shufflevector(__rs1, __rs2, 0, 4, 1, 5, 2, 6, 3, 7); \
254#define __packed_unzipe2(name, rty, ty) \
255 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
256 return __builtin_shufflevector(__rs1, __rs1, 0, 2); \
258#define __packed_unzipe4(name, rty, ty) \
259 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
260 return __builtin_shufflevector(__rs1, __rs1, 0, 2, 4, 6); \
262#define __packed_unzipo2(name, rty, ty) \
263 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
264 return __builtin_shufflevector(__rs1, __rs1, 1, 3); \
266#define __packed_unzipo4(name, rty, ty) \
267 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
268 return __builtin_shufflevector(__rs1, __rs1, 1, 3, 5, 7); \
271#define __packed_concat2(name, rty, ty) \
272 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __lo, ty __hi) { \
273 return __builtin_shufflevector(__lo, __hi, 0, 1, 2, 3); \
275#define __packed_concat4(name, rty, ty) \
276 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __lo, ty __hi) { \
277 return __builtin_shufflevector(__lo, __hi, 0, 1, 2, 3, 4, 5, 6, 7); \
280#define __packed_pair_ee4(name, ty) \
281 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
282 return __builtin_shufflevector(__rs1, __rs2, 0, 4, 2, 6); \
284#define __packed_pair_eo4(name, ty) \
285 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
286 return __builtin_shufflevector(__rs1, __rs2, 0, 5, 2, 7); \
288#define __packed_pair_oe4(name, ty) \
289 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
290 return __builtin_shufflevector(__rs1, __rs2, 1, 4, 3, 6); \
292#define __packed_pair_oo4(name, ty) \
293 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
294 return __builtin_shufflevector(__rs1, __rs2, 1, 5, 3, 7); \
296#define __packed_pair_ee8(name, ty) \
297 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
298 return __builtin_shufflevector(__rs1, __rs2, 0, 8, 2, 10, 4, 12, 6, 14); \
300#define __packed_pair_eo8(name, ty) \
301 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
302 return __builtin_shufflevector(__rs1, __rs2, 0, 9, 2, 11, 4, 13, 6, 15); \
304#define __packed_pair_oe8(name, ty) \
305 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
306 return __builtin_shufflevector(__rs1, __rs2, 1, 8, 3, 10, 5, 12, 7, 14); \
308#define __packed_pair_oo8(name, ty) \
309 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
310 return __builtin_shufflevector(__rs1, __rs2, 1, 9, 3, 11, 5, 13, 7, 15); \
313#define __packed_nzip2(name, rty, ty) \
314 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
316 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 0, 4, 2, 6); \
318#define __packed_nzip4(name, rty, ty) \
319 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
321 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 0, 8, 2, 10, 4, 12, \
324#define __packed_nziph2(name, rty, ty) \
325 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
327 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 1, 5, 3, 7); \
329#define __packed_nziph4(name, rty, ty) \
330 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
332 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 1, 9, 3, 11, 5, 13, \
336#define __packed_abdsum(name, rty, ty, builtin) \
337 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
339 return builtin(__rs1, __rs2); \
342#define __packed_ternary_builtin_cast(name, rty, ty, builtin) \
343 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(rty __rd, ty __rs1, \
345 return builtin(__rd, __rs1, __rs2); \
348#define __packed_reinterpret(name, rty, ty) \
349 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_preinterpret_##name( \
351 return __builtin_bit_cast(rty, __x); \
354#define __packed_insert(name, ty, elt_ty, max_idx) \
355 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __v, elt_ty __e, \
357 __attribute__((__enable_if__( \
358 __idx <= (max_idx), \
359 "index must be a constant integer from 0 to " #max_idx))) { \
364#define __packed_join2(name, ty, elt_ty) \
365 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(elt_ty __e0, \
367 return (ty){__e0, __e1}; \
370#define __packed_join4(name, ty, elt_ty) \
371 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name( \
372 elt_ty __e0, elt_ty __e1, elt_ty __e2, elt_ty __e3) { \
373 return (ty){__e0, __e1, __e2, __e3}; \
376#define __packed_load(name, ty, elt_ty) \
377 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(elt_ty *__p) { \
378 typedef ty __attribute__((__aligned__(1))) ua_ty; \
379 return *(ua_ty *)__p; \
387#if __riscv_xlen == 64
399#if __riscv_xlen == 64
1292#undef __packed_splat2
1293#undef __packed_splat4
1294#undef __packed_splat8
1295#undef __packed_splat
1296#undef __packed_shift
1297#undef __packed_shift8
1298#undef __packed_shift16
1299#undef __packed_shift32
1300#undef __packed_scalar_binary_op
1301#undef __packed_binary_op
1302#undef __packed_unary_op
1303#undef __packed_store
1304#undef __packed_binary_builtin
1305#undef __packed_binary_builtin_mixed
1306#undef __packed_ternary_builtin
1307#undef __packed_ternary_builtin_mixed
1308#undef __packed_sh1add
1309#undef __packed_sh1sadd
1312#undef __packed_binary_builtin_cast
1313#undef __packed_reduction
1314#undef __packed_merge_builtin
1315#undef __packed_unary_builtin
1316#undef __packed_widen_convert
1317#undef __packed_widen_binary_op
1318#undef __packed_widen_binary_acc_op
1319#undef __packed_widen_mul
1320#undef __packed_widen_mulsu
1321#undef __packed_widen_high2
1322#undef __packed_widen_high4
1323#undef __packed_narrow_even2
1324#undef __packed_narrow_even4
1325#undef __packed_narrow_odd2
1326#undef __packed_narrow_odd4
1327#undef __packed_reverse2
1328#undef __packed_reverse4
1329#undef __packed_reverse8
1332#undef __packed_unzipe2
1333#undef __packed_unzipe4
1334#undef __packed_unzipo2
1335#undef __packed_unzipo4
1336#undef __packed_concat2
1337#undef __packed_concat4
1338#undef __packed_pair_ee4
1339#undef __packed_pair_eo4
1340#undef __packed_pair_oe4
1341#undef __packed_pair_oo4
1342#undef __packed_pair_ee8
1343#undef __packed_pair_eo8
1344#undef __packed_pair_oe8
1345#undef __packed_pair_oo8
1346#undef __packed_nzip2
1347#undef __packed_nzip4
1348#undef __packed_nziph2
1349#undef __packed_nziph4
1350#undef __packed_abdsum
1351#undef __packed_ternary_builtin_cast
1352#undef __packed_extract
1353#undef __packed_subvector_extract8
1354#undef __packed_subvector_extract4
1355#undef __packed_insert
1356#undef __packed_join2
1357#undef __packed_join4
1359#undef __packed_reinterpret
1360#undef __DEFAULT_FN_ATTRS
1362#if defined(__cplusplus)
#define __packed_insert(name, ty, elt_ty, max_idx)
#define __packed_pair_oe8(name, ty)
#define __packed_cmp(name, ty, rty, op)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t int8x4_t
#define __packed_widen_convert(name, rty, ty)
#define __packed_subvector_extract8(name, rty, ty)
#define __packed_unary_builtin(name, ty, builtin)
#define __packed_widen_mulsu(name, rty, ty1, ty2, uty)
#define __packed_unzipo2(name, rty, ty)
#define __packed_binary_op(name, ty, op)
#define __packed_reinterpret(name, rty, ty)
#define __packed_splat2(ty, x)
int8_t int8x4_t __attribute__((__vector_size__(4)))
#define __packed_reduction(name, rty, ty, builtin)
#define __packed_shift8(name, ty, op)
#define __packed_binary_builtin_mixed(name, rty, ty1, ty2, builtin)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint32x2_t
#define __packed_nziph2(name, rty, ty)
#define __packed_reverse2(name, ty)
#define __packed_pair_ee4(name, ty)
#define __packed_splat8(ty, x)
#define __packed_merge_builtin(name, ty, mask_ty, builtin)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8x4_t
#define __packed_scalar_binary_op(name, ty, scalar_ty, op, splat)
#define __packed_concat4(name, rty, ty)
#define __packed_shift16(name, ty, op)
#define __packed_pair_eo4(name, ty)
#define __packed_nzip2(name, rty, ty)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 int16_t
#define __packed_pair_eo8(name, ty)
#define __packed_reverse8(name, ty)
#define __packed_binary_builtin(name, ty, builtin)
#define __packed_join4(name, ty, elt_ty)
#define __packed_pair_oe4(name, ty)
#define __packed_nziph4(name, rty, ty)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8x8_t
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t int8_t
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 int16x4_t
#define __packed_narrow_even2(name, rty, ty, sty)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 int16x2_t
#define __packed_widen_high4(name, rty, ty)
#define __packed_ternary_builtin(name, ty, builtin)
#define __packed_concat2(name, rty, ty)
#define __packed_unary_op(name, ty, op)
#define __packed_extract(name, rty, ty, max_idx)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint16x4_t
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
#define __packed_pair_oo4(name, ty)
#define __packed_pair_ee8(name, ty)
#define __packed_unzipe4(name, rty, ty)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
#define __packed_sh1add(name, ty)
#define __packed_pabs(name, ty, rty)
#define __packed_sh1sadd(name, ty)
#define __packed_unzipe2(name, rty, ty)
#define __packed_unzipo4(name, rty, ty)
#define __packed_widen_high2(name, rty, ty)
#define __packed_ternary_builtin_mixed(name, rty, ty1, ty2, builtin)
#define __packed_pair_oo8(name, ty)
#define __packed_shift32(name, ty, op)
#define __packed_nzip4(name, rty, ty)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 int32x2_t
#define __packed_zip4(name, rty, ty)
#define __packed_splat(name, ty, scalar_ty, splat)
#define __packed_widen_binary_acc_op(name, rty, ty, op)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 int8x8_t
#define __packed_narrow_odd2(name, rty, ty, sty, uty)
#define __packed_abdsum(name, rty, ty, builtin)
#define __packed_widen_binary_op(name, rty, ty, op)
#define __packed_binary_builtin_cast(name, ty, rty, builtin)
#define __packed_ternary_builtin_cast(name, rty, ty, builtin)
#define __packed_subvector_extract4(name, rty, ty)
#define __packed_narrow_even4(name, rty, ty, sty)
#define __packed_narrow_odd4(name, rty, ty, sty, uty)
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
__builtin_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint16x2_t
#define __packed_widen_mul(name, rty, ty)
#define __packed_zip2(name, rty, ty)
#define __packed_join2(name, ty, elt_ty)
#define __packed_store(name, ty, elt_ty)
#define __packed_splat4(ty, x)
#define __packed_load(name, ty, elt_ty)
#define __packed_reverse4(name, ty)