15 #ifndef EIGEN_MATH_FUNCTIONS_SSE_H 16 #define EIGEN_MATH_FUNCTIONS_SSE_H 22 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
23 Packet4f plog<Packet4f>(
const Packet4f& _x) {
24 return plog_float(_x);
27 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
28 Packet2d plog<Packet2d>(
const Packet2d& _x) {
29 return plog_double(_x);
32 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
33 Packet4f plog2<Packet4f>(
const Packet4f& _x) {
34 return plog2_float(_x);
37 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
38 Packet2d plog2<Packet2d>(
const Packet2d& _x) {
39 return plog2_double(_x);
42 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
43 Packet4f plog1p<Packet4f>(
const Packet4f& _x) {
44 return generic_plog1p(_x);
47 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
48 Packet4f pexpm1<Packet4f>(
const Packet4f& _x) {
49 return generic_expm1(_x);
52 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
53 Packet4f pexp<Packet4f>(
const Packet4f& _x)
55 return pexp_float(_x);
58 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
59 Packet2d pexp<Packet2d>(
const Packet2d& x)
61 return pexp_double(x);
64 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
65 Packet4f psin<Packet4f>(
const Packet4f& _x)
67 return psin_float(_x);
70 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
71 Packet4f pcos<Packet4f>(
const Packet4f& _x)
73 return pcos_float(_x);
86 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
87 Packet4f psqrt<Packet4f>(
const Packet4f& _x)
89 Packet4f minus_half_x = pmul(_x, pset1<Packet4f>(-0.5f));
90 Packet4f denormal_mask = pandnot(
91 pcmp_lt(_x, pset1<Packet4f>((std::numeric_limits<float>::min)())),
92 pcmp_lt(_x, pzero(_x)));
95 Packet4f x = _mm_rsqrt_ps(_x);
97 x = pmul(x, pmadd(minus_half_x, pmul(x,x), pset1<Packet4f>(1.5f)));
99 return pandnot(pmul(_x,x), denormal_mask);
104 template<>EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
105 Packet4f psqrt<Packet4f>(
const Packet4f& x) {
return _mm_sqrt_ps(x); }
109 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
110 Packet2d psqrt<Packet2d>(
const Packet2d& x) {
return _mm_sqrt_pd(x); }
112 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
113 Packet16b psqrt<Packet16b>(
const Packet16b& x) {
return x; }
117 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
118 Packet4f prsqrt<Packet4f>(
const Packet4f& _x) {
119 _EIGEN_DECLARE_CONST_Packet4f(one_point_five, 1.5f);
120 _EIGEN_DECLARE_CONST_Packet4f(minus_half, -0.5f);
121 _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(inf, 0x7f800000u);
122 _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(flt_min, 0x00800000u);
124 Packet4f neg_half = pmul(_x, p4f_minus_half);
127 Packet4f lt_min_mask = _mm_cmplt_ps(_x, p4f_flt_min);
128 Packet4f inf_mask = _mm_cmpeq_ps(_x, p4f_inf);
129 Packet4f not_normal_finite_mask = _mm_or_ps(lt_min_mask, inf_mask);
132 Packet4f y_approx = _mm_rsqrt_ps(_x);
138 Packet4f y_newton = pmul(
139 y_approx, pmadd(y_approx, pmul(neg_half, y_approx), p4f_one_point_five));
146 return pselect<Packet4f>(not_normal_finite_mask, y_approx, y_newton);
151 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
152 Packet4f prsqrt<Packet4f>(
const Packet4f& x) {
154 return _mm_div_ps(pset1<Packet4f>(1.0f), _mm_sqrt_ps(x));
159 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
160 Packet2d prsqrt<Packet2d>(
const Packet2d& x) {
161 return _mm_div_pd(pset1<Packet2d>(1.0), _mm_sqrt_pd(x));
166 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f
167 ptanh<Packet4f>(
const Packet4f& x) {
168 return internal::generic_fast_tanh_float(x);
176 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
177 float sqrt(
const float &x)
179 return internal::pfirst(internal::Packet4f(_mm_sqrt_ss(_mm_set_ss(x))));
183 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
184 double sqrt(
const double &x)
186 #if EIGEN_COMP_GNUC_STRICT 189 return internal::pfirst(internal::Packet2d(__builtin_ia32_sqrtsd(_mm_set_sd(x))));
191 return internal::pfirst(internal::Packet2d(_mm_sqrt_pd(_mm_set_sd(x))));
199 #endif // EIGEN_MATH_FUNCTIONS_SSE_H const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(const Eigen::ArrayBase< Derived > &x)
Namespace containing all symbols from the Eigen library.
Definition: Core:141
Definition: Eigen_Colamd.h:50