10 #ifndef EIGEN_MATH_FUNCTIONS_AVX_H 11 #define EIGEN_MATH_FUNCTIONS_AVX_H 22 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
23 psin<Packet8f>(
const Packet8f& _x) {
24 return psin_float(_x);
28 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
29 pcos<Packet8f>(
const Packet8f& _x) {
30 return pcos_float(_x);
34 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
35 plog<Packet8f>(
const Packet8f& _x) {
36 return plog_float(_x);
40 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4d
41 plog<Packet4d>(
const Packet4d& _x) {
42 return plog_double(_x);
46 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
47 plog2<Packet8f>(
const Packet8f& _x) {
48 return plog2_float(_x);
52 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4d
53 plog2<Packet4d>(
const Packet4d& _x) {
54 return plog2_double(_x);
57 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
58 Packet8f plog1p<Packet8f>(
const Packet8f& _x) {
59 return generic_plog1p(_x);
62 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
63 Packet8f pexpm1<Packet8f>(
const Packet8f& _x) {
64 return generic_expm1(_x);
71 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
72 pexp<Packet8f>(
const Packet8f& _x) {
73 return pexp_float(_x);
78 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet8f
79 ptanh<Packet8f>(
const Packet8f& _x) {
80 return internal::generic_fast_tanh_float(_x);
85 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4d
86 pexp<Packet4d>(
const Packet4d& _x) {
87 return pexp_double(_x);
100 EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
101 Packet8f 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);
117 template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
118 Packet8f psqrt<Packet8f>(
const Packet8f& _x) {
119 return _mm256_sqrt_ps(_x);
124 template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
125 Packet4d psqrt<Packet4d>(
const Packet4d& _x) {
126 return _mm256_sqrt_pd(_x);
130 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
131 Packet8f 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);
163 template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
164 Packet8f prsqrt<Packet8f>(
const Packet8f& _x) {
165 _EIGEN_DECLARE_CONST_Packet8f(one, 1.0f);
166 return _mm256_div_ps(p8f_one, _mm256_sqrt_ps(_x));
170 template <> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
171 Packet4d prsqrt<Packet4d>(
const Packet4d& _x) {
172 _EIGEN_DECLARE_CONST_Packet4d(one, 1.0);
173 return _mm256_div_pd(p4d_one, _mm256_sqrt_pd(_x));
176 F16_PACKET_FUNCTION(Packet8f, Packet8h, psin)
177 F16_PACKET_FUNCTION(Packet8f, Packet8h, pcos)
178 F16_PACKET_FUNCTION(Packet8f, Packet8h, plog)
179 F16_PACKET_FUNCTION(Packet8f, Packet8h, plog2)
180 F16_PACKET_FUNCTION(Packet8f, Packet8h, plog1p)
181 F16_PACKET_FUNCTION(Packet8f, Packet8h, pexpm1)
182 F16_PACKET_FUNCTION(Packet8f, Packet8h, pexp)
183 F16_PACKET_FUNCTION(Packet8f, Packet8h, ptanh)
184 F16_PACKET_FUNCTION(Packet8f, Packet8h, psqrt)
185 F16_PACKET_FUNCTION(Packet8f, Packet8h, prsqrt)
188 EIGEN_STRONG_INLINE Packet8h pfrexp(
const Packet8h& a, Packet8h& exponent) {
190 const Packet8h out = float2half(pfrexp<Packet8f>(half2float(a), fexponent));
191 exponent = float2half(fexponent);
196 EIGEN_STRONG_INLINE Packet8h pldexp(
const Packet8h& a,
const Packet8h& exponent) {
197 return float2half(pldexp<Packet8f>(half2float(a), half2float(exponent)));
200 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, psin)
201 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, pcos)
202 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, plog)
203 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, plog2)
204 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, plog1p)
205 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, pexpm1)
206 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, pexp)
207 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, ptanh)
208 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, psqrt)
209 BF16_PACKET_FUNCTION(Packet8f, Packet8bf, prsqrt)
212 EIGEN_STRONG_INLINE Packet8bf pfrexp(
const Packet8bf& a, Packet8bf& exponent) {
214 const Packet8bf out = F32ToBf16(pfrexp<Packet8f>(Bf16ToF32(a), fexponent));
215 exponent = F32ToBf16(fexponent);
220 EIGEN_STRONG_INLINE Packet8bf pldexp(
const Packet8bf& a,
const Packet8bf& exponent) {
221 return F32ToBf16(pldexp<Packet8f>(Bf16ToF32(a), Bf16ToF32(exponent)));
228 #endif // EIGEN_MATH_FUNCTIONS_AVX_H Namespace containing all symbols from the Eigen library.
Definition: Core:141
Definition: Eigen_Colamd.h:50