xref: /aosp_15_r20/external/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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