diff options
author | Gael Guennebaud <g.gael@free.fr> | 2016-01-21 20:18:51 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2016-01-21 20:18:51 +0100 |
commit | 8dca9f97e38970b1f7fed6cb508c58d8ff39d526 (patch) | |
tree | 6b95b0c4b8efe7ca34354755f312eeeada3ae539 /Eigen/src/Core/arch/SSE/MathFunctions.h | |
parent | 34340458cbe33976559bf8fd73a9d4b2f747d611 (diff) |
Add numext::sqrt function to enable custom optimized implementation.
This changeset add two specializations for float/double on SSE. Those
are mostly usefull with GCC for which std::sqrt add an extra and costly
check on the result of _mm_sqrt_*. Clang does not add this burden.
In this changeset, only DenseBase::norm() makes use of it.
Diffstat (limited to 'Eigen/src/Core/arch/SSE/MathFunctions.h')
-rw-r--r-- | Eigen/src/Core/arch/SSE/MathFunctions.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Eigen/src/Core/arch/SSE/MathFunctions.h b/Eigen/src/Core/arch/SSE/MathFunctions.h index 3b8b7303f..0dd52f96e 100644 --- a/Eigen/src/Core/arch/SSE/MathFunctions.h +++ b/Eigen/src/Core/arch/SSE/MathFunctions.h @@ -518,6 +518,28 @@ Packet2d prsqrt<Packet2d>(const Packet2d& x) { } // end namespace internal +namespace numext { + +template<> +EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE +float sqrt(const float &x) +{ + return internal::pfirst(_mm_sqrt_ss(_mm_set_ss(x))); +} + +template<> +EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE +double sqrt(const double &x) +{ +#if EIGEN_COMP_GNUC + return internal::pfirst(__builtin_ia32_sqrtsd(_mm_set_sd(x))); +#else + return internal::pfirst(_mm_sqrt_pd(_mm_set_sd(x))); +#endif +} + +} // end namespace numex + } // end namespace Eigen #endif // EIGEN_MATH_FUNCTIONS_SSE_H |