From 0835085ab7b198e2256a35c54082bc05db57c97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damiano=20Franz=C3=B2?= Date: Tue, 16 Apr 2024 13:55:41 +0200 Subject: [PATCH] Extend pexp_complex for double --- Eigen/src/Core/GenericPacketMath.h | 8 ++++++++ Eigen/src/Core/arch/AVX/Complex.h | 6 ++++++ Eigen/src/Core/arch/AVX512/Complex.h | 6 ++++++ .../arch/Default/GenericPacketMathFunctions.h | 16 +++++++++++++--- .../arch/Default/GenericPacketMathFunctionsFwd.h | 10 ++++++++++ Eigen/src/Core/arch/NEON/Complex.h | 6 ++++++ Eigen/src/Core/arch/SSE/Complex.h | 6 ++++++ 7 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 642f08cc7..d1be02dad 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -1029,6 +1029,14 @@ EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos(const Packet& a return cos(a); } +/** \internal \returns the sine cosine of \a a (coeff-wise) */ +template +EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psincos_aux(const Packet& a) { + EIGEN_USING_STD(sin); + EIGEN_USING_STD(cos); + return pselect(peven_mask(a), sin(a), cos(a)); +} + /** \internal \returns the tan of \a a (coeff-wise) */ template EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan(const Packet& a) { diff --git a/Eigen/src/Core/arch/AVX/Complex.h b/Eigen/src/Core/arch/AVX/Complex.h index a4a87c4fc..9b058f516 100644 --- a/Eigen/src/Core/arch/AVX/Complex.h +++ b/Eigen/src/Core/arch/AVX/Complex.h @@ -245,6 +245,7 @@ struct packet_traits > : default_packet_traits { HasNegate = 1, HasSqrt = 1, HasLog = 1, + HasExp = 1, HasAbs = 0, HasAbs2 = 0, HasMin = 0, @@ -450,6 +451,11 @@ EIGEN_STRONG_INLINE Packet4cf plog(const Packet4cf& a) { return plog_complex(a); } +template <> +EIGEN_STRONG_INLINE Packet2cd pexp(const Packet2cd& a) { + return pexp_complex(a); +} + template <> EIGEN_STRONG_INLINE Packet4cf pexp(const Packet4cf& a) { return pexp_complex(a); diff --git a/Eigen/src/Core/arch/AVX512/Complex.h b/Eigen/src/Core/arch/AVX512/Complex.h index b70c7fefe..4d75e2f58 100644 --- a/Eigen/src/Core/arch/AVX512/Complex.h +++ b/Eigen/src/Core/arch/AVX512/Complex.h @@ -226,6 +226,7 @@ struct packet_traits > : default_packet_traits { HasNegate = 1, HasSqrt = 1, HasLog = 1, + HasExp = 1, HasAbs = 0, HasAbs2 = 0, HasMin = 0, @@ -461,6 +462,11 @@ 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); diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h index 174eb575d..0840463ec 100644 --- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h @@ -952,8 +952,8 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet sign_bit, sFinalRes; if (ComputeBoth) { Packet peven = peven_mask(x); - sign_bit = pselect((s), sign_sin, sign_cos); - sFinalRes = pselect(pxor(peven, poly_mask), ssin, scos); + sign_bit = pselect(peven, sign_sin, sign_cos); + sFinalRes = pselect(pxor(peven, poly_mask), scos, ssin); } else { sign_bit = ComputeSine ? sign_sin : sign_cos; sFinalRes = ComputeSine ? pselect(poly_mask, ssin, scos) : pselect(poly_mask, scos, ssin); @@ -984,6 +984,16 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS return sFinalRes; } +template +EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psincos_aux_float(const Packet& x) { + return psincos_float(x); +} + +template +EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psincos_aux_double(const Packet& x) { + return psincos_double(x); +} + template EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_double(const Packet& x) { return psincos_double(x); @@ -1381,7 +1391,7 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_complex(const Pa // cis(y): RealPacket y = pand(odd_mask, a.v); y = por(y, pcplxflip(Packet(y)).v); - RealPacket cisy = psincos_float(y); + RealPacket cisy = psincos_aux(y); cisy = pcplxflip(Packet(cisy)).v; // cos(y) + i * sin(y) const RealPacket cst_pos_inf = pset1(NumTraits::infinity()); diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h index ac0e2cfd3..5e6421d3b 100644 --- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h @@ -102,6 +102,10 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_float(const Pack template EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos_float(const Packet& x); +/** \internal \returns sincos(x) for single precision float */ +template +EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psincos_aux_float(const Packet& x); + /** \internal \returns sin(x) for double precision float */ template EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_double(const Packet& x); @@ -110,6 +114,10 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_double(const Pac template EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos_double(const Packet& x); +/** \internal \returns sincos(x) for double precision float */ +template +EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psincos_aux_double(const Packet& x); + /** \internal \returns asin(x) for single precision float */ template EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin_float(const Packet& x); @@ -188,6 +196,7 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_round(const Packet& a); #define EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_FLOAT(PACKET) \ EIGEN_FLOAT_PACKET_FUNCTION(sin, PACKET) \ EIGEN_FLOAT_PACKET_FUNCTION(cos, PACKET) \ + EIGEN_FLOAT_PACKET_FUNCTION(sincos_aux, PACKET) \ EIGEN_FLOAT_PACKET_FUNCTION(asin, PACKET) \ EIGEN_FLOAT_PACKET_FUNCTION(acos, PACKET) \ EIGEN_FLOAT_PACKET_FUNCTION(tanh, PACKET) \ @@ -205,6 +214,7 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_round(const Packet& a); EIGEN_DOUBLE_PACKET_FUNCTION(log, PACKET) \ EIGEN_DOUBLE_PACKET_FUNCTION(sin, PACKET) \ EIGEN_DOUBLE_PACKET_FUNCTION(cos, PACKET) \ + EIGEN_DOUBLE_PACKET_FUNCTION(sincos_aux, PACKET) \ EIGEN_DOUBLE_PACKET_FUNCTION(log2, PACKET) \ EIGEN_DOUBLE_PACKET_FUNCTION(exp, PACKET) \ EIGEN_DOUBLE_PACKET_FUNCTION(tanh, PACKET) \ diff --git a/Eigen/src/Core/arch/NEON/Complex.h b/Eigen/src/Core/arch/NEON/Complex.h index 4190d1bd1..ac8ec5d6d 100644 --- a/Eigen/src/Core/arch/NEON/Complex.h +++ b/Eigen/src/Core/arch/NEON/Complex.h @@ -529,6 +529,7 @@ struct packet_traits > : default_packet_traits { HasNegate = 1, HasSqrt = 1, HasLog = 1, + HasExp = 1, HasAbs = 0, HasAbs2 = 0, HasMin = 0, @@ -743,6 +744,11 @@ 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); +} + #endif // EIGEN_ARCH_ARM64 } // end namespace internal diff --git a/Eigen/src/Core/arch/SSE/Complex.h b/Eigen/src/Core/arch/SSE/Complex.h index f79da7b8c..700244bd1 100644 --- a/Eigen/src/Core/arch/SSE/Complex.h +++ b/Eigen/src/Core/arch/SSE/Complex.h @@ -241,6 +241,7 @@ struct packet_traits > : default_packet_traits { HasNegate = 1, HasSqrt = 1, HasLog = 1, + HasExp = 1, HasAbs = 0, HasAbs2 = 0, HasMin = 0, @@ -440,6 +441,11 @@ 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); -- GitLab