Imported from dev-cpp/eigen to use with bundled's (ideally would unbundle but rather not w/ Qt unless there is an upstream-supported cmake switch, is likely broken w/ the upcoming eigen version too). This is a backport from eigen upstream, so should no longer be needed whenever there is a bump (not in a release as of the writing of this) and it is updated here. https://bugs.gentoo.org/943402 https://bugs.gentoo.org/936107 https://gitlab.com/libeigen/eigen/-/merge_requests/1028 --- a/src/3rdparty/eigen/Eigen/Core +++ b/src/3rdparty/eigen/Eigen/Core @@ -348,3 +348,3 @@ -#if defined(EIGEN_VECTORIZE_ALTIVEC) || defined(EIGEN_VECTORIZE_VSX) +#if defined(EIGEN_VECTORIZE_VSX) #include "src/Core/arch/AltiVec/MatrixProduct.h" --- a/src/3rdparty/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +++ b/src/3rdparty/eigen/Eigen/src/Core/arch/AltiVec/Complex.h @@ -102,2 +102,3 @@ HasMax = 0, + HasSqrt = 1, #ifdef __VSX__ @@ -322,2 +323,3 @@ HasMax = 0, + HasSqrt = 1, HasSetLinear = 0 --- a/src/3rdparty/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +++ b/src/3rdparty/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h @@ -42,2 +42,3 @@ +#ifdef __VSX__ #ifndef EIGEN_COMP_CLANG @@ -48,6 +49,3 @@ } -#endif -#ifdef __VSX__ -#ifndef EIGEN_COMP_CLANG template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED @@ -76,2 +74,22 @@ } + +template<> EIGEN_STRONG_INLINE Packet8bf psqrt (const Packet8bf& a){ + BF16_TO_F32_UNARY_OP_WRAPPER(psqrt, a); +} + +#ifndef EIGEN_COMP_CLANG +template<> EIGEN_STRONG_INLINE Packet8bf prsqrt (const Packet8bf& a){ + BF16_TO_F32_UNARY_OP_WRAPPER(prsqrt, a); +} +#endif +#else +template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS +Packet4f psqrt(const Packet4f& x) +{ + Packet4f a; + for (Index i = 0; i < packet_traits::size; i++) { + a[i] = numext::sqrt(x[i]); + } + return a; +} #endif --- a/src/3rdparty/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +++ b/src/3rdparty/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h @@ -177,2 +177,5 @@ #endif + HasTanh = EIGEN_FAST_MATH, + HasErf = EIGEN_FAST_MATH, + HasRint = 1, #else @@ -180,4 +183,5 @@ HasRsqrt = 0, - HasTanh = EIGEN_FAST_MATH, - HasErf = EIGEN_FAST_MATH, + HasTanh = 0, + HasErf = 0, + HasRint = 0, #endif @@ -186,3 +190,2 @@ HasCeil = 1, - HasRint = 1, HasNegate = 1, @@ -219,2 +222,3 @@ #endif + HasRint = 1, #else @@ -222,5 +226,6 @@ HasRsqrt = 0, - HasTanh = EIGEN_FAST_MATH, - HasErf = EIGEN_FAST_MATH, + HasRint = 0, #endif + HasTanh = 0, + HasErf = 0, HasRound = 1, @@ -228,3 +233,2 @@ HasCeil = 1, - HasRint = 1, HasNegate = 1, @@ -874,15 +878,25 @@ +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet4i pcmp_le(const Packet4i& a, const Packet4i& b) { return reinterpret_cast(vec_cmple(a,b)); } +#endif template<> EIGEN_STRONG_INLINE Packet4i pcmp_lt(const Packet4i& a, const Packet4i& b) { return reinterpret_cast(vec_cmplt(a,b)); } template<> EIGEN_STRONG_INLINE Packet4i pcmp_eq(const Packet4i& a, const Packet4i& b) { return reinterpret_cast(vec_cmpeq(a,b)); } +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet8s pcmp_le(const Packet8s& a, const Packet8s& b) { return reinterpret_cast(vec_cmple(a,b)); } +#endif template<> EIGEN_STRONG_INLINE Packet8s pcmp_lt(const Packet8s& a, const Packet8s& b) { return reinterpret_cast(vec_cmplt(a,b)); } template<> EIGEN_STRONG_INLINE Packet8s pcmp_eq(const Packet8s& a, const Packet8s& b) { return reinterpret_cast(vec_cmpeq(a,b)); } +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet8us pcmp_le(const Packet8us& a, const Packet8us& b) { return reinterpret_cast(vec_cmple(a,b)); } +#endif template<> EIGEN_STRONG_INLINE Packet8us pcmp_lt(const Packet8us& a, const Packet8us& b) { return reinterpret_cast(vec_cmplt(a,b)); } template<> EIGEN_STRONG_INLINE Packet8us pcmp_eq(const Packet8us& a, const Packet8us& b) { return reinterpret_cast(vec_cmpeq(a,b)); } +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet16c pcmp_le(const Packet16c& a, const Packet16c& b) { return reinterpret_cast(vec_cmple(a,b)); } +#endif template<> EIGEN_STRONG_INLINE Packet16c pcmp_lt(const Packet16c& a, const Packet16c& b) { return reinterpret_cast(vec_cmplt(a,b)); } template<> EIGEN_STRONG_INLINE Packet16c pcmp_eq(const Packet16c& a, const Packet16c& b) { return reinterpret_cast(vec_cmpeq(a,b)); } +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet16uc pcmp_le(const Packet16uc& a, const Packet16uc& b) { return reinterpret_cast(vec_cmple(a,b)); } +#endif template<> EIGEN_STRONG_INLINE Packet16uc pcmp_lt(const Packet16uc& a, const Packet16uc& b) { return reinterpret_cast(vec_cmplt(a,b)); } @@ -939,2 +953,3 @@ template<> EIGEN_STRONG_INLINE Packet4f pfloor(const Packet4f& a) { return vec_floor(a); } +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet4f print(const Packet4f& a) @@ -949,2 +964,3 @@ } +#endif @@ -1343,8 +1359,2 @@ -template<> EIGEN_STRONG_INLINE Packet8bf psqrt (const Packet8bf& a){ - BF16_TO_F32_UNARY_OP_WRAPPER(vec_sqrt, a); -} -template<> EIGEN_STRONG_INLINE Packet8bf prsqrt (const Packet8bf& a){ - BF16_TO_F32_UNARY_OP_WRAPPER(prsqrt, a); -} template<> EIGEN_STRONG_INLINE Packet8bf pexp (const Packet8bf& a){ @@ -1392,2 +1402,3 @@ } +#ifdef __VSX__ template<> EIGEN_STRONG_INLINE Packet8bf print (const Packet8bf& a){ @@ -1395,2 +1406,3 @@ } +#endif template<> EIGEN_STRONG_INLINE Packet8bf pmadd(const Packet8bf& a, const Packet8bf& b, const Packet8bf& c) {