10 #ifndef EIGEN_PACKET_MATH_SVE_H 11 #define EIGEN_PACKET_MATH_SVE_H 17 #ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 18 #define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8 21 #ifndef EIGEN_HAS_SINGLE_INSTRUCTION_MADD 22 #define EIGEN_HAS_SINGLE_INSTRUCTION_MADD 25 #define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 32 27 template <
typename Scalar,
int SVEVectorLength>
29 enum {
size = SVEVectorLength / (
sizeof(
Scalar) * CHAR_BIT) };
33 typedef svint32_t PacketXi
__attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)));
70 masked_load_available =
false,
71 masked_store_available =
false 78 svprfw(svptrue_b32(), addr, SV_PLDL1KEEP);
84 return svdup_n_s32(from);
92 return svadd_s32_z(svptrue_b32(),
pset1<PacketXi>(
a), svld1_s32(svptrue_b32(), c));
98 return svadd_s32_z(svptrue_b32(), a,
b);
104 return svsub_s32_z(svptrue_b32(), a,
b);
110 return svneg_s32_z(svptrue_b32(), a);
122 return svmul_s32_z(svptrue_b32(), a,
b);
128 return svdiv_s32_z(svptrue_b32(), a,
b);
134 return svmla_s32_z(svptrue_b32(), c, a, b);
140 return svmin_s32_z(svptrue_b32(), a,
b);
146 return svmax_s32_z(svptrue_b32(), a,
b);
152 return svdup_n_s32_z(svcmplt_s32(svptrue_b32(), a,
b), 0xffffffffu);
158 return svdup_n_s32_z(svcmplt_s32(svptrue_b32(), a,
b), 0xffffffffu);
164 return svdup_n_s32_z(svcmpeq_s32(svptrue_b32(), a,
b), 0xffffffffu);
170 return svdup_n_s32_z(svptrue_b32(), 0xffffffffu);
176 return svdup_n_s32_z(svptrue_b32(), 0);
182 return svand_s32_z(svptrue_b32(), a,
b);
188 return svorr_s32_z(svptrue_b32(), a,
b);
194 return sveor_s32_z(svptrue_b32(), a,
b);
200 return svbic_s32_z(svptrue_b32(), a,
b);
206 return svasrd_n_s32_z(svptrue_b32(), a,
N);
212 return svreinterpret_s32_u32(svlsr_u32_z(svptrue_b32(), svreinterpret_u32_s32(a), svdup_n_u32_z(svptrue_b32(),
N)));
218 return svlsl_s32_z(svptrue_b32(), a, svdup_n_u32_z(svptrue_b32(),
N));
236 svuint32_t indices = svindex_u32(0, 1);
237 indices = svzip1_u32(indices, indices);
238 return svld1_gather_u32index_s32(svptrue_b32(), from, indices);
244 svuint32_t indices = svindex_u32(0, 1);
245 indices = svzip1_u32(indices, indices);
246 indices = svzip1_u32(indices, indices);
247 return svld1_gather_u32index_s32(svptrue_b32(), from, indices);
266 svint32_t indices = svindex_s32(0, stride);
267 return svld1_gather_s32index_s32(svptrue_b32(), from, indices);
274 svint32_t indices = svindex_s32(0, stride);
275 svst1_scatter_s32index_s32(svptrue_b32(), to, indices, from);
282 return svlasta_s32(svpfalse_b(), a);
294 return svabs_s32_z(svptrue_b32(), a);
307 EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
310 svint32_t
prod = svmul_s32_z(svptrue_b32(), a, svrev_s32(a));
314 if (EIGEN_ARM64_SVE_VL >= 2048) {
315 half_prod = svtbl_s32(prod, svindex_u32(32, 1));
316 prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
318 if (EIGEN_ARM64_SVE_VL >= 1024) {
319 half_prod = svtbl_s32(prod, svindex_u32(16, 1));
320 prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
322 if (EIGEN_ARM64_SVE_VL >= 512) {
323 half_prod = svtbl_s32(prod, svindex_u32(8, 1));
324 prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
326 if (EIGEN_ARM64_SVE_VL >= 256) {
327 half_prod = svtbl_s32(prod, svindex_u32(4, 1));
328 prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
331 half_prod = svtbl_s32(prod, svindex_u32(2, 1));
332 prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
341 return svminv_s32(svptrue_b32(), a);
347 return svmaxv_s32(svptrue_b32(), a);
355 PacketXi stride_index = svindex_s32(0,
N);
357 for (i = 0; i <
N; i++) {
358 svst1_scatter_s32index_s32(svptrue_b32(), buffer + i, stride_index, kernel.
packet[i]);
360 for (i = 0; i <
N; i++) {
367 typedef svfloat32_t PacketXf
__attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)));
418 masked_load_available =
false,
419 masked_store_available =
false 426 return svdup_n_f32(from);
432 return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), from));
440 return svadd_f32_z(svptrue_b32(),
pset1<PacketXf>(a), svld1_f32(svptrue_b32(), c));
446 return svadd_f32_z(svptrue_b32(), a,
b);
452 return svsub_f32_z(svptrue_b32(), a,
b);
458 return svneg_f32_z(svptrue_b32(), a);
470 return svmul_f32_z(svptrue_b32(), a,
b);
476 return svdiv_f32_z(svptrue_b32(), a,
b);
482 return svmla_f32_z(svptrue_b32(), c, a, b);
488 return svmin_f32_z(svptrue_b32(), a,
b);
500 return svminnm_f32_z(svptrue_b32(), a,
b);
506 return svmax_f32_z(svptrue_b32(), a,
b);
518 return svmaxnm_f32_z(svptrue_b32(), a,
b);
526 return svreinterpret_f32_u32(svdup_n_u32_z(svcmplt_f32(svptrue_b32(), a,
b), 0xffffffffu));
532 return svreinterpret_f32_u32(svdup_n_u32_z(svcmplt_f32(svptrue_b32(), a,
b), 0xffffffffu));
538 return svreinterpret_f32_u32(svdup_n_u32_z(svcmpeq_f32(svptrue_b32(), a,
b), 0xffffffffu));
547 return svreinterpret_f32_u32(svdup_n_u32_z(svnot_b_z(svptrue_b32(), svcmpge_f32(svptrue_b32(), a,
b)), 0xffffffffu));
553 return svrintm_f32_z(svptrue_b32(), a);
559 return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), 0xffffffffu));
566 return svreinterpret_f32_u32(svand_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(
b)));
572 return svreinterpret_f32_u32(svorr_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(
b)));
578 return svreinterpret_f32_u32(sveor_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(
b)));
584 return svreinterpret_f32_u32(svbic_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(
b)));
602 svuint32_t indices = svindex_u32(0, 1);
603 indices = svzip1_u32(indices, indices);
604 return svld1_gather_u32index_f32(svptrue_b32(), from, indices);
610 svuint32_t indices = svindex_u32(0, 1);
611 indices = svzip1_u32(indices, indices);
612 indices = svzip1_u32(indices, indices);
613 return svld1_gather_u32index_f32(svptrue_b32(), from, indices);
632 svint32_t indices = svindex_s32(0, stride);
633 return svld1_gather_s32index_f32(svptrue_b32(), from, indices);
640 svint32_t indices = svindex_s32(0, stride);
641 svst1_scatter_s32index_f32(svptrue_b32(), to, indices, from);
648 return svlasta_f32(svpfalse_b(), a);
660 return svabs_f32_z(svptrue_b32(), a);
674 return svaddv_f32(svptrue_b32(), a);
684 EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
686 svfloat32_t
prod = svmul_f32_z(svptrue_b32(), a, svrev_f32(a));
687 svfloat32_t half_prod;
690 if (EIGEN_ARM64_SVE_VL >= 2048) {
691 half_prod = svtbl_f32(prod, svindex_u32(32, 1));
692 prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
694 if (EIGEN_ARM64_SVE_VL >= 1024) {
695 half_prod = svtbl_f32(prod, svindex_u32(16, 1));
696 prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
698 if (EIGEN_ARM64_SVE_VL >= 512) {
699 half_prod = svtbl_f32(prod, svindex_u32(8, 1));
700 prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
702 if (EIGEN_ARM64_SVE_VL >= 256) {
703 half_prod = svtbl_f32(prod, svindex_u32(4, 1));
704 prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
707 half_prod = svtbl_f32(prod, svindex_u32(2, 1));
708 prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
717 return svminv_f32(svptrue_b32(), a);
723 return svmaxv_f32(svptrue_b32(), a);
732 PacketXi stride_index = svindex_s32(0,
N);
734 for (i = 0; i <
N; i++) {
735 svst1_scatter_s32index_f32(svptrue_b32(), buffer + i, stride_index, kernel.
packet[i]);
738 for (i = 0; i <
N; i++) {
752 #endif // EIGEN_PACKET_MATH_SVE_H EIGEN_STRONG_INLINE PacketXi psub< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXi pmin< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXf pmin< PropagateNumbers, PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXi pdiv< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXf pmin< PropagateNaN, PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pset1frombits< PacketXf >(numext::uint32_t from)
#define EIGEN_STRONG_INLINE
EIGEN_STRONG_INLINE PacketXf plset< PacketXf >(const float &a)
EIGEN_STRONG_INLINE PacketXf pand< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pdiv< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE numext::int32_t pfirst< PacketXi >(const PacketXi &a)
EIGEN_STRONG_INLINE PacketXi ptrue< PacketXi >(const PacketXi &)
EIGEN_STRONG_INLINE PacketXf pset1< PacketXf >(const float &from)
#define EIGEN_DEBUG_UNALIGNED_LOAD
EIGEN_STRONG_INLINE PacketXf pmax< PropagateNumbers, PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE numext::int32_t predux_min< PacketXi >(const PacketXi &a)
EIGEN_STRONG_INLINE PacketXi padd< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXi por< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXi ploadu< PacketXi >(const numext::int32_t *from)
EIGEN_STRONG_INLINE PacketXf pfrexp< PacketXf >(const PacketXf &a, PacketXf &exponent)
EIGEN_STRONG_INLINE Packet4i parithmetic_shift_right(const Packet4i &a)
svint32_t PacketXi __attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)))
#define EIGEN_DEBUG_ALIGNED_STORE
Namespace containing all symbols from the Eigen library.
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
#define EIGEN_DEBUG_UNALIGNED_STORE
EIGEN_STRONG_INLINE PacketXi pcmp_le< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE float predux_min< PacketXf >(const PacketXf &a)
#define EIGEN_DEBUG_ALIGNED_LOAD
EIGEN_DEVICE_FUNC PacketXf pgather< float, PacketXf >(const float *from, Index stride)
EIGEN_STRONG_INLINE PacketXf pmin< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXi ploadquad< PacketXi >(const numext::int32_t *from)
EIGEN_STRONG_INLINE float pfirst< PacketXf >(const PacketXf &a)
EIGEN_STRONG_INLINE PacketXi plset< PacketXi >(const numext::int32_t &a)
EIGEN_STRONG_INLINE PacketXf ploadu< PacketXf >(const float *from)
EIGEN_STRONG_INLINE numext::int32_t predux< PacketXi >(const PacketXi &a)
EIGEN_STRONG_INLINE PacketXf pandnot< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic(const Packet &a, Packet &exponent)
EIGEN_STRONG_INLINE PacketXf ptrue< PacketXf >(const PacketXf &)
EIGEN_STRONG_INLINE void ptranspose(PacketBlock< Packet2cf, 2 > &kernel)
EIGEN_STRONG_INLINE void pstore< float >(float *to, const Packet4f &from)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
EIGEN_STRONG_INLINE Packet4i plogical_shift_right(const Packet4i &a)
EIGEN_STRONG_INLINE PacketXf pmul< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pcmp_eq< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXi pand< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXf pload< PacketXf >(const float *from)
EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf &a)
EIGEN_STRONG_INLINE PacketXf pfloor< PacketXf >(const PacketXf &a)
EIGEN_STRONG_INLINE PacketXi pload< PacketXi >(const numext::int32_t *from)
EIGEN_STRONG_INLINE numext::int32_t predux_mul< PacketXi >(const PacketXi &a)
EIGEN_STRONG_INLINE Packet4i plogical_shift_left(const Packet4i &a)
EIGEN_STRONG_INLINE PacketXf padd< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE void pstoreu< float >(float *to, const Packet4f &from)
EIGEN_STRONG_INLINE PacketXf pmax< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE numext::int32_t predux_max< PacketXi >(const PacketXi &a)
EIGEN_STRONG_INLINE PacketXi pzero< PacketXi >(const PacketXi &)
#define EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE float predux_max< PacketXf >(const PacketXf &a)
EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf &a)
EIGEN_STRONG_INLINE PacketXi pxor< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXi pmax< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXf ploadquad< PacketXf >(const float *from)
EIGEN_STRONG_INLINE PacketXi pcmp_eq< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXf psub< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pxor< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f &a, const Packet4f &b, const Packet4f &c)
EIGEN_DEVICE_FUNC void pscatter< float, PacketXf >(float *to, const PacketXf &from, Index stride)
EIGEN_STRONG_INLINE float predux_mul< PacketXf >(const PacketXf &a)
EIGEN_STRONG_INLINE PacketXi pmul< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXf ploaddup< PacketXf >(const float *from)
EIGEN_STRONG_INLINE PacketXi pandnot< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE PacketXi pset1< PacketXi >(const numext::int32_t &from)
EIGEN_STRONG_INLINE PacketXi pcmp_lt< PacketXi >(const PacketXi &a, const PacketXi &b)
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_generic(const Packet &a, const Packet &exponent)
EIGEN_STRONG_INLINE PacketXf pmax< PropagateNaN, PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pldexp< PacketXf >(const PacketXf &a, const PacketXf &exponent)
EIGEN_STRONG_INLINE float predux< PacketXf >(const PacketXf &a)
EIGEN_STRONG_INLINE PacketXf por< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE PacketXf pcmp_le< PacketXf >(const PacketXf &a, const PacketXf &b)
EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf &a)
EIGEN_STRONG_INLINE PacketXi ploaddup< PacketXi >(const numext::int32_t *from)
EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f &a)
const Product< Lhs, Rhs > prod(const Lhs &lhs, const Rhs &rhs)
EIGEN_STRONG_INLINE PacketXf pcmp_lt< PacketXf >(const PacketXf &a, const PacketXf &b)