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 
11 float acosf (float);
12 float acoshf (float);
13 float asinf (float);
14 float asinhf (float);
15 float atan2f (float, float);
16 float atanf (float);
17 float atanhf (float);
18 float cbrtf (float);
19 float coshf (float);
20 float cospif (float);
21 float erfcf (float);
22 float erff (float);
23 float erfinvf (float);
24 float exp10f (float);
25 float expm1f (float);
26 float log10f (float);
27 float log1pf (float);
28 float sinhf (float);
29 float sinpif (float);
30 float tanf (float);
31 float tanhf (float);
32 
33 double acos (double);
34 double acosh (double);
35 double asin (double);
36 double asinh (double);
37 double atan (double);
38 double atan2 (double, double);
39 double atanh (double);
40 double cbrt (double);
41 double cosh (double);
42 double cospi (double);
43 double erfc (double);
44 double erfinv (double);
45 double exp10 (double);
46 double expm1 (double);
47 double log10 (double);
48 double log1p (double);
49 double sinh (double);
50 double sinpi (double);
51 double tanh (double);
52 
53 long double cospil (long double);
54 long double erfinvl (long double);
55 long double exp10l (long double);
56 long double sinpil (long double);
57 
58 #if __aarch64__
59 # if __GNUC__ >= 5
60 typedef __Float32x4_t __f32x4_t;
61 typedef __Float64x2_t __f64x2_t;
62 # elif __clang_major__ * 100 + __clang_minor__ >= 305
63 typedef __attribute__ ((__neon_vector_type__ (4))) float __f32x4_t;
64 typedef __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 
72 typedef struct __f32x4x2_t
73 {
74   __f32x4_t val[2];
75 } __f32x4x2_t;
76 
77 typedef 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>
140 svfloat32_t _ZGVsMxv_acoshf (svfloat32_t, svbool_t);
141 svfloat64_t _ZGVsMxv_acosh (svfloat64_t, svbool_t);
142 svfloat32_t _ZGVsMxv_acosf (svfloat32_t, svbool_t);
143 svfloat64_t _ZGVsMxv_acos (svfloat64_t, svbool_t);
144 svfloat32_t _ZGVsMxv_asinhf (svfloat32_t, svbool_t);
145 svfloat64_t _ZGVsMxv_asinh (svfloat64_t, svbool_t);
146 svfloat32_t _ZGVsMxv_asinf (svfloat32_t, svbool_t);
147 svfloat64_t _ZGVsMxv_asin (svfloat64_t, svbool_t);
148 svfloat32_t _ZGVsMxv_atanhf (svfloat32_t, svbool_t);
149 svfloat64_t _ZGVsMxv_atanh (svfloat64_t, svbool_t);
150 svfloat32_t _ZGVsMxvv_atan2f (svfloat32_t, svfloat32_t, svbool_t);
151 svfloat32_t _ZGVsMxv_atanf (svfloat32_t, svbool_t);
152 svfloat64_t _ZGVsMxv_atan (svfloat64_t, svbool_t);
153 svfloat64_t _ZGVsMxvv_atan2 (svfloat64_t, svfloat64_t, svbool_t);
154 svfloat32_t _ZGVsMxv_cbrtf (svfloat32_t, svbool_t);
155 svfloat64_t _ZGVsMxv_cbrt (svfloat64_t, svbool_t);
156 svfloat32x2_t _ZGVsMxv_cexpif (svfloat32_t, svbool_t);
157 svfloat64x2_t _ZGVsMxv_cexpi (svfloat64_t, svbool_t);
158 svfloat32_t _ZGVsMxv_coshf (svfloat32_t, svbool_t);
159 svfloat64_t _ZGVsMxv_cosh (svfloat64_t, svbool_t);
160 svfloat32_t _ZGVsMxv_cosf (svfloat32_t, svbool_t);
161 svfloat32_t _ZGVsMxv_cospif (svfloat32_t, svbool_t);
162 svfloat64_t _ZGVsMxv_cos (svfloat64_t, svbool_t);
163 svfloat64_t _ZGVsMxv_cospi (svfloat64_t, svbool_t);
164 svfloat32_t _ZGVsMxv_erff (svfloat32_t, svbool_t);
165 svfloat64_t _ZGVsMxv_erf (svfloat64_t, svbool_t);
166 svfloat64_t _ZGVsMxv_erfc (svfloat64_t, svbool_t);
167 svfloat32_t _ZGVsMxv_erfcf (svfloat32_t, svbool_t);
168 svfloat32_t _ZGVsMxv_expf (svfloat32_t, svbool_t);
169 svfloat64_t _ZGVsMxv_exp (svfloat64_t, svbool_t);
170 svfloat32_t _ZGVsMxv_exp10f (svfloat32_t, svbool_t);
171 svfloat64_t _ZGVsMxv_exp10 (svfloat64_t, svbool_t);
172 svfloat32_t _ZGVsMxv_exp2f (svfloat32_t, svbool_t);
173 svfloat64_t _ZGVsMxv_exp2 (svfloat64_t, svbool_t);
174 svfloat32_t _ZGVsMxv_expm1f (svfloat32_t, svbool_t);
175 svfloat64_t _ZGVsMxv_expm1 (svfloat64_t, svbool_t);
176 svfloat32_t _ZGVsMxvv_hypotf (svfloat32_t, svfloat32_t, svbool_t);
177 svfloat64_t _ZGVsMxvv_hypot (svfloat64_t, svfloat64_t, svbool_t);
178 svfloat32_t _ZGVsMxv_logf (svfloat32_t, svbool_t);
179 svfloat64_t _ZGVsMxv_log (svfloat64_t, svbool_t);
180 svfloat32_t _ZGVsMxv_log10f (svfloat32_t, svbool_t);
181 svfloat64_t _ZGVsMxv_log10 (svfloat64_t, svbool_t);
182 svfloat32_t _ZGVsMxv_log1pf (svfloat32_t, svbool_t);
183 svfloat64_t _ZGVsMxv_log1p (svfloat64_t, svbool_t);
184 svfloat32_t _ZGVsMxv_log2f (svfloat32_t, svbool_t);
185 svfloat64_t _ZGVsMxv_log2 (svfloat64_t, svbool_t);
186 svfloat32_t _ZGVsMxvv_powi (svfloat32_t, svint32_t, svbool_t);
187 svfloat64_t _ZGVsMxvv_powk (svfloat64_t, svint64_t, svbool_t);
188 svfloat32_t _ZGVsMxvv_powf (svfloat32_t, svfloat32_t, svbool_t);
189 svfloat64_t _ZGVsMxvv_pow (svfloat64_t, svfloat64_t, svbool_t);
190 svfloat32_t _ZGVsMxv_sinhf (svfloat32_t, svbool_t);
191 svfloat64_t _ZGVsMxv_sinh (svfloat64_t, svbool_t);
192 svfloat32_t _ZGVsMxv_sinf (svfloat32_t, svbool_t);
193 svfloat32_t _ZGVsMxv_sinpif (svfloat32_t, svbool_t);
194 svfloat64_t _ZGVsMxv_sin (svfloat64_t, svbool_t);
195 svfloat64_t _ZGVsMxv_sinpi (svfloat64_t, svbool_t);
196 svfloat32_t _ZGVsMxv_tanhf (svfloat32_t, svbool_t);
197 svfloat64_t _ZGVsMxv_tanh (svfloat64_t, svbool_t);
198 svfloat32_t _ZGVsMxv_tanf (svfloat32_t, svbool_t);
199 svfloat64_t _ZGVsMxv_tan (svfloat64_t, svbool_t);
200 void _ZGVsMxvl4l4_sincosf (svfloat32_t, float *, float *, svbool_t);
201 void _ZGVsMxvl8l8_sincos (svfloat64_t, double *, double *, svbool_t);
202 # endif
203 
204 #endif
205 
206 #endif
207