diff options
-rw-r--r-- | Eigen/src/Core/MathFunctions.h | 5 | ||||
-rw-r--r-- | Eigen/src/Core/arch/SSE/MathFunctions.h | 3 | ||||
-rwxr-xr-x | Eigen/src/Core/arch/SSE/PacketMath.h | 3 | ||||
-rw-r--r-- | Eigen/src/Core/functors/UnaryFunctors.h | 38 | ||||
-rw-r--r-- | unsupported/test/cxx11_tensor_block_eval.cpp | 41 |
5 files changed, 78 insertions, 12 deletions
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index e9da35995..db27670be 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -1374,6 +1374,11 @@ T sqrt(const T &x) return sqrt(x); } +// Boolean specialization, avoids implicit float to bool conversion (-Wimplicit-conversion-floating-point-to-bool). +template<> +EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_DEVICE_FUNC +bool sqrt<bool>(const bool &x) { return x; } + #if defined(SYCL_DEVICE_ONLY) SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt) #endif diff --git a/Eigen/src/Core/arch/SSE/MathFunctions.h b/Eigen/src/Core/arch/SSE/MathFunctions.h index 71ec6f858..d5b62e86a 100644 --- a/Eigen/src/Core/arch/SSE/MathFunctions.h +++ b/Eigen/src/Core/arch/SSE/MathFunctions.h @@ -99,6 +99,9 @@ Packet4f psqrt<Packet4f>(const Packet4f& x) { return _mm_sqrt_ps(x); } template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2d psqrt<Packet2d>(const Packet2d& x) { return _mm_sqrt_pd(x); } +template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED +Packet16b psqrt<Packet16b>(const Packet16b& x) { return x; } + #if EIGEN_FAST_MATH template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h index 4db701491..ef77ab6fa 100755 --- a/Eigen/src/Core/arch/SSE/PacketMath.h +++ b/Eigen/src/Core/arch/SSE/PacketMath.h @@ -218,7 +218,8 @@ template<> struct packet_traits<bool> : default_packet_traits HasAbs2 = 0, HasMin = 0, HasMax = 0, - HasConj = 0 + HasConj = 0, + HasSqrt = 1 }; }; diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index c7ed18c69..8c0ed8481 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -422,6 +422,18 @@ struct functor_traits<scalar_sqrt_op<Scalar> > { }; }; +// Boolean specialization to eliminate -Wimplicit-conversion-floating-point-to-bool warnings. +template<> struct scalar_sqrt_op<bool> { + EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op) + EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; } + template <typename Packet> + EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return a; } +}; +template <> +struct functor_traits<scalar_sqrt_op<bool> > { + enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable }; +}; + /** \internal * \brief Template functor to compute the reciprocal square root of a scalar * \sa class CwiseUnaryOp, Cwise::rsqrt() @@ -719,6 +731,19 @@ template<typename Scalar> struct functor_traits<scalar_square_op<Scalar> > { enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; +// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC. +template<> +struct scalar_square_op<bool> { + EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op) + EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; } + template<typename Packet> + EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const + { return a; } +}; +template<> +struct functor_traits<scalar_square_op<bool> > +{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; }; + /** \internal * \brief Template functor to compute the cube of a scalar * \sa class CwiseUnaryOp, Cwise::cube() @@ -735,6 +760,19 @@ template<typename Scalar> struct functor_traits<scalar_cube_op<Scalar> > { enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; }; +// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC. +template<> +struct scalar_cube_op<bool> { + EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op) + EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline bool operator() (const bool& a) const { return a; } + template<typename Packet> + EIGEN_DEPRECATED EIGEN_DEVICE_FUNC inline const Packet packetOp(const Packet& a) const + { return a; } +}; +template<> +struct functor_traits<scalar_cube_op<bool> > +{ enum { Cost = 0, PacketAccess = packet_traits<bool>::Vectorizable }; }; + /** \internal * \brief Template functor to compute the rounded value of a scalar * \sa class CwiseUnaryOp, ArrayBase::round() diff --git a/unsupported/test/cxx11_tensor_block_eval.cpp b/unsupported/test/cxx11_tensor_block_eval.cpp index a7a49fa1f..b2e26ebb7 100644 --- a/unsupported/test/cxx11_tensor_block_eval.cpp +++ b/unsupported/test/cxx11_tensor_block_eval.cpp @@ -222,7 +222,7 @@ static void test_eval_tensor_unary_expr_block() { input.setRandom(); VerifyBlockEvaluator<T, NumDims, Layout>( - input.square(), [&dims]() { return RandomBlock<Layout>(dims, 1, 10); }); + input.abs(), [&dims]() { return RandomBlock<Layout>(dims, 1, 10); }); } template <typename T, int NumDims, int Layout> @@ -274,7 +274,7 @@ static void test_eval_tensor_broadcast() { // Check that desc.destination() memory is not shared between two broadcast // materializations. VerifyBlockEvaluator<T, NumDims, Layout>( - input.broadcast(bcast) * input.square().broadcast(bcast), + input.broadcast(bcast) * input.abs().broadcast(bcast), [&bcasted_dims]() { return SkewedInnerBlock<Layout>(bcasted_dims); }); } @@ -391,27 +391,46 @@ static void test_eval_tensor_chipping() { // Block expression assignment. VerifyBlockEvaluator<T, NumDims - 1, Layout>( - input.square().chip(chip_offset, chip_dim), + input.abs().chip(chip_offset, chip_dim), [&chipped_dims]() { return FixedSizeBlock(chipped_dims); }); VerifyBlockEvaluator<T, NumDims - 1, Layout>( - input.square().chip(chip_offset, chip_dim), + input.abs().chip(chip_offset, chip_dim), [&chipped_dims]() { return RandomBlock<Layout>(chipped_dims, 1, 10); }); } -template <typename T, int NumDims, int Layout> -static void test_eval_tensor_generator() { - DSizes<Index, NumDims> dims = RandomDims<NumDims>(10, 20); - Tensor<T, NumDims, Layout> input(dims); - input.setRandom(); - auto generator = [](const array<Index, NumDims>& coords) -> T { +template<typename T, int NumDims> +struct SimpleTensorGenerator { + T operator()(const array<Index, NumDims>& coords) const { T result = static_cast<T>(0); for (int i = 0; i < NumDims; ++i) { result += static_cast<T>((i + 1) * coords[i]); } return result; - }; + } +}; + +// Boolean specialization to avoid -Wint-in-bool-context warnings on GCC. +template<int NumDims> +struct SimpleTensorGenerator<bool, NumDims> { + bool operator()(const array<Index, NumDims>& coords) const { + bool result = false; + for (int i = 0; i < NumDims; ++i) { + result ^= coords[i]; + } + return result; + } +}; + + +template <typename T, int NumDims, int Layout> +static void test_eval_tensor_generator() { + DSizes<Index, NumDims> dims = RandomDims<NumDims>(10, 20); + Tensor<T, NumDims, Layout> input(dims); + input.setRandom(); + + auto generator = SimpleTensorGenerator<T, NumDims>(); VerifyBlockEvaluator<T, NumDims, Layout>( input.generate(generator), [&dims]() { return FixedSizeBlock(dims); }); |