1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // This Source Code Form is subject to the terms of the Mozilla
5 // Public License v. 2.0. If a copy of the MPL was not distributed
6 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
8 #ifndef EIGEN_MATH_FUNCTIONS_NEON_H
9 #define EIGEN_MATH_FUNCTIONS_NEON_H
10
11 namespace Eigen {
12
13 namespace internal {
14
15 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2f pexp<Packet2f>(const Packet2f& x)
16 { return pexp_float(x); }
17 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f pexp<Packet4f>(const Packet4f& x)
18 { return pexp_float(x); }
19
20 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2f plog<Packet2f>(const Packet2f& x)
21 { return plog_float(x); }
22 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f plog<Packet4f>(const Packet4f& x)
23 { return plog_float(x); }
24
25 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2f psin<Packet2f>(const Packet2f& x)
26 { return psin_float(x); }
27 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f psin<Packet4f>(const Packet4f& x)
28 { return psin_float(x); }
29
30 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2f pcos<Packet2f>(const Packet2f& x)
31 { return pcos_float(x); }
32 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f pcos<Packet4f>(const Packet4f& x)
33 { return pcos_float(x); }
34
35 // Hyperbolic Tangent function.
36 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2f ptanh<Packet2f>(const Packet2f& x)
37 { return internal::generic_fast_tanh_float(x); }
38 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet4f ptanh<Packet4f>(const Packet4f& x)
39 { return internal::generic_fast_tanh_float(x); }
40
BF16_PACKET_FUNCTION(Packet4f,Packet4bf,psin)41 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, psin)
42 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pcos)
43 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, plog)
44 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, pexp)
45 BF16_PACKET_FUNCTION(Packet4f, Packet4bf, ptanh)
46
47 template <>
48 EIGEN_STRONG_INLINE Packet4bf pfrexp(const Packet4bf& a, Packet4bf& exponent) {
49 Packet4f fexponent;
50 const Packet4bf out = F32ToBf16(pfrexp<Packet4f>(Bf16ToF32(a), fexponent));
51 exponent = F32ToBf16(fexponent);
52 return out;
53 }
54
55 template <>
pldexp(const Packet4bf & a,const Packet4bf & exponent)56 EIGEN_STRONG_INLINE Packet4bf pldexp(const Packet4bf& a, const Packet4bf& exponent) {
57 return F32ToBf16(pldexp<Packet4f>(Bf16ToF32(a), Bf16ToF32(exponent)));
58 }
59
60 //---------- double ----------
61
62 #if EIGEN_ARCH_ARM64 && !EIGEN_APPLE_DOUBLE_NEON_BUG
63 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2d pexp<Packet2d>(const Packet2d& x)
64 { return pexp_double(x); }
65
66 template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED Packet2d plog<Packet2d>(const Packet2d& x)
67 { return plog_double(x); }
68
69 #endif
70
71 } // end namespace internal
72
73 } // end namespace Eigen
74
75 #endif // EIGEN_MATH_FUNCTIONS_NEON_H
76