diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 642f08cc76f88ceaab5215d3362458fbf32554f1..d1be02dad1e73f4e5aa33b920eca18fe7076106d 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 a4a87c4fc678602acb2ad98faaa516f582c5547b..9b058f51691e4af783806daafee0767323d50d76 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 b70c7fefedbe03ac8843808ef6cb6f7800b35d20..4d75e2f584217c2fada0123027057bd385c1a031 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 174eb575d139dd6119e2396cacb52b798af0996d..0840463ec1f9ff68ddea88dc5c57f6cf109531e0 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 ac0e2cfd31d42386dc8c1751ee1b538ea0c38ce9..5e6421d3b82fc0d9b951fb88e77361d1af33e6c9 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 4190d1bd1ac7a60fa1be2e604c27f953f226b209..ac8ec5d6de27bfa806f92018b8960648ee3e77a5 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 f79da7b8cd7c1940d016f757a08ca93a53dd8dd1..700244bd1e4b1569983a725083fab0aa9eed27ae 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);