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