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_binary_builtin(name, ty, builtin) \
70 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
71 return builtin(__rs1, __rs2); \
74#define __packed_sh1add(name, ty) \
75 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
76 return (__rs1 << 1) + __rs2; \
83#define __packed_sh1sadd(name, ty) \
84 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
85 return __builtin_elementwise_add_sat( \
86 __builtin_elementwise_add_sat(__rs1, __rs1), __rs2); \
89#define __packed_cmp(name, ty, rty, op) \
90 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
92 return (rty)(__rs1 op __rs2); \
95#define __packed_pabs(name, ty, rty) \
96 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
97 return (rty)__builtin_elementwise_abs(__rs1); \
100#define __packed_binary_builtin_cast(name, ty, rty, builtin) \
101 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
103 return (rty)builtin(__rs1, __rs2); \
106#define __packed_reduction(name, rty, ty, builtin) \
107 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
109 return builtin(__rs1, __rs2); \
112#define __packed_merge_builtin(name, ty, mask_ty, builtin) \
113 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2, \
115 return (ty)builtin(__rs1, __rs2, __rd); \
118#define __packed_psabs(name, ty, builtin) \
119 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
120 return builtin(__rs1); \
123#define __packed_widen_convert(name, rty, ty) \
124 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
125 return __builtin_convertvector(__rs1, rty); \
127#define __packed_widen_high2(name, rty, ty) \
128 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
129 return (rty)__builtin_shufflevector((ty){0}, __rs1, 0, 2, 1, 3); \
131#define __packed_widen_high4(name, rty, ty) \
132 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
133 return (rty)__builtin_shufflevector((ty){0}, __rs1, 0, 4, 1, 5, 2, 6, 3, \
137#define __packed_narrow_even2(name, rty, ty, sty) \
138 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
139 return __builtin_convertvector(__rs1, rty); \
141#define __packed_narrow_even4(name, rty, ty, sty) \
142 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
143 return __builtin_convertvector(__rs1, rty); \
145#define __packed_narrow_odd2(name, rty, ty, sty, uty) \
146 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
147 return __builtin_shufflevector((sty)__rs1, (sty)__rs1, 1, 3); \
149#define __packed_narrow_odd4(name, rty, ty, sty, uty) \
150 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
151 return __builtin_shufflevector((sty)__rs1, (sty)__rs1, 1, 3, 5, 7); \
156#define __packed_reverse2(name, ty) \
157 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
158 return __builtin_shufflevector(__rs1, __rs1, 1, 0); \
160#define __packed_reverse4(name, ty) \
161 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
162 return __builtin_shufflevector(__rs1, __rs1, 3, 2, 1, 0); \
164#define __packed_reverse8(name, ty) \
165 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
166 return __builtin_shufflevector(__rs1, __rs1, 7, 6, 5, 4, 3, 2, 1, 0); \
169#define __packed_zip2(name, rty, ty) \
170 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
172 return __builtin_shufflevector(__rs1, __rs2, 0, 2, 1, 3); \
174#define __packed_zip4(name, rty, ty) \
175 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
177 return __builtin_shufflevector(__rs1, __rs2, 0, 4, 1, 5, 2, 6, 3, 7); \
179#define __packed_unzipe2(name, rty, ty) \
180 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
181 return __builtin_shufflevector(__rs1, __rs1, 0, 2); \
183#define __packed_unzipe4(name, rty, ty) \
184 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
185 return __builtin_shufflevector(__rs1, __rs1, 0, 2, 4, 6); \
187#define __packed_unzipo2(name, rty, ty) \
188 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
189 return __builtin_shufflevector(__rs1, __rs1, 1, 3); \
191#define __packed_unzipo4(name, rty, ty) \
192 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1) { \
193 return __builtin_shufflevector(__rs1, __rs1, 1, 3, 5, 7); \
196#define __packed_pair_ee4(name, ty) \
197 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
198 return __builtin_shufflevector(__rs1, __rs2, 0, 4, 2, 6); \
200#define __packed_pair_eo4(name, ty) \
201 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
202 return __builtin_shufflevector(__rs1, __rs2, 0, 5, 2, 7); \
204#define __packed_pair_oe4(name, ty) \
205 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
206 return __builtin_shufflevector(__rs1, __rs2, 1, 4, 3, 6); \
208#define __packed_pair_oo4(name, ty) \
209 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
210 return __builtin_shufflevector(__rs1, __rs2, 1, 5, 3, 7); \
212#define __packed_pair_ee8(name, ty) \
213 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
214 return __builtin_shufflevector(__rs1, __rs2, 0, 8, 2, 10, 4, 12, 6, 14); \
216#define __packed_pair_eo8(name, ty) \
217 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
218 return __builtin_shufflevector(__rs1, __rs2, 0, 9, 2, 11, 4, 13, 6, 15); \
220#define __packed_pair_oe8(name, ty) \
221 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
222 return __builtin_shufflevector(__rs1, __rs2, 1, 8, 3, 10, 5, 12, 7, 14); \
224#define __packed_pair_oo8(name, ty) \
225 static __inline__ ty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, ty __rs2) { \
226 return __builtin_shufflevector(__rs1, __rs2, 1, 9, 3, 11, 5, 13, 7, 15); \
229#define __packed_nzip2(name, rty, ty) \
230 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
232 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 0, 4, 2, 6); \
234#define __packed_nzip4(name, rty, ty) \
235 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
237 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 0, 8, 2, 10, 4, 12, \
240#define __packed_nziph2(name, rty, ty) \
241 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
243 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 1, 5, 3, 7); \
245#define __packed_nziph4(name, rty, ty) \
246 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
248 return __builtin_shufflevector((rty)__rs1, (rty)__rs2, 1, 9, 3, 11, 5, 13, \
252#define __packed_abdsum(name, rty, ty, builtin) \
253 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(ty __rs1, \
255 return builtin(__rs1, __rs2); \
258#define __packed_abdsum_acc(name, rty, ty, builtin) \
259 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_##name(rty __rd, ty __rs1, \
261 return builtin(__rd, __rs1, __rs2); \
264#define __packed_reinterpret(name, rty, ty) \
265 static __inline__ rty __DEFAULT_FN_ATTRS __riscv_preinterpret_##name( \
267 return __builtin_bit_cast(rty, __x); \
837#undef __packed_splat2
838#undef __packed_splat4
839#undef __packed_splat8
842#undef __packed_shift8
843#undef __packed_shift16
844#undef __packed_shift32
845#undef __packed_scalar_binary_op
846#undef __packed_binary_op
847#undef __packed_unary_op
848#undef __packed_binary_builtin
849#undef __packed_sh1add
850#undef __packed_sh1sadd
853#undef __packed_binary_builtin_cast
854#undef __packed_reduction
855#undef __packed_merge_builtin
857#undef __packed_widen_convert
858#undef __packed_widen_high2
859#undef __packed_widen_high4
860#undef __packed_narrow_even2
861#undef __packed_narrow_even4
862#undef __packed_narrow_odd2
863#undef __packed_narrow_odd4
864#undef __packed_reverse2
865#undef __packed_reverse4
866#undef __packed_reverse8
869#undef __packed_unzipe2
870#undef __packed_unzipe4
871#undef __packed_unzipo2
872#undef __packed_unzipo4
873#undef __packed_pair_ee4
874#undef __packed_pair_eo4
875#undef __packed_pair_oe4
876#undef __packed_pair_oo4
877#undef __packed_pair_ee8
878#undef __packed_pair_eo8
879#undef __packed_pair_oe8
880#undef __packed_pair_oo8
883#undef __packed_nziph2
884#undef __packed_nziph4
885#undef __packed_abdsum
886#undef __packed_abdsum_acc
887#undef __packed_reinterpret
888#undef __DEFAULT_FN_ATTRS
890#if defined(__cplusplus)
#define __packed_pair_oe8(name, ty)
#define __packed_cmp(name, ty, rty, op)
#define __packed_widen_convert(name, rty, ty)
#define __packed_unzipo2(name, rty, ty)
__packed_splat4 int16x2_t
#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_nziph2(name, rty, ty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint16x4_t
#define __packed_reverse2(name, ty)
#define __packed_pair_ee4(name, ty)
#define __packed_splat8(ty, x)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 int32_t
#define __packed_merge_builtin(name, ty, mask_ty, builtin)
#define __packed_scalar_binary_op(name, ty, scalar_ty, op, splat)
#define __packed_shift16(name, ty, op)
#define __packed_pair_eo4(name, ty)
#define __packed_nzip2(name, rty, ty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 uint16_t
#define __packed_pair_eo8(name, ty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint32x2_t
#define __packed_reverse8(name, ty)
#define __packed_binary_builtin(name, ty, builtin)
#define __packed_pair_oe4(name, ty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t
#define __packed_nziph4(name, rty, ty)
#define __packed_narrow_even2(name, rty, ty, sty)
#define __packed_widen_high4(name, rty, ty)
#define __packed_unary_op(name, ty, op)
#define __packed_psabs(name, ty, builtin)
#define __packed_pair_oo4(name, ty)
#define __packed_pair_ee8(name, ty)
#define __packed_unzipe4(name, rty, ty)
#define __packed_sh1add(name, ty)
#define __packed_pabs(name, ty, rty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint16x2_t
#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_abdsum_acc(name, rty, ty, builtin)
#define __packed_pair_oo8(name, ty)
#define __packed_shift32(name, ty, op)
#define __packed_nzip4(name, rty, ty)
__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_narrow_odd2(name, rty, ty, sty, uty)
__packed_splat4 __packed_splat2 int8x8_t
#define __packed_abdsum(name, rty, ty, builtin)
#define __packed_binary_builtin_cast(name, ty, rty, builtin)
#define __packed_narrow_even4(name, rty, ty, sty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8x4_t
#define __packed_narrow_odd4(name, rty, ty, sty, uty)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8x8_t
#define __packed_zip2(name, rty, ty)
#define __packed_splat4(ty, x)
__packed_splat4 __packed_splat2 __packed_splat8 int16x4_t
#define __packed_reverse4(name, ty)