11#ifndef THIRD_PARTY_EIGEN3_EIGEN_SRC_CORE_ARCH_AVX512_MATHFUNCTIONS_H_
12#define THIRD_PARTY_EIGEN3_EIGEN_SRC_CORE_ARCH_AVX512_MATHFUNCTIONS_H_
15#include "../../InternalHeaderCheck.h"
20EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_FLOAT(Packet16f)
21EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_DOUBLE(Packet8d)
24EIGEN_STRONG_INLINE Packet16h pfrexp(
const Packet16h& a, Packet16h& exponent) {
26 const Packet16h out = float2half(pfrexp<Packet16f>(half2float(a), fexponent));
27 exponent = float2half(fexponent);
32EIGEN_STRONG_INLINE Packet16h pldexp(
const Packet16h& a,
const Packet16h& exponent) {
33 return float2half(pldexp<Packet16f>(half2float(a), half2float(exponent)));
37EIGEN_STRONG_INLINE Packet16bf pfrexp(
const Packet16bf& a, Packet16bf& exponent) {
41 const Packet16bf out = F32ToBf16Truncate(pfrexp<Packet16f>(Bf16ToF32(a), fexponent));
42 exponent = F32ToBf16Truncate(fexponent);
47EIGEN_STRONG_INLINE Packet16bf pldexp(
const Packet16bf& a,
const Packet16bf& exponent) {
48 return F32ToBf16(pldexp<Packet16f>(Bf16ToF32(a), Bf16ToF32(exponent)));
53EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16f psqrt<Packet16f>(
const Packet16f& x) {
54 return generic_sqrt_newton_step<Packet16f>::run(x, _mm512_rsqrt14_ps(x));
58EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8d psqrt<Packet8d>(
const Packet8d& x) {
59#ifdef EIGEN_VECTORIZE_AVX512ER
60 return generic_sqrt_newton_step<Packet8d, 1>::run(x, _mm512_rsqrt28_pd(x));
62 return generic_sqrt_newton_step<Packet8d, 2>::run(x, _mm512_rsqrt14_pd(x));
67EIGEN_STRONG_INLINE Packet16f psqrt<Packet16f>(
const Packet16f& x) {
68 return _mm512_sqrt_ps(x);
72EIGEN_STRONG_INLINE Packet8d psqrt<Packet8d>(
const Packet8d& x) {
73 return _mm512_sqrt_pd(x);
78#if defined(EIGEN_VECTORIZE_AVX512ER)
80EIGEN_STRONG_INLINE Packet16f prsqrt<Packet16f>(
const Packet16f& x) {
81 return _mm512_rsqrt28_ps(x);
86EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet16f prsqrt<Packet16f>(
const Packet16f& x) {
87 return generic_rsqrt_newton_step<Packet16f, 1>::run(x, _mm512_rsqrt14_ps(x));
94EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet8d prsqrt<Packet8d>(
const Packet8d& x) {
95#ifdef EIGEN_VECTORIZE_AVX512ER
96 return generic_rsqrt_newton_step<Packet8d, 1>::run(x, _mm512_rsqrt28_pd(x));
98 return generic_rsqrt_newton_step<Packet8d, 2>::run(x, _mm512_rsqrt14_pd(x));
103EIGEN_STRONG_INLINE Packet16f preciprocal<Packet16f>(
const Packet16f& a) {
104#ifdef EIGEN_VECTORIZE_AVX512ER
105 return _mm512_rcp28_ps(a);
110 const Packet16f one = pset1<Packet16f>(1.0f);
111 const Packet16f x = _mm512_rcp14_ps(a);
112 const Packet16f refined = pmadd(x, pnmadd(a, x, one), x);
113 const __mmask16 redo = _mm512_cmp_ps_mask(refined, _mm512_setzero_ps(), _CMP_EQ_UQ);
114 return redo == 0 ? refined : _mm512_mask_div_ps(refined, redo, one, a);
119EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_BF16(Packet16f, Packet16bf)
121#ifndef EIGEN_VECTORIZE_AVX512FP16
122EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_F16(Packet16f, Packet16h)