11#ifndef EIGEN_PACKET_MATH_SVE_H
12#define EIGEN_PACKET_MATH_SVE_H
15#include "../../InternalHeaderCheck.h"
19#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
20#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
23#ifndef EIGEN_HAS_SINGLE_INSTRUCTION_MADD
24#define EIGEN_HAS_SINGLE_INSTRUCTION_MADD
27#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 32
29template <
typename Scalar,
int SVEVectorLength>
30struct sve_packet_size_selector {
31 enum { size = SVEVectorLength / (
sizeof(Scalar) * CHAR_BIT) };
39template <
int SVEVectorLength>
40struct sve_packet_alignment_selector {
41 enum { alignment = plain_enum_min(SVEVectorLength / CHAR_BIT,
Aligned128) };
46typedef svint32_t PacketXi __attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)));
49struct packet_traits<numext::int32_t> : default_packet_traits {
50 typedef PacketXi type;
51 typedef PacketXi half;
55 size = sve_packet_size_selector<numext::int32_t, EIGEN_ARM64_SVE_VL>::size,
82struct unpacket_traits<PacketXi> {
83 typedef numext::int32_t type;
84 typedef PacketXi half;
86 size = sve_packet_size_selector<numext::int32_t, EIGEN_ARM64_SVE_VL>::size,
87 alignment = sve_packet_alignment_selector<EIGEN_ARM64_SVE_VL>::alignment,
89 masked_load_available =
false,
90 masked_store_available =
false
95EIGEN_STRONG_INLINE
void prefetch<numext::int32_t>(
const numext::int32_t* addr) {
96 svprfw(svptrue_b32(), addr, SV_PLDL1KEEP);
100EIGEN_STRONG_INLINE PacketXi pset1<PacketXi>(
const numext::int32_t& from) {
101 return svdup_n_s32(from);
105EIGEN_STRONG_INLINE PacketXi plset<PacketXi>(
const numext::int32_t& a) {
106 return svindex_s32(a, 1);
110EIGEN_STRONG_INLINE PacketXi padd<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
111 return svadd_s32_x(svptrue_b32(), a, b);
115EIGEN_STRONG_INLINE PacketXi psub<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
116 return svsub_s32_x(svptrue_b32(), a, b);
120EIGEN_STRONG_INLINE PacketXi pnegate(
const PacketXi& a) {
121 return svneg_s32_x(svptrue_b32(), a);
125EIGEN_STRONG_INLINE PacketXi pmul<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
126 return svmul_s32_x(svptrue_b32(), a, b);
130EIGEN_STRONG_INLINE PacketXi pdiv<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
131 return svdiv_s32_x(svptrue_b32(), a, b);
135EIGEN_STRONG_INLINE PacketXi pmadd(
const PacketXi& a,
const PacketXi& b,
const PacketXi& c) {
136 return svmla_s32_x(svptrue_b32(), c, a, b);
140EIGEN_STRONG_INLINE PacketXi pmin<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
141 return svmin_s32_x(svptrue_b32(), a, b);
145EIGEN_STRONG_INLINE PacketXi pmax<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
146 return svmax_s32_x(svptrue_b32(), a, b);
150EIGEN_STRONG_INLINE PacketXi pcmp_le<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
151 return svdup_n_s32_z(svcmple_s32(svptrue_b32(), a, b), 0xffffffffu);
155EIGEN_STRONG_INLINE PacketXi pcmp_lt<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
156 return svdup_n_s32_z(svcmplt_s32(svptrue_b32(), a, b), 0xffffffffu);
160EIGEN_STRONG_INLINE PacketXi pcmp_eq<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
161 return svdup_n_s32_z(svcmpeq_s32(svptrue_b32(), a, b), 0xffffffffu);
165EIGEN_STRONG_INLINE PacketXi ptrue<PacketXi>(
const PacketXi& ) {
166 return svdup_n_s32_x(svptrue_b32(), 0xffffffffu);
170EIGEN_STRONG_INLINE PacketXi pzero<PacketXi>(
const PacketXi& ) {
171 return svdup_n_s32_x(svptrue_b32(), 0);
175EIGEN_STRONG_INLINE PacketXi pand<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
176 return svand_s32_x(svptrue_b32(), a, b);
180EIGEN_STRONG_INLINE PacketXi por<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
181 return svorr_s32_x(svptrue_b32(), a, b);
185EIGEN_STRONG_INLINE PacketXi pxor<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
186 return sveor_s32_x(svptrue_b32(), a, b);
190EIGEN_STRONG_INLINE PacketXi pandnot<PacketXi>(
const PacketXi& a,
const PacketXi& b) {
191 return svbic_s32_x(svptrue_b32(), a, b);
201EIGEN_STRONG_INLINE PacketXi pselect<PacketXi>(
const PacketXi& mask,
const PacketXi& a,
const PacketXi& b) {
202 return svsel_s32(svcmpne_n_s32(svptrue_b32(), mask, 0), a, b);
206EIGEN_STRONG_INLINE PacketXi parithmetic_shift_right(
const PacketXi& a) {
209 return svasr_n_s32_x(svptrue_b32(), a, N);
213EIGEN_STRONG_INLINE PacketXi plogical_shift_right(
const PacketXi& a) {
214 return svreinterpret_s32_u32(svlsr_n_u32_x(svptrue_b32(), svreinterpret_u32_s32(a), N));
218EIGEN_STRONG_INLINE PacketXi plogical_shift_left(
const PacketXi& a) {
219 return svlsl_n_s32_x(svptrue_b32(), a, N);
223EIGEN_STRONG_INLINE PacketXi pload<PacketXi>(
const numext::int32_t* from) {
224 EIGEN_DEBUG_ALIGNED_LOAD
return svld1_s32(svptrue_b32(), from);
228EIGEN_STRONG_INLINE PacketXi ploadu<PacketXi>(
const numext::int32_t* from) {
229 EIGEN_DEBUG_UNALIGNED_LOAD
return svld1_s32(svptrue_b32(), from);
233EIGEN_STRONG_INLINE PacketXi ploaddup<PacketXi>(
const numext::int32_t* from) {
238 constexpr uint64_t kHalf = uint64_t(packet_traits<numext::int32_t>::size) / 2;
239 svint32_t lo = svld1_s32(svwhilelt_b32(uint64_t(0), kHalf), from);
240 return svzip1_s32(lo, lo);
244EIGEN_STRONG_INLINE PacketXi ploadquad<PacketXi>(
const numext::int32_t* from) {
248 constexpr uint64_t kQuarter = numext::maxi(uint64_t(packet_traits<numext::int32_t>::size) / 4, uint64_t(1));
249 svint32_t lo = svld1_s32(svwhilelt_b32(uint64_t(0), kQuarter), from);
250 lo = svzip1_s32(lo, lo);
251 return svzip1_s32(lo, lo);
255EIGEN_STRONG_INLINE
void pstore<numext::int32_t>(numext::int32_t* to,
const PacketXi& from) {
256 EIGEN_DEBUG_ALIGNED_STORE svst1_s32(svptrue_b32(), to, from);
260EIGEN_STRONG_INLINE
void pstoreu<numext::int32_t>(numext::int32_t* to,
const PacketXi& from) {
261 EIGEN_DEBUG_UNALIGNED_STORE svst1_s32(svptrue_b32(), to, from);
265EIGEN_DEVICE_FUNC
inline PacketXi pgather<numext::int32_t, PacketXi>(
const numext::int32_t* from, Index stride) {
267 svint32_t indices = svindex_s32(0, stride);
268 return svld1_gather_s32index_s32(svptrue_b32(), from, indices);
272EIGEN_DEVICE_FUNC
inline void pscatter<numext::int32_t, PacketXi>(numext::int32_t* to,
const PacketXi& from,
275 svint32_t indices = svindex_s32(0, stride);
276 svst1_scatter_s32index_s32(svptrue_b32(), to, indices, from);
280EIGEN_STRONG_INLINE numext::int32_t pfirst<PacketXi>(
const PacketXi& a) {
282 return svlasta_s32(svpfalse_b(), a);
286EIGEN_STRONG_INLINE PacketXi preverse(
const PacketXi& a) {
291EIGEN_STRONG_INLINE PacketXi pabs(
const PacketXi& a) {
292 return svabs_s32_x(svptrue_b32(), a);
296EIGEN_STRONG_INLINE numext::int32_t predux<PacketXi>(
const PacketXi& a) {
297 return static_cast<numext::int32_t
>(svaddv_s32(svptrue_b32(), a));
301EIGEN_STRONG_INLINE
bool predux_any(
const PacketXi& a) {
302 return svptest_any(svptrue_b32(), svcmpne_n_s32(svptrue_b32(), a, 0));
306EIGEN_STRONG_INLINE numext::int32_t predux_mul<PacketXi>(
const PacketXi& a) {
308 svint32_t prod = svmul_s32_x(svptrue_b32(), a, svrev_s32(a));
312 for (
int n = unpacket_traits<PacketXi>::size; n > 2; n >>= 1)
313 prod = svmul_s32_x(svptrue_b32(), svzip1_s32(prod, prod), svzip2_s32(prod, prod));
316 return pfirst<PacketXi>(prod);
320EIGEN_STRONG_INLINE numext::int32_t predux_min<PacketXi>(
const PacketXi& a) {
321 return svminv_s32(svptrue_b32(), a);
325EIGEN_STRONG_INLINE numext::int32_t predux_max<PacketXi>(
const PacketXi& a) {
326 return svmaxv_s32(svptrue_b32(), a);
330EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<PacketXi, N>& kernel) {
331 EIGEN_STATIC_ASSERT((N & (N - 1)) == 0, EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
332 for (
int stride = N / 2; stride > 0; stride >>= 1) {
333 for (
int block = 0; block < N; block += 2 * stride) {
334 for (
int k = 0; k < stride; ++k) {
335 PacketXi lo = svzip1_s32(kernel.packet[block + k], kernel.packet[block + k + stride]);
336 PacketXi hi = svzip2_s32(kernel.packet[block + k], kernel.packet[block + k + stride]);
337 kernel.packet[block + k] = lo;
338 kernel.packet[block + k + stride] = hi;
346typedef svint64_t PacketXl __attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)));
349struct packet_traits<numext::int64_t> : default_packet_traits {
350 typedef PacketXl type;
351 typedef PacketXl half;
355 size = sve_packet_size_selector<numext::int64_t, EIGEN_ARM64_SVE_VL>::size,
374struct unpacket_traits<PacketXl> {
375 typedef numext::int64_t type;
376 typedef PacketXl half;
378 size = sve_packet_size_selector<numext::int64_t, EIGEN_ARM64_SVE_VL>::size,
379 alignment = sve_packet_alignment_selector<EIGEN_ARM64_SVE_VL>::alignment,
381 masked_load_available =
false,
382 masked_store_available =
false
387EIGEN_STRONG_INLINE
void prefetch<numext::int64_t>(
const numext::int64_t* addr) {
388 svprfd(svptrue_b64(), addr, SV_PLDL1KEEP);
392EIGEN_STRONG_INLINE PacketXl pset1<PacketXl>(
const numext::int64_t& from) {
393 return svdup_n_s64(from);
397EIGEN_STRONG_INLINE PacketXl plset<PacketXl>(
const numext::int64_t& a) {
398 return svindex_s64(a, 1);
402EIGEN_STRONG_INLINE PacketXl padd<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
403 return svadd_s64_x(svptrue_b64(), a, b);
407EIGEN_STRONG_INLINE PacketXl psub<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
408 return svsub_s64_x(svptrue_b64(), a, b);
412EIGEN_STRONG_INLINE PacketXl pnegate(
const PacketXl& a) {
413 return svneg_s64_x(svptrue_b64(), a);
417EIGEN_STRONG_INLINE PacketXl pmul<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
418 return svmul_s64_x(svptrue_b64(), a, b);
422EIGEN_STRONG_INLINE PacketXl pdiv<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
423 return svdiv_s64_x(svptrue_b64(), a, b);
427EIGEN_STRONG_INLINE PacketXl pmadd(
const PacketXl& a,
const PacketXl& b,
const PacketXl& c) {
428 return svmla_s64_x(svptrue_b64(), c, a, b);
432EIGEN_STRONG_INLINE PacketXl pmin<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
433 return svmin_s64_x(svptrue_b64(), a, b);
437EIGEN_STRONG_INLINE PacketXl pmax<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
438 return svmax_s64_x(svptrue_b64(), a, b);
442EIGEN_STRONG_INLINE PacketXl pcmp_le<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
443 return svdup_n_s64_z(svcmple_s64(svptrue_b64(), a, b), numext::int64_t(-1));
447EIGEN_STRONG_INLINE PacketXl pcmp_lt<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
448 return svdup_n_s64_z(svcmplt_s64(svptrue_b64(), a, b), numext::int64_t(-1));
452EIGEN_STRONG_INLINE PacketXl pcmp_eq<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
453 return svdup_n_s64_z(svcmpeq_s64(svptrue_b64(), a, b), numext::int64_t(-1));
457EIGEN_STRONG_INLINE PacketXl ptrue<PacketXl>(
const PacketXl& ) {
458 return svdup_n_s64_x(svptrue_b64(), numext::int64_t(-1));
462EIGEN_STRONG_INLINE PacketXl pzero<PacketXl>(
const PacketXl& ) {
463 return svdup_n_s64_x(svptrue_b64(), 0);
467EIGEN_STRONG_INLINE PacketXl pand<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
468 return svand_s64_x(svptrue_b64(), a, b);
472EIGEN_STRONG_INLINE PacketXl por<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
473 return svorr_s64_x(svptrue_b64(), a, b);
477EIGEN_STRONG_INLINE PacketXl pxor<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
478 return sveor_s64_x(svptrue_b64(), a, b);
482EIGEN_STRONG_INLINE PacketXl pandnot<PacketXl>(
const PacketXl& a,
const PacketXl& b) {
483 return svbic_s64_x(svptrue_b64(), a, b);
488EIGEN_STRONG_INLINE PacketXl pselect<PacketXl>(
const PacketXl& mask,
const PacketXl& a,
const PacketXl& b) {
489 return svsel_s64(svcmpne_n_s64(svptrue_b64(), mask, 0), a, b);
493EIGEN_STRONG_INLINE PacketXl parithmetic_shift_right(PacketXl a) {
495 return svasr_n_s64_x(svptrue_b64(), a, N);
499EIGEN_STRONG_INLINE PacketXl plogical_shift_right(PacketXl a) {
500 return svreinterpret_s64_u64(svlsr_n_u64_x(svptrue_b64(), svreinterpret_u64_s64(a), N));
504EIGEN_STRONG_INLINE PacketXl plogical_shift_left(PacketXl a) {
505 return svlsl_n_s64_x(svptrue_b64(), a, N);
509EIGEN_STRONG_INLINE PacketXl pload<PacketXl>(
const numext::int64_t* from) {
510 EIGEN_DEBUG_ALIGNED_LOAD
return svld1_s64(svptrue_b64(), from);
514EIGEN_STRONG_INLINE PacketXl ploadu<PacketXl>(
const numext::int64_t* from) {
515 EIGEN_DEBUG_UNALIGNED_LOAD
return svld1_s64(svptrue_b64(), from);
519EIGEN_STRONG_INLINE PacketXl ploaddup<PacketXl>(
const numext::int64_t* from) {
524 constexpr uint64_t kHalf = uint64_t(packet_traits<numext::int64_t>::size) / 2;
525 svint64_t lo = svld1_s64(svwhilelt_b64(uint64_t(0), kHalf), from);
526 return svzip1_s64(lo, lo);
530EIGEN_STRONG_INLINE PacketXl ploadquad<PacketXl>(
const numext::int64_t* from) {
534 constexpr uint64_t kQuarter = numext::maxi(uint64_t(packet_traits<numext::int64_t>::size) / 4, uint64_t(1));
535 svint64_t lo = svld1_s64(svwhilelt_b64(uint64_t(0), kQuarter), from);
536 lo = svzip1_s64(lo, lo);
537 return svzip1_s64(lo, lo);
541EIGEN_STRONG_INLINE
void pstore<numext::int64_t>(numext::int64_t* to,
const PacketXl& from) {
542 EIGEN_DEBUG_ALIGNED_STORE svst1_s64(svptrue_b64(), to, from);
546EIGEN_STRONG_INLINE
void pstoreu<numext::int64_t>(numext::int64_t* to,
const PacketXl& from) {
547 EIGEN_DEBUG_UNALIGNED_STORE svst1_s64(svptrue_b64(), to, from);
551EIGEN_DEVICE_FUNC
inline PacketXl pgather<numext::int64_t, PacketXl>(
const numext::int64_t* from, Index stride) {
553 svint64_t indices = svindex_s64(0, stride);
554 return svld1_gather_s64index_s64(svptrue_b64(), from, indices);
558EIGEN_DEVICE_FUNC
inline void pscatter<numext::int64_t, PacketXl>(numext::int64_t* to,
const PacketXl& from,
561 svint64_t indices = svindex_s64(0, stride);
562 svst1_scatter_s64index_s64(svptrue_b64(), to, indices, from);
566EIGEN_STRONG_INLINE numext::int64_t pfirst<PacketXl>(
const PacketXl& a) {
568 return svlasta_s64(svpfalse_b(), a);
572EIGEN_STRONG_INLINE PacketXl preverse(
const PacketXl& a) {
577EIGEN_STRONG_INLINE PacketXl pabs(
const PacketXl& a) {
578 return svabs_s64_x(svptrue_b64(), a);
582EIGEN_STRONG_INLINE numext::int64_t predux<PacketXl>(
const PacketXl& a) {
583 return static_cast<numext::int64_t
>(svaddv_s64(svptrue_b64(), a));
587EIGEN_STRONG_INLINE numext::int64_t predux_mul<PacketXl>(
const PacketXl& a) {
592 PacketXl prod = svmul_s64_x(svptrue_b64(), a, svrev_s64(a));
594 for (
int n = unpacket_traits<PacketXl>::size; n > 2; n >>= 1) {
595 prod = svmul_s64_x(svptrue_b64(), svzip1_s64(prod, prod), svzip2_s64(prod, prod));
597 return pfirst<PacketXl>(prod);
601EIGEN_STRONG_INLINE numext::int64_t predux_min<PacketXl>(
const PacketXl& a) {
602 return svminv_s64(svptrue_b64(), a);
606EIGEN_STRONG_INLINE numext::int64_t predux_max<PacketXl>(
const PacketXl& a) {
607 return svmaxv_s64(svptrue_b64(), a);
611EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<PacketXl, N>& kernel) {
612 EIGEN_STATIC_ASSERT((N & (N - 1)) == 0, EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
613 for (
int stride = N / 2; stride > 0; stride >>= 1) {
614 for (
int block = 0; block < N; block += 2 * stride) {
615 for (
int k = 0; k < stride; ++k) {
616 PacketXl lo = svzip1_s64(kernel.packet[block + k], kernel.packet[block + k + stride]);
617 PacketXl hi = svzip2_s64(kernel.packet[block + k], kernel.packet[block + k + stride]);
618 kernel.packet[block + k] = lo;
619 kernel.packet[block + k + stride] = hi;
628typedef svfloat32_t PacketXf __attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)));
631struct packet_traits<float> : default_packet_traits {
632 typedef PacketXf type;
633 typedef PacketXf half;
638 size = sve_packet_size_selector<float, EIGEN_ARM64_SVE_VL>::size,
657 HasSin = EIGEN_FAST_MATH,
658 HasCos = EIGEN_FAST_MATH,
659 HasTan = EIGEN_FAST_MATH,
672 HasTanh = EIGEN_FAST_MATH,
673 HasErf = EIGEN_FAST_MATH,
674 HasErfc = EIGEN_FAST_MATH
679struct unpacket_traits<PacketXf> {
681 typedef PacketXf half;
682 typedef PacketXi integer_packet;
685 size = sve_packet_size_selector<float, EIGEN_ARM64_SVE_VL>::size,
686 alignment = sve_packet_alignment_selector<EIGEN_ARM64_SVE_VL>::alignment,
688 masked_load_available =
false,
689 masked_store_available =
false
694EIGEN_STRONG_INLINE PacketXf pset1<PacketXf>(
const float& from) {
695 return svdup_n_f32(from);
699EIGEN_STRONG_INLINE PacketXf pset1frombits<PacketXf>(numext::uint32_t from) {
700 return svreinterpret_f32_u32(svdup_n_u32_x(svptrue_b32(), from));
704EIGEN_STRONG_INLINE PacketXf plset<PacketXf>(
const float& a) {
706 return svadd_f32_x(svptrue_b32(), pset1<PacketXf>(a), svcvt_f32_s32_x(svptrue_b32(), svindex_s32(0, 1)));
710EIGEN_STRONG_INLINE PacketXf padd<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
711 return svadd_f32_x(svptrue_b32(), a, b);
715EIGEN_STRONG_INLINE PacketXf psub<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
716 return svsub_f32_x(svptrue_b32(), a, b);
720EIGEN_STRONG_INLINE PacketXf pnegate(
const PacketXf& a) {
721 return svneg_f32_x(svptrue_b32(), a);
725EIGEN_STRONG_INLINE PacketXf pmul<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
726 return svmul_f32_x(svptrue_b32(), a, b);
730EIGEN_STRONG_INLINE PacketXf pdiv<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
731 return svdiv_f32_x(svptrue_b32(), a, b);
735EIGEN_STRONG_INLINE PacketXf pmadd(
const PacketXf& a,
const PacketXf& b,
const PacketXf& c) {
736 return svmla_f32_x(svptrue_b32(), c, a, b);
740EIGEN_STRONG_INLINE PacketXf pmsub(
const PacketXf& a,
const PacketXf& b,
const PacketXf& c) {
741 return svmla_f32_x(svptrue_b32(), svneg_f32_x(svptrue_b32(), c), a, b);
745struct pminmax_propagates_nan<PacketXf> : bool_constant<true> {};
748EIGEN_STRONG_INLINE PacketXf pmin<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
749 return svmin_f32_x(svptrue_b32(), a, b);
753EIGEN_STRONG_INLINE PacketXf pmin<PropagateNumbers, PacketXf>(
const PacketXf& a,
const PacketXf& b) {
754 return svminnm_f32_x(svptrue_b32(), a, b);
758EIGEN_STRONG_INLINE PacketXf pmax<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
759 return svmax_f32_x(svptrue_b32(), a, b);
763EIGEN_STRONG_INLINE PacketXf pmax<PropagateNumbers, PacketXf>(
const PacketXf& a,
const PacketXf& b) {
764 return svmaxnm_f32_x(svptrue_b32(), a, b);
770EIGEN_STRONG_INLINE PacketXf pcmp_le<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
771 return svreinterpret_f32_u32(svdup_n_u32_z(svcmple_f32(svptrue_b32(), a, b), 0xffffffffu));
775EIGEN_STRONG_INLINE PacketXf pcmp_lt<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
776 return svreinterpret_f32_u32(svdup_n_u32_z(svcmplt_f32(svptrue_b32(), a, b), 0xffffffffu));
780EIGEN_STRONG_INLINE PacketXf pcmp_eq<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
781 return svreinterpret_f32_u32(svdup_n_u32_z(svcmpeq_f32(svptrue_b32(), a, b), 0xffffffffu));
788EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
789 return svreinterpret_f32_u32(svdup_n_u32_z(svnot_b_z(svptrue_b32(), svcmpge_f32(svptrue_b32(), a, b)), 0xffffffffu));
793EIGEN_STRONG_INLINE PacketXf pfloor<PacketXf>(
const PacketXf& a) {
794 return svrintm_f32_x(svptrue_b32(), a);
797EIGEN_STRONG_INLINE PacketXf pceil<PacketXf>(
const PacketXf& a) {
798 return svrintp_f32_x(svptrue_b32(), a);
801EIGEN_STRONG_INLINE PacketXf print<PacketXf>(
const PacketXf& a) {
802 return svrintn_f32_x(svptrue_b32(), a);
805EIGEN_STRONG_INLINE PacketXf ptrunc<PacketXf>(
const PacketXf& a) {
806 return svrintz_f32_x(svptrue_b32(), a);
809EIGEN_STRONG_INLINE PacketXf pround<PacketXf>(
const PacketXf& a) {
810 return svrinta_f32_x(svptrue_b32(), a);
814EIGEN_STRONG_INLINE PacketXf ptrue<PacketXf>(
const PacketXf& ) {
815 PacketXf r = svreinterpret_f32_u32(svdup_n_u32_x(svptrue_b32(), 0xffffffffu));
816 EIGEN_FAST_MATH_CONSTANT_BARRIER(r);
822EIGEN_STRONG_INLINE PacketXf pand<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
823 return svreinterpret_f32_u32(svand_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
827EIGEN_STRONG_INLINE PacketXf por<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
828 return svreinterpret_f32_u32(svorr_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
832EIGEN_STRONG_INLINE PacketXf pxor<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
833 return svreinterpret_f32_u32(sveor_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
837EIGEN_STRONG_INLINE PacketXf pandnot<PacketXf>(
const PacketXf& a,
const PacketXf& b) {
838 return svreinterpret_f32_u32(svbic_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
843EIGEN_STRONG_INLINE PacketXf pselect<PacketXf>(
const PacketXf& mask,
const PacketXf& a,
const PacketXf& b) {
844 return svsel_f32(svcmpne_n_s32(svptrue_b32(), svreinterpret_s32_f32(mask), 0), a, b);
848EIGEN_STRONG_INLINE PacketXf pload<PacketXf>(
const float* from) {
849 EIGEN_DEBUG_ALIGNED_LOAD
return svld1_f32(svptrue_b32(), from);
853EIGEN_STRONG_INLINE PacketXf ploadu<PacketXf>(
const float* from) {
854 EIGEN_DEBUG_UNALIGNED_LOAD
return svld1_f32(svptrue_b32(), from);
858EIGEN_STRONG_INLINE PacketXf ploaddup<PacketXf>(
const float* from) {
863 constexpr uint64_t kHalf = uint64_t(packet_traits<float>::size) / 2;
864 svfloat32_t lo = svld1_f32(svwhilelt_b32(uint64_t(0), kHalf), from);
865 return svzip1_f32(lo, lo);
869EIGEN_STRONG_INLINE PacketXf ploadquad<PacketXf>(
const float* from) {
873 constexpr uint64_t kQuarter = numext::maxi(uint64_t(packet_traits<float>::size) / 4, uint64_t(1));
874 svfloat32_t lo = svld1_f32(svwhilelt_b32(uint64_t(0), kQuarter), from);
875 lo = svzip1_f32(lo, lo);
876 return svzip1_f32(lo, lo);
880EIGEN_STRONG_INLINE
void pstore<float>(
float* to,
const PacketXf& from) {
881 EIGEN_DEBUG_ALIGNED_STORE svst1_f32(svptrue_b32(), to, from);
885EIGEN_STRONG_INLINE
void pstoreu<float>(
float* to,
const PacketXf& from) {
886 EIGEN_DEBUG_UNALIGNED_STORE svst1_f32(svptrue_b32(), to, from);
890EIGEN_DEVICE_FUNC
inline PacketXf pgather<float, PacketXf>(
const float* from, Index stride) {
892 svint32_t indices = svindex_s32(0, stride);
893 return svld1_gather_s32index_f32(svptrue_b32(), from, indices);
897EIGEN_DEVICE_FUNC
inline void pscatter<float, PacketXf>(
float* to,
const PacketXf& from, Index stride) {
899 svint32_t indices = svindex_s32(0, stride);
900 svst1_scatter_s32index_f32(svptrue_b32(), to, indices, from);
904EIGEN_STRONG_INLINE
float pfirst<PacketXf>(
const PacketXf& a) {
906 return svlasta_f32(svpfalse_b(), a);
910EIGEN_STRONG_INLINE PacketXf preverse(
const PacketXf& a) {
915EIGEN_STRONG_INLINE PacketXf pabs(
const PacketXf& a) {
916 return svabs_f32_x(svptrue_b32(), a);
922EIGEN_STRONG_INLINE PacketXf pfrexp<PacketXf>(
const PacketXf& a, PacketXf& exponent) {
923 return pfrexp_generic(a, exponent);
927EIGEN_STRONG_INLINE
float predux<PacketXf>(
const PacketXf& a) {
928 return svaddv_f32(svptrue_b32(), a);
932EIGEN_STRONG_INLINE
bool predux_any(
const PacketXf& a) {
933 const svuint32_t bits = svreinterpret_u32_f32(a);
934 return svptest_any(svptrue_b32(), svcmpne_n_u32(svptrue_b32(), bits, 0));
938EIGEN_STRONG_INLINE
bool predux_all(
const PacketXf& a) {
939 const svbool_t all = svptrue_b32();
940 return !svptest_any(all, svcmpeq_n_f32(all, a, 0.0f));
944EIGEN_STRONG_INLINE Index predux_count(
const PacketXf& a) {
945 const svbool_t all = svptrue_b32();
946 return static_cast<Index
>(svcntp_b32(all, svcmpne_n_f32(all, a, 0.0f)));
952EIGEN_STRONG_INLINE
float predux_mul<PacketXf>(
const PacketXf& a) {
954 svfloat32_t prod = svmul_f32_x(svptrue_b32(), a, svrev_f32(a));
958 for (
int n = unpacket_traits<PacketXf>::size; n > 2; n >>= 1)
959 prod = svmul_f32_x(svptrue_b32(), svzip1_f32(prod, prod), svzip2_f32(prod, prod));
962 return pfirst<PacketXf>(prod);
966EIGEN_STRONG_INLINE
float predux_min<PacketXf>(
const PacketXf& a) {
967 return svminv_f32(svptrue_b32(), a);
971EIGEN_STRONG_INLINE
float predux_max<PacketXf>(
const PacketXf& a) {
972 return svmaxv_f32(svptrue_b32(), a);
976EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<PacketXf, N>& kernel) {
977 EIGEN_STATIC_ASSERT((N & (N - 1)) == 0, EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
978 for (
int stride = N / 2; stride > 0; stride >>= 1) {
979 for (
int block = 0; block < N; block += 2 * stride) {
980 for (
int k = 0; k < stride; ++k) {
981 PacketXf lo = svzip1_f32(kernel.packet[block + k], kernel.packet[block + k + stride]);
982 PacketXf hi = svzip2_f32(kernel.packet[block + k], kernel.packet[block + k + stride]);
983 kernel.packet[block + k] = lo;
984 kernel.packet[block + k + stride] = hi;
991EIGEN_STRONG_INLINE PacketXf pldexp<PacketXf>(
const PacketXf& a,
const PacketXf& exponent) {
993 return svscale_f32_x(svptrue_b32(), a, svcvt_s32_f32_x(svptrue_b32(), exponent));
997EIGEN_STRONG_INLINE PacketXf psqrt<PacketXf>(
const PacketXf& a) {
998 return svsqrt_f32_x(svptrue_b32(), a);
1006typedef svfloat64_t PacketXd __attribute__((arm_sve_vector_bits(EIGEN_ARM64_SVE_VL)));
1009struct packet_traits<double> : default_packet_traits {
1010 typedef PacketXd type;
1011 typedef PacketXd half;
1015 AlignedOnScalar = 1,
1016 size = sve_packet_size_selector<double, EIGEN_ARM64_SVE_VL>::size,
1038 HasSin = EIGEN_FAST_MATH,
1039 HasCos = EIGEN_FAST_MATH,
1040 HasTan = EIGEN_FAST_MATH,
1049 HasTanh = EIGEN_FAST_MATH
1054struct unpacket_traits<PacketXd> {
1055 typedef double type;
1056 typedef PacketXd half;
1057 typedef PacketXl integer_packet;
1060 size = sve_packet_size_selector<double, EIGEN_ARM64_SVE_VL>::size,
1061 alignment = sve_packet_alignment_selector<EIGEN_ARM64_SVE_VL>::alignment,
1062 vectorizable =
true,
1063 masked_load_available =
false,
1064 masked_store_available =
false
1069EIGEN_STRONG_INLINE
void prefetch<double>(
const double* addr) {
1070 svprfd(svptrue_b64(), addr, SV_PLDL1KEEP);
1074EIGEN_STRONG_INLINE PacketXd pset1<PacketXd>(
const double& from) {
1075 return svdup_n_f64(from);
1079EIGEN_STRONG_INLINE PacketXd pset1frombits<PacketXd>(numext::uint64_t from) {
1080 return svreinterpret_f64_u64(svdup_n_u64_x(svptrue_b64(), from));
1084EIGEN_STRONG_INLINE PacketXd plset<PacketXd>(
const double& a) {
1087 return svadd_f64_x(svptrue_b64(), pset1<PacketXd>(a), svcvt_f64_s64_x(svptrue_b64(), svindex_s64(0, 1)));
1091EIGEN_STRONG_INLINE PacketXd padd<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1092 return svadd_f64_x(svptrue_b64(), a, b);
1096EIGEN_STRONG_INLINE PacketXd psub<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1097 return svsub_f64_x(svptrue_b64(), a, b);
1101EIGEN_STRONG_INLINE PacketXd pnegate(
const PacketXd& a) {
1102 return svneg_f64_x(svptrue_b64(), a);
1106EIGEN_STRONG_INLINE PacketXd pmul<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1107 return svmul_f64_x(svptrue_b64(), a, b);
1111EIGEN_STRONG_INLINE PacketXd pdiv<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1112 return svdiv_f64_x(svptrue_b64(), a, b);
1116EIGEN_STRONG_INLINE PacketXd pmadd(
const PacketXd& a,
const PacketXd& b,
const PacketXd& c) {
1117 return svmla_f64_x(svptrue_b64(), c, a, b);
1121EIGEN_STRONG_INLINE PacketXd pmsub(
const PacketXd& a,
const PacketXd& b,
const PacketXd& c) {
1122 return svmla_f64_x(svptrue_b64(), svneg_f64_x(svptrue_b64(), c), a, b);
1126struct pminmax_propagates_nan<PacketXd> : bool_constant<true> {};
1129EIGEN_STRONG_INLINE PacketXd pmin<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1130 return svmin_f64_x(svptrue_b64(), a, b);
1134EIGEN_STRONG_INLINE PacketXd pmin<PropagateNumbers, PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1135 return svminnm_f64_x(svptrue_b64(), a, b);
1139EIGEN_STRONG_INLINE PacketXd pmax<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1140 return svmax_f64_x(svptrue_b64(), a, b);
1144EIGEN_STRONG_INLINE PacketXd pmax<PropagateNumbers, PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1145 return svmaxnm_f64_x(svptrue_b64(), a, b);
1151EIGEN_STRONG_INLINE PacketXd pcmp_le<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1152 return svreinterpret_f64_u64(svdup_n_u64_z(svcmple_f64(svptrue_b64(), a, b), 0xffffffffffffffffull));
1156EIGEN_STRONG_INLINE PacketXd pcmp_lt<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1157 return svreinterpret_f64_u64(svdup_n_u64_z(svcmplt_f64(svptrue_b64(), a, b), 0xffffffffffffffffull));
1161EIGEN_STRONG_INLINE PacketXd pcmp_eq<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1162 return svreinterpret_f64_u64(svdup_n_u64_z(svcmpeq_f64(svptrue_b64(), a, b), 0xffffffffffffffffull));
1166EIGEN_STRONG_INLINE PacketXd pcmp_lt_or_nan<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1167 return svreinterpret_f64_u64(
1168 svdup_n_u64_z(svnot_b_z(svptrue_b64(), svcmpge_f64(svptrue_b64(), a, b)), 0xffffffffffffffffull));
1172EIGEN_STRONG_INLINE PacketXd pfloor<PacketXd>(
const PacketXd& a) {
1173 return svrintm_f64_x(svptrue_b64(), a);
1176EIGEN_STRONG_INLINE PacketXd pceil<PacketXd>(
const PacketXd& a) {
1177 return svrintp_f64_x(svptrue_b64(), a);
1180EIGEN_STRONG_INLINE PacketXd print<PacketXd>(
const PacketXd& a) {
1181 return svrintn_f64_x(svptrue_b64(), a);
1184EIGEN_STRONG_INLINE PacketXd ptrunc<PacketXd>(
const PacketXd& a) {
1185 return svrintz_f64_x(svptrue_b64(), a);
1188EIGEN_STRONG_INLINE PacketXd pround<PacketXd>(
const PacketXd& a) {
1189 return svrinta_f64_x(svptrue_b64(), a);
1193EIGEN_STRONG_INLINE PacketXd ptrue<PacketXd>(
const PacketXd& ) {
1194 PacketXd r = svreinterpret_f64_u64(svdup_n_u64_x(svptrue_b64(), 0xffffffffffffffffull));
1195 EIGEN_FAST_MATH_CONSTANT_BARRIER(r);
1201EIGEN_STRONG_INLINE PacketXd pand<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1202 return svreinterpret_f64_u64(svand_u64_x(svptrue_b64(), svreinterpret_u64_f64(a), svreinterpret_u64_f64(b)));
1206EIGEN_STRONG_INLINE PacketXd por<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1207 return svreinterpret_f64_u64(svorr_u64_x(svptrue_b64(), svreinterpret_u64_f64(a), svreinterpret_u64_f64(b)));
1211EIGEN_STRONG_INLINE PacketXd pxor<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1212 return svreinterpret_f64_u64(sveor_u64_x(svptrue_b64(), svreinterpret_u64_f64(a), svreinterpret_u64_f64(b)));
1216EIGEN_STRONG_INLINE PacketXd pandnot<PacketXd>(
const PacketXd& a,
const PacketXd& b) {
1217 return svreinterpret_f64_u64(svbic_u64_x(svptrue_b64(), svreinterpret_u64_f64(a), svreinterpret_u64_f64(b)));
1222EIGEN_STRONG_INLINE PacketXd pselect<PacketXd>(
const PacketXd& mask,
const PacketXd& a,
const PacketXd& b) {
1223 return svsel_f64(svcmpne_n_s64(svptrue_b64(), svreinterpret_s64_f64(mask), 0), a, b);
1227EIGEN_STRONG_INLINE PacketXd pload<PacketXd>(
const double* from) {
1228 EIGEN_DEBUG_ALIGNED_LOAD
return svld1_f64(svptrue_b64(), from);
1232EIGEN_STRONG_INLINE PacketXd ploadu<PacketXd>(
const double* from) {
1233 EIGEN_DEBUG_UNALIGNED_LOAD
return svld1_f64(svptrue_b64(), from);
1237EIGEN_STRONG_INLINE PacketXd ploaddup<PacketXd>(
const double* from) {
1242 constexpr uint64_t kHalf = uint64_t(packet_traits<double>::size) / 2;
1243 svfloat64_t lo = svld1_f64(svwhilelt_b64(uint64_t(0), kHalf), from);
1244 return svzip1_f64(lo, lo);
1248EIGEN_STRONG_INLINE PacketXd ploadquad<PacketXd>(
const double* from) {
1252 constexpr uint64_t kQuarter = numext::maxi(uint64_t(packet_traits<double>::size) / 4, uint64_t(1));
1253 svfloat64_t lo = svld1_f64(svwhilelt_b64(uint64_t(0), kQuarter), from);
1254 lo = svzip1_f64(lo, lo);
1255 return svzip1_f64(lo, lo);
1259EIGEN_STRONG_INLINE
void pstore<double>(
double* to,
const PacketXd& from) {
1260 EIGEN_DEBUG_ALIGNED_STORE svst1_f64(svptrue_b64(), to, from);
1264EIGEN_STRONG_INLINE
void pstoreu<double>(
double* to,
const PacketXd& from) {
1265 EIGEN_DEBUG_UNALIGNED_STORE svst1_f64(svptrue_b64(), to, from);
1269EIGEN_DEVICE_FUNC
inline PacketXd pgather<double, PacketXd>(
const double* from, Index stride) {
1271 svint64_t indices = svindex_s64(0, stride);
1272 return svld1_gather_s64index_f64(svptrue_b64(), from, indices);
1276EIGEN_DEVICE_FUNC
inline void pscatter<double, PacketXd>(
double* to,
const PacketXd& from, Index stride) {
1278 svint64_t indices = svindex_s64(0, stride);
1279 svst1_scatter_s64index_f64(svptrue_b64(), to, indices, from);
1283EIGEN_STRONG_INLINE
double pfirst<PacketXd>(
const PacketXd& a) {
1285 return svlasta_f64(svpfalse_b(), a);
1289EIGEN_STRONG_INLINE PacketXd preverse(
const PacketXd& a) {
1290 return svrev_f64(a);
1294EIGEN_STRONG_INLINE PacketXd pabs(
const PacketXd& a) {
1295 return svabs_f64_x(svptrue_b64(), a);
1299EIGEN_STRONG_INLINE
double predux<PacketXd>(
const PacketXd& a) {
1300 return svaddv_f64(svptrue_b64(), a);
1304EIGEN_STRONG_INLINE
bool predux_any(
const PacketXd& a) {
1305 const svuint64_t bits = svreinterpret_u64_f64(a);
1306 return svptest_any(svptrue_b64(), svcmpne_n_u64(svptrue_b64(), bits, 0));
1310EIGEN_STRONG_INLINE
bool predux_all(
const PacketXd& a) {
1311 const svbool_t all = svptrue_b64();
1312 return !svptest_any(all, svcmpeq_n_f64(all, a, 0.0));
1316EIGEN_STRONG_INLINE Index predux_count(
const PacketXd& a) {
1317 const svbool_t all = svptrue_b64();
1318 return static_cast<Index
>(svcntp_b64(all, svcmpne_n_f64(all, a, 0.0)));
1322EIGEN_STRONG_INLINE
double predux_mul<PacketXd>(
const PacketXd& a) {
1324 svfloat64_t prod = svmul_f64_x(svptrue_b64(), a, svrev_f64(a));
1328 for (
int n = unpacket_traits<PacketXd>::size; n > 2; n >>= 1)
1329 prod = svmul_f64_x(svptrue_b64(), svzip1_f64(prod, prod), svzip2_f64(prod, prod));
1332 return pfirst<PacketXd>(prod);
1336EIGEN_STRONG_INLINE
double predux_min<PacketXd>(
const PacketXd& a) {
1337 return svminv_f64(svptrue_b64(), a);
1341EIGEN_STRONG_INLINE
double predux_max<PacketXd>(
const PacketXd& a) {
1342 return svmaxv_f64(svptrue_b64(), a);
1346EIGEN_DEVICE_FUNC
inline void ptranspose(PacketBlock<PacketXd, N>& kernel) {
1347 EIGEN_STATIC_ASSERT((N & (N - 1)) == 0, EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
1348 for (
int stride = N / 2; stride > 0; stride >>= 1) {
1349 for (
int block = 0; block < N; block += 2 * stride) {
1350 for (
int k = 0; k < stride; ++k) {
1351 PacketXd lo = svzip1_f64(kernel.packet[block + k], kernel.packet[block + k + stride]);
1352 PacketXd hi = svzip2_f64(kernel.packet[block + k], kernel.packet[block + k + stride]);
1353 kernel.packet[block + k] = lo;
1354 kernel.packet[block + k + stride] = hi;
1361EIGEN_STRONG_INLINE PacketXd pfrexp<PacketXd>(
const PacketXd& a, PacketXd& exponent) {
1362 return pfrexp_generic(a, exponent);
1366EIGEN_STRONG_INLINE PacketXd pldexp<PacketXd>(
const PacketXd& a,
const PacketXd& exponent) {
1367 return svscale_f64_x(svptrue_b64(), a, svcvt_s64_f64_x(svptrue_b64(), exponent));
1371EIGEN_STRONG_INLINE PacketXd psqrt<PacketXd>(
const PacketXd& a) {
1372 return svsqrt_f64_x(svptrue_b64(), a);
1376EIGEN_STRONG_INLINE PacketXd prsqrt<PacketXd>(
const PacketXd& a) {
1380 return generic_rsqrt_newton_step<PacketXd, 3>::run(a, svrsqrte_f64(a));
1387EIGEN_STRONG_INLINE svbool_t sve_segment_predicate_b32(Index begin, Index count) {
1388 eigen_assert(begin >= 0 && count >= 0);
1389 if (begin == 0)
return svwhilelt_b32(uint64_t(0), uint64_t(count));
1390 return svnot_b_z(svwhilelt_b32(uint64_t(0), uint64_t(begin + count)), svwhilelt_b32(uint64_t(0), uint64_t(begin)));
1393EIGEN_STRONG_INLINE svbool_t sve_segment_predicate_b64(Index begin, Index count) {
1394 eigen_assert(begin >= 0 && count >= 0);
1395 if (begin == 0)
return svwhilelt_b64(uint64_t(0), uint64_t(count));
1396 return svnot_b_z(svwhilelt_b64(uint64_t(0), uint64_t(begin + count)), svwhilelt_b64(uint64_t(0), uint64_t(begin)));
1402struct has_packet_segment<PacketXi> : std::true_type {};
1405inline PacketXi ploaduSegment<PacketXi>(
const numext::int32_t* from, Index begin, Index count) {
1406 return svld1_s32(sve_segment_predicate_b32(begin, count), from);
1410inline void pstoreuSegment<numext::int32_t, PacketXi>(numext::int32_t* to,
const PacketXi& from, Index begin,
1412 svst1_s32(sve_segment_predicate_b32(begin, count), to, from);
1418struct has_packet_segment<PacketXl> : std::true_type {};
1421inline PacketXl ploaduSegment<PacketXl>(
const numext::int64_t* from, Index begin, Index count) {
1422 return svld1_s64(sve_segment_predicate_b64(begin, count), from);
1426inline void pstoreuSegment<numext::int64_t, PacketXl>(numext::int64_t* to,
const PacketXl& from, Index begin,
1428 svst1_s64(sve_segment_predicate_b64(begin, count), to, from);
1434struct has_packet_segment<PacketXf> : std::true_type {};
1437inline PacketXf ploaduSegment<PacketXf>(
const float* from, Index begin, Index count) {
1438 return svld1_f32(sve_segment_predicate_b32(begin, count), from);
1442inline void pstoreuSegment<float, PacketXf>(
float* to,
const PacketXf& from, Index begin, Index count) {
1443 svst1_f32(sve_segment_predicate_b32(begin, count), to, from);
1449struct has_packet_segment<PacketXd> : std::true_type {};
1452inline PacketXd ploaduSegment<PacketXd>(
const double* from, Index begin, Index count) {
1453 return svld1_f64(sve_segment_predicate_b64(begin, count), from);
1457inline void pstoreuSegment<double, PacketXd>(
double* to,
const PacketXd& from, Index begin, Index count) {
1458 svst1_f64(sve_segment_predicate_b64(begin, count), to, from);
@ Aligned128
Definition Constants.h:241