10#ifndef EIGEN_MATH_FUNCTIONS_AVX_H
11#define EIGEN_MATH_FUNCTIONS_AVX_H
22EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
23psin<Packet8f>(
const Packet8f& _x) {
24 return psin_float(_x);
28EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
29pcos<Packet8f>(
const Packet8f& _x) {
30 return pcos_float(_x);
34EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
35plog<Packet8f>(
const Packet8f& _x) {
36 return plog_float(_x);
40EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4d
41plog<Packet4d>(
const Packet4d& _x) {
42 return plog_double(_x);
46EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
47plog2<Packet8f>(
const Packet8f& _x) {
48 return plog2_float(_x);
52EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4d
53plog2<Packet4d>(
const Packet4d& _x) {
54 return plog2_double(_x);
57template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
58Packet8f plog1p<Packet8f>(
const Packet8f& _x) {
59 return generic_plog1p(_x);
62template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
63Packet8f pexpm1<Packet8f>(
const Packet8f& _x) {
64 return generic_expm1(_x);
71EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
72pexp<Packet8f>(
const Packet8f& _x) {
73 return pexp_float(_x);
78EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
79ptanh<Packet8f>(
const Packet8f& _x) {
80 return internal::generic_fast_tanh_float(_x);
85EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4d
86pexp<Packet4d>(
const Packet4d& _x) {
87 return pexp_double(_x);
100EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
101Packet8f psqrt<Packet8f>(
const Packet8f& _x) {
102 Packet8f minus_half_x = pmul(_x, pset1<Packet8f>(-0.5f));
103 Packet8f denormal_mask = pandnot(
104 pcmp_lt(_x, pset1<Packet8f>((std::numeric_limits<float>::min)())),
105 pcmp_lt(_x, pzero(_x)));
108 Packet8f x = _mm256_rsqrt_ps(_x);
110 x = pmul(x, pmadd(minus_half_x, pmul(x,x), pset1<Packet8f>(1.5f)));
112 return pandnot(pmul(_x,x), denormal_mask);
117template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
118Packet8f psqrt<Packet8f>(
const Packet8f& _x) {
119 return _mm256_sqrt_ps(_x);
124template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
125Packet4d psqrt<Packet4d>(
const Packet4d& _x) {
126 return _mm256_sqrt_pd(_x);
130template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
131Packet8f prsqrt<Packet8f>(
const Packet8f& _x) {
132 _EIGEN_DECLARE_CONST_Packet8f_FROM_INT(inf, 0x7f800000);
133 _EIGEN_DECLARE_CONST_Packet8f(one_point_five, 1.5f);
134 _EIGEN_DECLARE_CONST_Packet8f(minus_half, -0.5f);
135 _EIGEN_DECLARE_CONST_Packet8f_FROM_INT(flt_min, 0x00800000);
137 Packet8f neg_half = pmul(_x, p8f_minus_half);
141 Packet8f lt_min_mask = _mm256_cmp_ps(_x, p8f_flt_min, _CMP_LT_OQ);
142 Packet8f inf_mask = _mm256_cmp_ps(_x, p8f_inf, _CMP_EQ_OQ);
143 Packet8f not_normal_finite_mask = _mm256_or_ps(lt_min_mask, inf_mask);
146 Packet8f y_approx = _mm256_rsqrt_ps(_x);
152 Packet8f y_newton = pmul(y_approx, pmadd(y_approx, pmul(neg_half, y_approx), p8f_one_point_five));
159 return pselect<Packet8f>(not_normal_finite_mask, y_approx, y_newton);
163template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
164Packet8f prsqrt<Packet8f>(
const Packet8f& _x) {
165 _EIGEN_DECLARE_CONST_Packet8f(one, 1.0f);
166 return _mm256_div_ps(p8f_one, _mm256_sqrt_ps(_x));
170template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
171Packet4d prsqrt<Packet4d>(
const Packet4d& _x) {
172 _EIGEN_DECLARE_CONST_Packet4d(one, 1.0);
173 return _mm256_div_pd(p4d_one, _mm256_sqrt_pd(_x));
176F16_PACKET_FUNCTION(Packet8f, Packet8h, psin)
177F16_PACKET_FUNCTION(Packet8f, Packet8h, pcos)
178F16_PACKET_FUNCTION(Packet8f, Packet8h, plog)
179F16_PACKET_FUNCTION(Packet8f, Packet8h, plog2)
180F16_PACKET_FUNCTION(Packet8f, Packet8h, plog1p)
181F16_PACKET_FUNCTION(Packet8f, Packet8h, pexpm1)
182F16_PACKET_FUNCTION(Packet8f, Packet8h, pexp)
183F16_PACKET_FUNCTION(Packet8f, Packet8h, ptanh)
184F16_PACKET_FUNCTION(Packet8f, Packet8h, psqrt)
185F16_PACKET_FUNCTION(Packet8f, Packet8h, prsqrt)
188EIGEN_STRONG_INLINE Packet8h pfrexp(
const Packet8h& a, Packet8h& exponent) {
190 const Packet8h out = float2half(pfrexp<Packet8f>(half2float(a), fexponent));
191 exponent = float2half(fexponent);
196EIGEN_STRONG_INLINE Packet8h pldexp(
const Packet8h& a,
const Packet8h& exponent) {
197 return float2half(pldexp<Packet8f>(half2float(a), half2float(exponent)));
200BF16_PACKET_FUNCTION(Packet8f, Packet8bf, psin)
201BF16_PACKET_FUNCTION(Packet8f, Packet8bf, pcos)
202BF16_PACKET_FUNCTION(Packet8f, Packet8bf, plog)
203BF16_PACKET_FUNCTION(Packet8f, Packet8bf, plog2)
204BF16_PACKET_FUNCTION(Packet8f, Packet8bf, plog1p)
205BF16_PACKET_FUNCTION(Packet8f, Packet8bf, pexpm1)
206BF16_PACKET_FUNCTION(Packet8f, Packet8bf, pexp)
207BF16_PACKET_FUNCTION(Packet8f, Packet8bf, ptanh)
208BF16_PACKET_FUNCTION(Packet8f, Packet8bf, psqrt)
209BF16_PACKET_FUNCTION(Packet8f, Packet8bf, prsqrt)
212EIGEN_STRONG_INLINE Packet8bf pfrexp(
const Packet8bf& a, Packet8bf& exponent) {
214 const Packet8bf out = F32ToBf16(pfrexp<Packet8f>(Bf16ToF32(a), fexponent));
215 exponent = F32ToBf16(fexponent);
220EIGEN_STRONG_INLINE Packet8bf pldexp(
const Packet8bf& a,
const Packet8bf& exponent) {
221 return F32ToBf16(pldexp<Packet8f>(Bf16ToF32(a), Bf16ToF32(exponent)));
Namespace containing all symbols from the Eigen library.
Definition: Core:141