diff --git a/Eigen/src/Core/arch/AVX/Complex.h b/Eigen/src/Core/arch/AVX/Complex.h index f891e0bc3..3f3046f1f 100644 --- a/Eigen/src/Core/arch/AVX/Complex.h +++ b/Eigen/src/Core/arch/AVX/Complex.h @@ -432,25 +432,8 @@ EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock& kernel) { kernel.packet[0].v = tmp; } -template <> -EIGEN_STRONG_INLINE Packet2cd psqrt(const Packet2cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet4cf psqrt(const Packet4cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cd plog(const Packet2cd& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet4cf plog(const Packet4cf& a) { - return plog_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS_NO_EXP(Packet2cd) +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet4cf) template <> EIGEN_STRONG_INLINE Packet2cd pexp(const Packet2cd& a) { @@ -465,11 +448,6 @@ EIGEN_STRONG_INLINE Packet2cd pexp(const Packet2cd& a) { #endif } -template <> -EIGEN_STRONG_INLINE Packet4cf pexp(const Packet4cf& a) { - return pexp_complex(a); -} - #ifdef EIGEN_VECTORIZE_FMA // std::complex template <> diff --git a/Eigen/src/Core/arch/AVX512/Complex.h b/Eigen/src/Core/arch/AVX512/Complex.h index ab426ac09..b8483a804 100644 --- a/Eigen/src/Core/arch/AVX512/Complex.h +++ b/Eigen/src/Core/arch/AVX512/Complex.h @@ -443,35 +443,8 @@ EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock& kernel) { kernel.packet[0] = Packet4cd(_mm512_shuffle_f64x2(T0, T2, (shuffle_mask<0, 2, 0, 2>::mask))); // [a0 b0 c0 d0] } -template <> -EIGEN_STRONG_INLINE Packet4cd psqrt(const Packet4cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet8cf psqrt(const Packet8cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet4cd plog(const Packet4cd& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet8cf plog(const Packet8cf& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet4cd pexp(const Packet4cd& a) { - return pexp_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet8cf pexp(const Packet8cf& a) { - return pexp_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet4cd) +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet8cf) } // end namespace internal } // end namespace Eigen diff --git a/Eigen/src/Core/arch/AltiVec/Complex.h b/Eigen/src/Core/arch/AltiVec/Complex.h index d49f13670..12d73ed5e 100644 --- a/Eigen/src/Core/arch/AltiVec/Complex.h +++ b/Eigen/src/Core/arch/AltiVec/Complex.h @@ -361,20 +361,7 @@ EIGEN_STRONG_INLINE Packet2cf pcmp_eq(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_and(eq, vec_perm(eq, eq, p16uc_COMPLEX32_REV))); } -template <> -EIGEN_STRONG_INLINE Packet2cf psqrt(const Packet2cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf plog(const Packet2cf& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf pexp(const Packet2cf& a) { - return pexp_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet2cf) //---------- double ---------- #ifdef EIGEN_VECTORIZE_VSX @@ -621,15 +608,7 @@ EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(vec_and(eq, eq_swapped)); } -template <> -EIGEN_STRONG_INLINE Packet1cd psqrt(const Packet1cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd plog(const Packet1cd& a) { - return plog_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS_NO_EXP(Packet1cd) #endif // __VSX__ } // end namespace internal diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h index fb9d71017..3bca1f8a1 100644 --- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h @@ -237,6 +237,33 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_round(const Packet& a); EIGEN_GENERIC_PACKET_FUNCTION(log1p, PACKET) \ EIGEN_GENERIC_PACKET_FUNCTION(atan, PACKET) +// Macro to instantiate complex math function specializations (psqrt, plog, pexp) +// that delegate to the generic implementations. Use in arch-specific Complex.h files. +#define EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(PacketType) \ + template <> \ + EIGEN_STRONG_INLINE PacketType psqrt(const PacketType& a) { \ + return psqrt_complex(a); \ + } \ + template <> \ + EIGEN_STRONG_INLINE PacketType plog(const PacketType& a) { \ + return plog_complex(a); \ + } \ + template <> \ + EIGEN_STRONG_INLINE PacketType pexp(const PacketType& a) { \ + return pexp_complex(a); \ + } + +// Variant without pexp, for backends where pexp needs special handling for a given packet type. +#define EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS_NO_EXP(PacketType) \ + template <> \ + EIGEN_STRONG_INLINE PacketType psqrt(const PacketType& a) { \ + return psqrt_complex(a); \ + } \ + template <> \ + EIGEN_STRONG_INLINE PacketType plog(const PacketType& a) { \ + return plog_complex(a); \ + } + } // end namespace internal } // end namespace Eigen diff --git a/Eigen/src/Core/arch/LSX/Complex.h b/Eigen/src/Core/arch/LSX/Complex.h index 43ba989d2..813821041 100644 --- a/Eigen/src/Core/arch/LSX/Complex.h +++ b/Eigen/src/Core/arch/LSX/Complex.h @@ -226,11 +226,6 @@ EIGEN_STRONG_INLINE Packet2cf pdiv(const Packet2cf& a, const Packet2c return pdiv_complex(a, b); } -template <> -EIGEN_STRONG_INLINE Packet2cf plog(const Packet2cf& a) { - return plog_complex(a); -} - template <> EIGEN_STRONG_INLINE Packet2cf pzero(const Packet2cf& /* a */) { __m128 v = {0.0f, 0.0f, 0.0f, 0.0f}; @@ -251,11 +246,6 @@ EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& a, const Packet2 return result; } -template <> -EIGEN_STRONG_INLINE Packet2cf pexp(const Packet2cf& a) { - return pexp_complex(a); -} - //---------- double ---------- struct Packet1cd { EIGEN_STRONG_INLINE Packet1cd() {} @@ -458,20 +448,8 @@ EIGEN_DEVICE_FUNC inline Packet2cf pselect(const Packet2cf& mask, const Packet2c return res; } -template <> -EIGEN_STRONG_INLINE Packet1cd psqrt(const Packet1cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf psqrt(const Packet2cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd plog(const Packet1cd& a) { - return plog_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet2cf) +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS_NO_EXP(Packet1cd) template <> EIGEN_STRONG_INLINE Packet1cd pzero(const Packet1cd& /* a */) { diff --git a/Eigen/src/Core/arch/NEON/Complex.h b/Eigen/src/Core/arch/NEON/Complex.h index 9b476e051..48ac0cfcf 100644 --- a/Eigen/src/Core/arch/NEON/Complex.h +++ b/Eigen/src/Core/arch/NEON/Complex.h @@ -456,35 +456,8 @@ EIGEN_DEVICE_FUNC inline void ptranspose(PacketBlock& kernel) { kernel.packet[1].v = tmp; } -template <> -EIGEN_STRONG_INLINE Packet1cf psqrt(const Packet1cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf psqrt(const Packet2cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cf plog(const Packet1cf& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf plog(const Packet2cf& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cf pexp(const Packet1cf& a) { - return pexp_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf pexp(const Packet2cf& a) { - return pexp_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet1cf) +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet2cf) //---------- double ---------- #if EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG @@ -714,20 +687,7 @@ EIGEN_STRONG_INLINE void ptranspose(PacketBlock& kernel) { kernel.packet[1].v = tmp; } -template <> -EIGEN_STRONG_INLINE Packet1cd psqrt(const Packet1cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd plog(const Packet1cd& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd pexp(const Packet1cd& a) { - return pexp_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet1cd) #endif // EIGEN_ARCH_ARM64 diff --git a/Eigen/src/Core/arch/SSE/Complex.h b/Eigen/src/Core/arch/SSE/Complex.h index 484ec4c71..d04b89864 100644 --- a/Eigen/src/Core/arch/SSE/Complex.h +++ b/Eigen/src/Core/arch/SSE/Complex.h @@ -413,35 +413,8 @@ EIGEN_STRONG_INLINE Packet1cd pcmp_eq(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(pand(eq, vec2d_swizzle1(eq, 1, 0))); } -template <> -EIGEN_STRONG_INLINE Packet1cd psqrt(const Packet1cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf psqrt(const Packet2cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd plog(const Packet1cd& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf plog(const Packet2cf& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd pexp(const Packet1cd& a) { - return pexp_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf pexp(const Packet2cf& a) { - return pexp_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet1cd) +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet2cf) #ifdef EIGEN_VECTORIZE_FMA // std::complex diff --git a/Eigen/src/Core/arch/ZVector/Complex.h b/Eigen/src/Core/arch/ZVector/Complex.h index dfcdcab1f..048b598b0 100644 --- a/Eigen/src/Core/arch/ZVector/Complex.h +++ b/Eigen/src/Core/arch/ZVector/Complex.h @@ -20,7 +20,8 @@ namespace internal { #if !defined(__ARCH__) || (defined(__ARCH__) && __ARCH__ >= 12) inline Packet4ui p4ui_CONJ_XOR() { - return Packet4ui {0x00000000, 0x80000000, 0x00000000, 0x80000000}; // vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_MZERO); + return Packet4ui{0x00000000, 0x80000000, 0x00000000, + 0x80000000}; // vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_MZERO); } #endif @@ -255,29 +256,8 @@ EIGEN_STRONG_INLINE Packet1cd pdiv(const Packet1cd& a, const Packet1c return pdiv_complex(a, b); } -template <> -EIGEN_STRONG_INLINE Packet1cd psqrt(const Packet1cd& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf psqrt(const Packet2cf& a) { - return psqrt_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet1cd plog(const Packet1cd& a) { - return plog_complex(a); -} -template <> -EIGEN_STRONG_INLINE Packet2cf plog(const Packet2cf& a) { - return plog_complex(a); -} - -template <> -EIGEN_STRONG_INLINE Packet2cf pexp(const Packet2cf& a) { - return pexp_complex(a); -} +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS_NO_EXP(Packet1cd) +EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(Packet2cf) EIGEN_STRONG_INLINE Packet1cd pcplxflip /**/ (const Packet1cd& x) { return Packet1cd(preverse(Packet2d(x.v))); diff --git a/Eigen/src/Core/arch/clang/Complex.h b/Eigen/src/Core/arch/clang/Complex.h index edc9693a9..6b8e7768e 100644 --- a/Eigen/src/Core/arch/clang/Complex.h +++ b/Eigen/src/Core/arch/clang/Complex.h @@ -147,18 +147,7 @@ EIGEN_STRONG_INLINE Packet4cd pset1(const std::complex& from) EIGEN_STRONG_INLINE unpacket_traits::type pfirst(const PACKET_TYPE& a) { \ return a[0]; \ } \ - template <> \ - EIGEN_STRONG_INLINE PACKET_TYPE pexp(const PACKET_TYPE& a) { \ - return pexp_complex(a); \ - } \ - template <> \ - EIGEN_STRONG_INLINE PACKET_TYPE plog(const PACKET_TYPE& a) { \ - return plog_complex(a); \ - } \ - template <> \ - EIGEN_STRONG_INLINE PACKET_TYPE psqrt(const PACKET_TYPE& a) { \ - return psqrt_complex(a); \ - } + EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(PACKET_TYPE) EIGEN_CLANG_COMPLEX_UNARY_CWISE_OPS(Packet8cf); EIGEN_CLANG_COMPLEX_UNARY_CWISE_OPS(Packet4cd);