#ifndef EIGEN_NEON_BESSELFUNCTIONS_H #define EIGEN_NEON_BESSELFUNCTIONS_H namespace Eigen { namespace internal { #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC #define NEON_HALF_TO_FLOAT_FUNCTIONS(METHOD) \ template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \ Packet8hf METHOD(const Packet8hf& x) { \ const Packet4f lo = METHOD(vcvt_f32_f16(vget_low_f16(x))); \ const Packet4f hi = METHOD(vcvt_f32_f16(vget_high_f16(x))); \ return vcombine_f16(vcvt_f16_f32(lo), vcvt_f16_f32(hi)); \ } \ \ template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE \ Packet4hf METHOD(const Packet4hf& x) { \ return vcvt_f16_f32(METHOD(vcvt_f32_f16(x))); \ } NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_i0) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_i0e) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_i1) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_i1e) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_j0) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_j1) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_k0) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_k0e) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_k1) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_k1e) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_y0) NEON_HALF_TO_FLOAT_FUNCTIONS(pbessel_y1) #undef NEON_HALF_TO_FLOAT_FUNCTIONS #endif BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_i0) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_i0e) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_i1) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_i1e) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_j0) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_j1) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_k0) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_k0e) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_k1) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_k1e) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_y0) BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pbessel_y1) } // namespace internal } // namespace Eigen #endif // EIGEN_NEON_BESSELFUNCTIONS_H