16#ifndef EIGEN_MATH_FUNCTIONS_SSE_H
17#define EIGEN_MATH_FUNCTIONS_SSE_H
20#include "../../InternalHeaderCheck.h"
26EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_FLOAT(Packet4f)
27EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_DOUBLE(Packet2d)
34EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet4f psqrt<Packet4f>(
const Packet4f& x) {
35 return _mm_sqrt_ps(x);
38EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet2d psqrt<Packet2d>(
const Packet2d& x) {
39 return _mm_sqrt_pd(x);
42EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16b psqrt<Packet16b>(
const Packet16b& x) {
49EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f prsqrt<Packet4f>(
const Packet4f& x) {
50 return generic_rsqrt_newton_step<Packet4f, 1>::run(x, _mm_rsqrt_ps(x));
53#ifdef EIGEN_VECTORIZE_FMA
58EIGEN_STRONG_INLINE Packet4f preciprocal<Packet4f>(
const Packet4f& x) {
59#ifdef EIGEN_VECTORIZE_AVX
61 const Packet4f one = pset1<Packet4f>(1.0f);
62 const Packet4f r0 = _mm_rcp_ps(x);
63 const Packet4f refined = pmadd(r0, pnmadd(x, r0, one), r0);
64 const Packet4f redo = _mm_cmp_ps(refined, _mm_setzero_ps(), _CMP_EQ_UQ);
65 return predux_any(redo) ? pselect(redo, pdiv(one, x), refined) : refined;
67 return generic_reciprocal_newton_step<Packet4f, 1>::run(x, _mm_rcp_ps(x));
79EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float sqrt(
const float& x) {
80 return internal::pfirst(internal::Packet4f(_mm_sqrt_ss(_mm_set_ss(x))));
84EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double sqrt(
const double& x) {
85#if EIGEN_COMP_GNUC_STRICT
88 return internal::pfirst(internal::Packet2d(__builtin_ia32_sqrtsd(_mm_set_sd(x))));
90 return internal::pfirst(internal::Packet2d(_mm_sqrt_pd(_mm_set_sd(x))));