From f0e46ed5d41eeb450cbcbdb1ce3233d524ad3acd Mon Sep 17 00:00:00 2001 From: Antonio Sanchez Date: Fri, 22 Jan 2021 11:10:54 -0800 Subject: Fix pow and other cwise ops for half/bfloat16. The new `generic_pow` implementation was failing for half/bfloat16 since their construction from int/float is not `constexpr`. Modified in `GenericPacketMathFunctions` to remove `constexpr`. While adding tests for half/bfloat16, found other issues related to implicit conversions. Also needed to implement `numext::arg` for non-integer, non-complex, non-float/double/long double types. These seem to be implicitly converted to `std::complex`, which then fails for half/bfloat16. --- Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h') diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h index 69c92a8cc..e3e91f4ab 100644 --- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h @@ -804,8 +804,8 @@ EIGEN_STRONG_INLINE void veltkamp_splitting(const Packet& x, Packet& x_hi, Packet& x_lo) { typedef typename unpacket_traits::type Scalar; EIGEN_CONSTEXPR int shift = (NumTraits::digits() + 1) / 2; - EIGEN_CONSTEXPR Scalar shift_scale = Scalar(uint64_t(1) << shift); - Packet gamma = pmul(pset1(shift_scale + 1), x); + Scalar shift_scale = Scalar(uint64_t(1) << shift); // Scalar constructor not necessarily constexpr. + Packet gamma = pmul(pset1(shift_scale + Scalar(1)), x); #ifdef EIGEN_HAS_SINGLE_INSTRUCTION_MADD x_hi = pmadd(pset1(-shift_scale), x, gamma); #else -- cgit v1.2.3