• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef EIGEN_NEON_SPECIALFUNCTIONS_H
2 #define EIGEN_NEON_SPECIALFUNCTIONS_H
3 
4 namespace Eigen {
5 namespace internal {
6 
7 #if EIGEN_HAS_ARM64_FP16_VECTOR_ARITHMETIC
8 
9 #define NEON_HALF_TO_FLOAT_FUNCTIONS(METHOD)                            \
10 template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                       \
11 Packet8hf METHOD<Packet8hf>(const Packet8hf& x) {                       \
12   const Packet4f lo = METHOD<Packet4f>(vcvt_f32_f16(vget_low_f16(x)));  \
13   const Packet4f hi = METHOD<Packet4f>(vcvt_f32_f16(vget_high_f16(x))); \
14   return vcombine_f16(vcvt_f16_f32(lo), vcvt_f16_f32(hi));              \
15 }                                                                       \
16                                                                         \
17 template <> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE                       \
18 Packet4hf METHOD<Packet4hf>(const Packet4hf& x) {                       \
19   return vcvt_f16_f32(METHOD<Packet4f>(vcvt_f32_f16(x)));               \
20 }
21 
22 NEON_HALF_TO_FLOAT_FUNCTIONS(perf)
23 NEON_HALF_TO_FLOAT_FUNCTIONS(pndtri)
24 
25 #undef NEON_HALF_TO_FLOAT_FUNCTIONS
26 #endif
27 
28 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, perf)
29 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pndtri)
30 
31 }  // namespace internal
32 }  // namespace Eigen
33 
34 #endif  // EIGEN_NEON_SPECIALFUNCTIONS_H
35