mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Apply clang-format
This commit is contained in:
@@ -13,10 +13,8 @@
|
||||
// IWYU pragma: private
|
||||
#include "../../InternalHeaderCheck.h"
|
||||
|
||||
namespace Eigen
|
||||
{
|
||||
namespace internal
|
||||
{
|
||||
namespace Eigen {
|
||||
namespace internal {
|
||||
#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
|
||||
#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
|
||||
#endif
|
||||
@@ -75,174 +73,146 @@ struct unpacket_traits<PacketXi> {
|
||||
};
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE void prefetch<numext::int32_t>(const numext::int32_t* addr)
|
||||
{
|
||||
EIGEN_STRONG_INLINE void prefetch<numext::int32_t>(const numext::int32_t* addr) {
|
||||
svprfw(svptrue_b32(), addr, SV_PLDL1KEEP);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pset1<PacketXi>(const numext::int32_t& from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pset1<PacketXi>(const numext::int32_t& from) {
|
||||
return svdup_n_s32(from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi plset<PacketXi>(const numext::int32_t& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi plset<PacketXi>(const numext::int32_t& a) {
|
||||
numext::int32_t c[packet_traits<numext::int32_t>::size];
|
||||
for (int i = 0; i < packet_traits<numext::int32_t>::size; i++) c[i] = i;
|
||||
return svadd_s32_z(svptrue_b32(), pset1<PacketXi>(a), svld1_s32(svptrue_b32(), c));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi padd<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi padd<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svadd_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi psub<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi psub<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svsub_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pnegate(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pnegate(const PacketXi& a) {
|
||||
return svneg_s32_z(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pconj(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pconj(const PacketXi& a) {
|
||||
return a;
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pmul<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pmul<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svmul_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pdiv<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pdiv<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svdiv_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pmadd(const PacketXi& a, const PacketXi& b, const PacketXi& c)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pmadd(const PacketXi& a, const PacketXi& b, const PacketXi& c) {
|
||||
return svmla_s32_z(svptrue_b32(), c, a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pmin<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pmin<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svmin_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pmax<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pmax<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svmax_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pcmp_le<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pcmp_le<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svdup_n_s32_z(svcmple_s32(svptrue_b32(), a, b), 0xffffffffu);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pcmp_lt<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pcmp_lt<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svdup_n_s32_z(svcmplt_s32(svptrue_b32(), a, b), 0xffffffffu);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pcmp_eq<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pcmp_eq<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svdup_n_s32_z(svcmpeq_s32(svptrue_b32(), a, b), 0xffffffffu);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi ptrue<PacketXi>(const PacketXi& /*a*/)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi ptrue<PacketXi>(const PacketXi& /*a*/) {
|
||||
return svdup_n_s32_z(svptrue_b32(), 0xffffffffu);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pzero<PacketXi>(const PacketXi& /*a*/)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pzero<PacketXi>(const PacketXi& /*a*/) {
|
||||
return svdup_n_s32_z(svptrue_b32(), 0);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pand<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pand<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svand_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi por<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi por<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svorr_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pxor<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pxor<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return sveor_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pandnot<PacketXi>(const PacketXi& a, const PacketXi& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pandnot<PacketXi>(const PacketXi& a, const PacketXi& b) {
|
||||
return svbic_s32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <int N>
|
||||
EIGEN_STRONG_INLINE PacketXi parithmetic_shift_right(PacketXi a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi parithmetic_shift_right(PacketXi a) {
|
||||
return svasrd_n_s32_z(svptrue_b32(), a, N);
|
||||
}
|
||||
|
||||
template <int N>
|
||||
EIGEN_STRONG_INLINE PacketXi plogical_shift_right(PacketXi a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi plogical_shift_right(PacketXi a) {
|
||||
return svreinterpret_s32_u32(svlsr_n_u32_z(svptrue_b32(), svreinterpret_u32_s32(a), N));
|
||||
}
|
||||
|
||||
template <int N>
|
||||
EIGEN_STRONG_INLINE PacketXi plogical_shift_left(PacketXi a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi plogical_shift_left(PacketXi a) {
|
||||
return svlsl_n_s32_z(svptrue_b32(), a, N);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pload<PacketXi>(const numext::int32_t* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pload<PacketXi>(const numext::int32_t* from) {
|
||||
EIGEN_DEBUG_ALIGNED_LOAD return svld1_s32(svptrue_b32(), from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi ploadu<PacketXi>(const numext::int32_t* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi ploadu<PacketXi>(const numext::int32_t* from) {
|
||||
EIGEN_DEBUG_UNALIGNED_LOAD return svld1_s32(svptrue_b32(), from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi ploaddup<PacketXi>(const numext::int32_t* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi ploaddup<PacketXi>(const numext::int32_t* from) {
|
||||
svuint32_t indices = svindex_u32(0, 1); // index {base=0, base+step=1, base+step*2, ...}
|
||||
indices = svzip1_u32(indices, indices); // index in the format {a0, a0, a1, a1, a2, a2, ...}
|
||||
return svld1_gather_u32index_s32(svptrue_b32(), from, indices);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi ploadquad<PacketXi>(const numext::int32_t* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi ploadquad<PacketXi>(const numext::int32_t* from) {
|
||||
svuint32_t indices = svindex_u32(0, 1); // index {base=0, base+step=1, base+step*2, ...}
|
||||
indices = svzip1_u32(indices, indices); // index in the format {a0, a0, a1, a1, a2, a2, ...}
|
||||
indices = svzip1_u32(indices, indices); // index in the format {a0, a0, a0, a0, a1, a1, a1, a1, ...}
|
||||
@@ -250,63 +220,54 @@ EIGEN_STRONG_INLINE PacketXi ploadquad<PacketXi>(const numext::int32_t* from)
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE void pstore<numext::int32_t>(numext::int32_t* to, const PacketXi& from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE void pstore<numext::int32_t>(numext::int32_t* to, const PacketXi& from) {
|
||||
EIGEN_DEBUG_ALIGNED_STORE svst1_s32(svptrue_b32(), to, from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE void pstoreu<numext::int32_t>(numext::int32_t* to, const PacketXi& from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE void pstoreu<numext::int32_t>(numext::int32_t* to, const PacketXi& from) {
|
||||
EIGEN_DEBUG_UNALIGNED_STORE svst1_s32(svptrue_b32(), to, from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_DEVICE_FUNC inline PacketXi pgather<numext::int32_t, PacketXi>(const numext::int32_t* from, Index stride)
|
||||
{
|
||||
EIGEN_DEVICE_FUNC inline PacketXi pgather<numext::int32_t, PacketXi>(const numext::int32_t* from, Index stride) {
|
||||
// Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
|
||||
svint32_t indices = svindex_s32(0, stride);
|
||||
return svld1_gather_s32index_s32(svptrue_b32(), from, indices);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_DEVICE_FUNC inline void pscatter<numext::int32_t, PacketXi>(numext::int32_t* to, const PacketXi& from, Index stride)
|
||||
{
|
||||
EIGEN_DEVICE_FUNC inline void pscatter<numext::int32_t, PacketXi>(numext::int32_t* to, const PacketXi& from,
|
||||
Index stride) {
|
||||
// Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
|
||||
svint32_t indices = svindex_s32(0, stride);
|
||||
svst1_scatter_s32index_s32(svptrue_b32(), to, indices, from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE numext::int32_t pfirst<PacketXi>(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE numext::int32_t pfirst<PacketXi>(const PacketXi& a) {
|
||||
// svlasta returns the first element if all predicate bits are 0
|
||||
return svlasta_s32(svpfalse_b(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi preverse(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi preverse(const PacketXi& a) {
|
||||
return svrev_s32(a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXi pabs(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXi pabs(const PacketXi& a) {
|
||||
return svabs_s32_z(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux<PacketXi>(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux<PacketXi>(const PacketXi& a) {
|
||||
return static_cast<numext::int32_t>(svaddv_s32(svptrue_b32(), a));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux_mul<PacketXi>(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0),
|
||||
EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux_mul<PacketXi>(const PacketXi& a) {
|
||||
EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0), EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
|
||||
|
||||
// Multiply the vector by its reverse
|
||||
svint32_t prod = svmul_s32_z(svptrue_b32(), a, svrev_s32(a));
|
||||
@@ -338,14 +299,12 @@ EIGEN_STRONG_INLINE numext::int32_t predux_mul<PacketXi>(const PacketXi& a)
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux_min<PacketXi>(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux_min<PacketXi>(const PacketXi& a) {
|
||||
return svminv_s32(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux_max<PacketXi>(const PacketXi& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE numext::int32_t predux_max<PacketXi>(const PacketXi& a) {
|
||||
return svmaxv_s32(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
@@ -422,120 +381,101 @@ struct unpacket_traits<PacketXf> {
|
||||
};
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pset1<PacketXf>(const float& from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pset1<PacketXf>(const float& from) {
|
||||
return svdup_n_f32(from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pset1frombits<PacketXf>(numext::uint32_t from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pset1frombits<PacketXf>(numext::uint32_t from) {
|
||||
return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), from));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf plset<PacketXf>(const float& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf plset<PacketXf>(const float& a) {
|
||||
float c[packet_traits<float>::size];
|
||||
for (int i = 0; i < packet_traits<float>::size; i++) c[i] = i;
|
||||
return svadd_f32_z(svptrue_b32(), pset1<PacketXf>(a), svld1_f32(svptrue_b32(), c));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf padd<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf padd<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svadd_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf psub<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf psub<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svsub_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pnegate(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pnegate(const PacketXf& a) {
|
||||
return svneg_f32_z(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pconj(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pconj(const PacketXf& a) {
|
||||
return a;
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmul<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmul<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svmul_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pdiv<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pdiv<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svdiv_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmadd(const PacketXf& a, const PacketXf& b, const PacketXf& c)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmadd(const PacketXf& a, const PacketXf& b, const PacketXf& c) {
|
||||
return svmla_f32_z(svptrue_b32(), c, a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmin<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmin<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svmin_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmin<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmin<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return pmin<PacketXf>(a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmin<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmin<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svminnm_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmax<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmax<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svmax_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmax<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmax<PropagateNaN, PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return pmax<PacketXf>(a, b);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pmax<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pmax<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svmaxnm_f32_z(svptrue_b32(), a, b);
|
||||
}
|
||||
|
||||
// Float comparisons in SVE return svbool (predicate). Use svdup to set active
|
||||
// lanes to 1 (0xffffffffu) and inactive lanes to 0.
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_le<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_le<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svdup_n_u32_z(svcmple_f32(svptrue_b32(), a, b), 0xffffffffu));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_lt<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_lt<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svdup_n_u32_z(svcmplt_f32(svptrue_b32(), a, b), 0xffffffffu));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_eq<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_eq<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svdup_n_u32_z(svcmpeq_f32(svptrue_b32(), a, b), 0xffffffffu));
|
||||
}
|
||||
|
||||
@@ -543,71 +483,60 @@ EIGEN_STRONG_INLINE PacketXf pcmp_eq<PacketXf>(const PacketXf& a, const PacketXf
|
||||
// greater/equal comparison (svcmpge_f32). Then fill a float vector with the
|
||||
// active elements.
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svdup_n_u32_z(svnot_b_z(svptrue_b32(), svcmpge_f32(svptrue_b32(), a, b)), 0xffffffffu));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pfloor<PacketXf>(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pfloor<PacketXf>(const PacketXf& a) {
|
||||
return svrintm_f32_z(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf ptrue<PacketXf>(const PacketXf& /*a*/)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf ptrue<PacketXf>(const PacketXf& /*a*/) {
|
||||
return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), 0xffffffffu));
|
||||
}
|
||||
|
||||
// Logical Operations are not supported for float, so reinterpret casts
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pand<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pand<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svand_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf por<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf por<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svorr_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pxor<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pxor<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(sveor_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pandnot<PacketXf>(const PacketXf& a, const PacketXf& b)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pandnot<PacketXf>(const PacketXf& a, const PacketXf& b) {
|
||||
return svreinterpret_f32_u32(svbic_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pload<PacketXf>(const float* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pload<PacketXf>(const float* from) {
|
||||
EIGEN_DEBUG_ALIGNED_LOAD return svld1_f32(svptrue_b32(), from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf ploadu<PacketXf>(const float* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf ploadu<PacketXf>(const float* from) {
|
||||
EIGEN_DEBUG_UNALIGNED_LOAD return svld1_f32(svptrue_b32(), from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf ploaddup<PacketXf>(const float* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf ploaddup<PacketXf>(const float* from) {
|
||||
svuint32_t indices = svindex_u32(0, 1); // index {base=0, base+step=1, base+step*2, ...}
|
||||
indices = svzip1_u32(indices, indices); // index in the format {a0, a0, a1, a1, a2, a2, ...}
|
||||
return svld1_gather_u32index_f32(svptrue_b32(), from, indices);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf ploadquad<PacketXf>(const float* from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf ploadquad<PacketXf>(const float* from) {
|
||||
svuint32_t indices = svindex_u32(0, 1); // index {base=0, base+step=1, base+step*2, ...}
|
||||
indices = svzip1_u32(indices, indices); // index in the format {a0, a0, a1, a1, a2, a2, ...}
|
||||
indices = svzip1_u32(indices, indices); // index in the format {a0, a0, a0, a0, a1, a1, a1, a1, ...}
|
||||
@@ -615,63 +544,54 @@ EIGEN_STRONG_INLINE PacketXf ploadquad<PacketXf>(const float* from)
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE void pstore<float>(float* to, const PacketXf& from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE void pstore<float>(float* to, const PacketXf& from) {
|
||||
EIGEN_DEBUG_ALIGNED_STORE svst1_f32(svptrue_b32(), to, from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const PacketXf& from)
|
||||
{
|
||||
EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const PacketXf& from) {
|
||||
EIGEN_DEBUG_UNALIGNED_STORE svst1_f32(svptrue_b32(), to, from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_DEVICE_FUNC inline PacketXf pgather<float, PacketXf>(const float* from, Index stride)
|
||||
{
|
||||
EIGEN_DEVICE_FUNC inline PacketXf pgather<float, PacketXf>(const float* from, Index stride) {
|
||||
// Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
|
||||
svint32_t indices = svindex_s32(0, stride);
|
||||
return svld1_gather_s32index_f32(svptrue_b32(), from, indices);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_DEVICE_FUNC inline void pscatter<float, PacketXf>(float* to, const PacketXf& from, Index stride)
|
||||
{
|
||||
EIGEN_DEVICE_FUNC inline void pscatter<float, PacketXf>(float* to, const PacketXf& from, Index stride) {
|
||||
// Indice format: {base=0, base+stride, base+stride*2, base+stride*3, ...}
|
||||
svint32_t indices = svindex_s32(0, stride);
|
||||
svst1_scatter_s32index_f32(svptrue_b32(), to, indices, from);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE float pfirst<PacketXf>(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE float pfirst<PacketXf>(const PacketXf& a) {
|
||||
// svlasta returns the first element if all predicate bits are 0
|
||||
return svlasta_f32(svpfalse_b(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf preverse(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf preverse(const PacketXf& a) {
|
||||
return svrev_f32(a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pabs(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pabs(const PacketXf& a) {
|
||||
return svabs_f32_z(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
// TODO(tellenbach): Should this go into MathFunctions.h? If so, change for
|
||||
// TODO(tellenbach): Should this go into MathFunctions.h? If so, change for
|
||||
// all vector extensions and the generic version.
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pfrexp<PacketXf>(const PacketXf& a, PacketXf& exponent)
|
||||
{
|
||||
EIGEN_STRONG_INLINE PacketXf pfrexp<PacketXf>(const PacketXf& a, PacketXf& exponent) {
|
||||
return pfrexp_generic(a, exponent);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE float predux<PacketXf>(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE float predux<PacketXf>(const PacketXf& a) {
|
||||
return svaddv_f32(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
@@ -679,10 +599,8 @@ EIGEN_STRONG_INLINE float predux<PacketXf>(const PacketXf& a)
|
||||
// mul
|
||||
// Only works for SVE Vls multiple of 128
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE float predux_mul<PacketXf>(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0),
|
||||
EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
|
||||
EIGEN_STRONG_INLINE float predux_mul<PacketXf>(const PacketXf& a) {
|
||||
EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0), EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
|
||||
// Multiply the vector by its reverse
|
||||
svfloat32_t prod = svmul_f32_z(svptrue_b32(), a, svrev_f32(a));
|
||||
svfloat32_t half_prod;
|
||||
@@ -713,20 +631,17 @@ EIGEN_STRONG_INLINE float predux_mul<PacketXf>(const PacketXf& a)
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE float predux_min<PacketXf>(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE float predux_min<PacketXf>(const PacketXf& a) {
|
||||
return svminv_f32(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE float predux_max<PacketXf>(const PacketXf& a)
|
||||
{
|
||||
EIGEN_STRONG_INLINE float predux_max<PacketXf>(const PacketXf& a) {
|
||||
return svmaxv_f32(svptrue_b32(), a);
|
||||
}
|
||||
|
||||
template<int N>
|
||||
EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<PacketXf, N>& kernel)
|
||||
{
|
||||
template <int N>
|
||||
EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<PacketXf, N>& kernel) {
|
||||
float buffer[packet_traits<float>::size * N] = {0};
|
||||
int i = 0;
|
||||
|
||||
@@ -741,9 +656,8 @@ EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock<PacketXf, N>& kernel)
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
EIGEN_STRONG_INLINE PacketXf pldexp<PacketXf>(const PacketXf& a, const PacketXf& exponent)
|
||||
{
|
||||
template <>
|
||||
EIGEN_STRONG_INLINE PacketXf pldexp<PacketXf>(const PacketXf& a, const PacketXf& exponent) {
|
||||
return pldexp_generic(a, exponent);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user