xref: /aosp_15_r20/external/arm-optimized-routines/pl/math/include/mathlib.h (revision 412f47f9e737e10ed5cc46ec6a8d7fa2264f8a14)
1*412f47f9SXin Li /*
2*412f47f9SXin Li  * Public API.
3*412f47f9SXin Li  *
4*412f47f9SXin Li  * Copyright (c) 2015-2024, Arm Limited.
5*412f47f9SXin Li  * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
6*412f47f9SXin Li  */
7*412f47f9SXin Li 
8*412f47f9SXin Li #ifndef _MATHLIB_H
9*412f47f9SXin Li #define _MATHLIB_H
10*412f47f9SXin Li 
11*412f47f9SXin Li float acosf (float);
12*412f47f9SXin Li float acoshf (float);
13*412f47f9SXin Li float asinf (float);
14*412f47f9SXin Li float asinhf (float);
15*412f47f9SXin Li float atan2f (float, float);
16*412f47f9SXin Li float atanf (float);
17*412f47f9SXin Li float atanhf (float);
18*412f47f9SXin Li float cbrtf (float);
19*412f47f9SXin Li float coshf (float);
20*412f47f9SXin Li float cospif (float);
21*412f47f9SXin Li float erfcf (float);
22*412f47f9SXin Li float erff (float);
23*412f47f9SXin Li float erfinvf (float);
24*412f47f9SXin Li float exp10f (float);
25*412f47f9SXin Li float expm1f (float);
26*412f47f9SXin Li float log10f (float);
27*412f47f9SXin Li float log1pf (float);
28*412f47f9SXin Li float sinhf (float);
29*412f47f9SXin Li float sinpif (float);
30*412f47f9SXin Li float tanf (float);
31*412f47f9SXin Li float tanhf (float);
32*412f47f9SXin Li 
33*412f47f9SXin Li double acos (double);
34*412f47f9SXin Li double acosh (double);
35*412f47f9SXin Li double asin (double);
36*412f47f9SXin Li double asinh (double);
37*412f47f9SXin Li double atan (double);
38*412f47f9SXin Li double atan2 (double, double);
39*412f47f9SXin Li double atanh (double);
40*412f47f9SXin Li double cbrt (double);
41*412f47f9SXin Li double cosh (double);
42*412f47f9SXin Li double cospi (double);
43*412f47f9SXin Li double erfc (double);
44*412f47f9SXin Li double erfinv (double);
45*412f47f9SXin Li double exp10 (double);
46*412f47f9SXin Li double expm1 (double);
47*412f47f9SXin Li double log10 (double);
48*412f47f9SXin Li double log1p (double);
49*412f47f9SXin Li double sinh (double);
50*412f47f9SXin Li double sinpi (double);
51*412f47f9SXin Li double tanh (double);
52*412f47f9SXin Li 
53*412f47f9SXin Li long double cospil (long double);
54*412f47f9SXin Li long double erfinvl (long double);
55*412f47f9SXin Li long double exp10l (long double);
56*412f47f9SXin Li long double sinpil (long double);
57*412f47f9SXin Li 
58*412f47f9SXin Li #if __aarch64__
59*412f47f9SXin Li # if __GNUC__ >= 5
60*412f47f9SXin Li typedef __Float32x4_t __f32x4_t;
61*412f47f9SXin Li typedef __Float64x2_t __f64x2_t;
62*412f47f9SXin Li # elif __clang_major__ * 100 + __clang_minor__ >= 305
63*412f47f9SXin Li typedef __attribute__ ((__neon_vector_type__ (4))) float __f32x4_t;
64*412f47f9SXin Li typedef __attribute__ ((__neon_vector_type__ (2))) double __f64x2_t;
65*412f47f9SXin Li # else
66*412f47f9SXin Li #  error Unsupported compiler
67*412f47f9SXin Li # endif
68*412f47f9SXin Li 
69*412f47f9SXin Li # if __GNUC__ >= 9 || __clang_major__ >= 8
70*412f47f9SXin Li #  define __vpcs __attribute__ ((__aarch64_vector_pcs__))
71*412f47f9SXin Li 
72*412f47f9SXin Li typedef struct __f32x4x2_t
73*412f47f9SXin Li {
74*412f47f9SXin Li   __f32x4_t val[2];
75*412f47f9SXin Li } __f32x4x2_t;
76*412f47f9SXin Li 
77*412f47f9SXin Li typedef struct __f64x2x2_t
78*412f47f9SXin Li {
79*412f47f9SXin Li   __f64x2_t val[2];
80*412f47f9SXin Li } __f64x2x2_t;
81*412f47f9SXin Li 
82*412f47f9SXin Li /* Vector functions following the vector PCS using ABI names.  */
83*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_acoshf (__f32x4_t);
84*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_acosh (__f64x2_t);
85*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_acosf (__f32x4_t);
86*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_acos (__f64x2_t);
87*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_asinf (__f32x4_t);
88*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_asin (__f64x2_t);
89*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_asinhf (__f32x4_t);
90*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_asinh (__f64x2_t);
91*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_atanf (__f32x4_t);
92*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_atan (__f64x2_t);
93*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4vv_atan2f (__f32x4_t, __f32x4_t);
94*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2vv_atan2 (__f64x2_t, __f64x2_t);
95*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_atanhf (__f32x4_t);
96*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_atanh (__f64x2_t);
97*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_cbrtf (__f32x4_t);
98*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_cbrt (__f64x2_t);
99*412f47f9SXin Li __vpcs __f32x4x2_t _ZGVnN4v_cexpif (__f32x4_t);
100*412f47f9SXin Li __vpcs __f64x2x2_t _ZGVnN2v_cexpi (__f64x2_t);
101*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_coshf (__f32x4_t);
102*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_cosh (__f64x2_t);
103*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_cospif (__f32x4_t);
104*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_cospi (__f64x2_t);
105*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_erff (__f32x4_t);
106*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_erf (__f64x2_t);
107*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_erfcf (__f32x4_t);
108*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_erfc (__f64x2_t);
109*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_erfinvf (__f32x4_t);
110*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_erfinv (__f64x2_t);
111*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_exp10f (__f32x4_t);
112*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_exp10 (__f64x2_t);
113*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_exp2 (__f64x2_t);
114*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_expm1f (__f32x4_t);
115*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_expm1 (__f64x2_t);
116*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4vv_hypotf (__f32x4_t, __f32x4_t);
117*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2vv_hypot (__f64x2_t, __f64x2_t);
118*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_log10f (__f32x4_t);
119*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_log10 (__f64x2_t);
120*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_log1pf (__f32x4_t);
121*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_log1p (__f64x2_t);
122*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_log2f (__f32x4_t);
123*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_log2 (__f64x2_t);
124*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t);
125*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_sinhf (__f32x4_t);
126*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_sinh (__f64x2_t);
127*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_sinpif (__f32x4_t);
128*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_sinpi (__f64x2_t);
129*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_tanf (__f32x4_t);
130*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_tan (__f64x2_t);
131*412f47f9SXin Li __vpcs __f32x4_t _ZGVnN4v_tanhf (__f32x4_t);
132*412f47f9SXin Li __vpcs __f64x2_t _ZGVnN2v_tanh (__f64x2_t);
133*412f47f9SXin Li __vpcs void _ZGVnN4vl4l4_sincosf (__f32x4_t, __f32x4_t *, __f32x4_t *);
134*412f47f9SXin Li __vpcs void _ZGVnN2vl8l8_sincos (__f64x2_t, __f64x2_t *, __f64x2_t *);
135*412f47f9SXin Li 
136*412f47f9SXin Li # endif
137*412f47f9SXin Li 
138*412f47f9SXin Li # if WANT_SVE_MATH
139*412f47f9SXin Li #  include <arm_sve.h>
140*412f47f9SXin Li svfloat32_t _ZGVsMxv_acoshf (svfloat32_t, svbool_t);
141*412f47f9SXin Li svfloat64_t _ZGVsMxv_acosh (svfloat64_t, svbool_t);
142*412f47f9SXin Li svfloat32_t _ZGVsMxv_acosf (svfloat32_t, svbool_t);
143*412f47f9SXin Li svfloat64_t _ZGVsMxv_acos (svfloat64_t, svbool_t);
144*412f47f9SXin Li svfloat32_t _ZGVsMxv_asinhf (svfloat32_t, svbool_t);
145*412f47f9SXin Li svfloat64_t _ZGVsMxv_asinh (svfloat64_t, svbool_t);
146*412f47f9SXin Li svfloat32_t _ZGVsMxv_asinf (svfloat32_t, svbool_t);
147*412f47f9SXin Li svfloat64_t _ZGVsMxv_asin (svfloat64_t, svbool_t);
148*412f47f9SXin Li svfloat32_t _ZGVsMxv_atanhf (svfloat32_t, svbool_t);
149*412f47f9SXin Li svfloat64_t _ZGVsMxv_atanh (svfloat64_t, svbool_t);
150*412f47f9SXin Li svfloat32_t _ZGVsMxvv_atan2f (svfloat32_t, svfloat32_t, svbool_t);
151*412f47f9SXin Li svfloat32_t _ZGVsMxv_atanf (svfloat32_t, svbool_t);
152*412f47f9SXin Li svfloat64_t _ZGVsMxv_atan (svfloat64_t, svbool_t);
153*412f47f9SXin Li svfloat64_t _ZGVsMxvv_atan2 (svfloat64_t, svfloat64_t, svbool_t);
154*412f47f9SXin Li svfloat32_t _ZGVsMxv_cbrtf (svfloat32_t, svbool_t);
155*412f47f9SXin Li svfloat64_t _ZGVsMxv_cbrt (svfloat64_t, svbool_t);
156*412f47f9SXin Li svfloat32x2_t _ZGVsMxv_cexpif (svfloat32_t, svbool_t);
157*412f47f9SXin Li svfloat64x2_t _ZGVsMxv_cexpi (svfloat64_t, svbool_t);
158*412f47f9SXin Li svfloat32_t _ZGVsMxv_coshf (svfloat32_t, svbool_t);
159*412f47f9SXin Li svfloat64_t _ZGVsMxv_cosh (svfloat64_t, svbool_t);
160*412f47f9SXin Li svfloat32_t _ZGVsMxv_cosf (svfloat32_t, svbool_t);
161*412f47f9SXin Li svfloat32_t _ZGVsMxv_cospif (svfloat32_t, svbool_t);
162*412f47f9SXin Li svfloat64_t _ZGVsMxv_cos (svfloat64_t, svbool_t);
163*412f47f9SXin Li svfloat64_t _ZGVsMxv_cospi (svfloat64_t, svbool_t);
164*412f47f9SXin Li svfloat32_t _ZGVsMxv_erff (svfloat32_t, svbool_t);
165*412f47f9SXin Li svfloat64_t _ZGVsMxv_erf (svfloat64_t, svbool_t);
166*412f47f9SXin Li svfloat64_t _ZGVsMxv_erfc (svfloat64_t, svbool_t);
167*412f47f9SXin Li svfloat32_t _ZGVsMxv_erfcf (svfloat32_t, svbool_t);
168*412f47f9SXin Li svfloat32_t _ZGVsMxv_erfinvf (svfloat32_t, svbool_t);
169*412f47f9SXin Li svfloat64_t _ZGVsMxv_erfinv (svfloat64_t, svbool_t);
170*412f47f9SXin Li svfloat32_t _ZGVsMxv_expf (svfloat32_t, svbool_t);
171*412f47f9SXin Li svfloat64_t _ZGVsMxv_exp (svfloat64_t, svbool_t);
172*412f47f9SXin Li svfloat32_t _ZGVsMxv_exp10f (svfloat32_t, svbool_t);
173*412f47f9SXin Li svfloat64_t _ZGVsMxv_exp10 (svfloat64_t, svbool_t);
174*412f47f9SXin Li svfloat32_t _ZGVsMxv_exp2f (svfloat32_t, svbool_t);
175*412f47f9SXin Li svfloat64_t _ZGVsMxv_exp2 (svfloat64_t, svbool_t);
176*412f47f9SXin Li svfloat32_t _ZGVsMxv_expm1f (svfloat32_t, svbool_t);
177*412f47f9SXin Li svfloat64_t _ZGVsMxv_expm1 (svfloat64_t, svbool_t);
178*412f47f9SXin Li svfloat32_t _ZGVsMxvv_hypotf (svfloat32_t, svfloat32_t, svbool_t);
179*412f47f9SXin Li svfloat64_t _ZGVsMxvv_hypot (svfloat64_t, svfloat64_t, svbool_t);
180*412f47f9SXin Li svfloat32_t _ZGVsMxv_logf (svfloat32_t, svbool_t);
181*412f47f9SXin Li svfloat64_t _ZGVsMxv_log (svfloat64_t, svbool_t);
182*412f47f9SXin Li svfloat32_t _ZGVsMxv_log10f (svfloat32_t, svbool_t);
183*412f47f9SXin Li svfloat64_t _ZGVsMxv_log10 (svfloat64_t, svbool_t);
184*412f47f9SXin Li svfloat32_t _ZGVsMxv_log1pf (svfloat32_t, svbool_t);
185*412f47f9SXin Li svfloat64_t _ZGVsMxv_log1p (svfloat64_t, svbool_t);
186*412f47f9SXin Li svfloat32_t _ZGVsMxv_log2f (svfloat32_t, svbool_t);
187*412f47f9SXin Li svfloat64_t _ZGVsMxv_log2 (svfloat64_t, svbool_t);
188*412f47f9SXin Li svfloat32_t _ZGVsMxvv_powi (svfloat32_t, svint32_t, svbool_t);
189*412f47f9SXin Li svfloat64_t _ZGVsMxvv_powk (svfloat64_t, svint64_t, svbool_t);
190*412f47f9SXin Li svfloat32_t _ZGVsMxvv_powf (svfloat32_t, svfloat32_t, svbool_t);
191*412f47f9SXin Li svfloat64_t _ZGVsMxvv_pow (svfloat64_t, svfloat64_t, svbool_t);
192*412f47f9SXin Li svfloat32_t _ZGVsMxv_sinhf (svfloat32_t, svbool_t);
193*412f47f9SXin Li svfloat64_t _ZGVsMxv_sinh (svfloat64_t, svbool_t);
194*412f47f9SXin Li svfloat32_t _ZGVsMxv_sinf (svfloat32_t, svbool_t);
195*412f47f9SXin Li svfloat32_t _ZGVsMxv_sinpif (svfloat32_t, svbool_t);
196*412f47f9SXin Li svfloat64_t _ZGVsMxv_sin (svfloat64_t, svbool_t);
197*412f47f9SXin Li svfloat64_t _ZGVsMxv_sinpi (svfloat64_t, svbool_t);
198*412f47f9SXin Li svfloat32_t _ZGVsMxv_tanhf (svfloat32_t, svbool_t);
199*412f47f9SXin Li svfloat64_t _ZGVsMxv_tanh (svfloat64_t, svbool_t);
200*412f47f9SXin Li svfloat32_t _ZGVsMxv_tanf (svfloat32_t, svbool_t);
201*412f47f9SXin Li svfloat64_t _ZGVsMxv_tan (svfloat64_t, svbool_t);
202*412f47f9SXin Li void _ZGVsMxvl4l4_sincosf (svfloat32_t, float *, float *, svbool_t);
203*412f47f9SXin Li void _ZGVsMxvl8l8_sincos (svfloat64_t, double *, double *, svbool_t);
204*412f47f9SXin Li # endif
205*412f47f9SXin Li 
206*412f47f9SXin Li #endif
207*412f47f9SXin Li 
208*412f47f9SXin Li #endif
209