master
1/* Platform-specific SIMD declarations of math functions.
2
3 Copyright (C) 2023-2025 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20#ifndef _MATH_H
21# error "Never include <bits/math-vector.h> directly;\
22 include <math.h> instead."
23#endif
24
25/* Get default empty definitions for simd declarations. */
26#include <bits/libm-simd-decl-stubs.h>
27
28#if defined __aarch64__ && defined __FAST_MATH__ && __GNUC_PREREQ (6, 0)
29/* Requires GCC >= 6 for __attribute__ ((__simd__)). */
30# define __DECL_SIMD_aarch64 __attribute__ ((__simd__ ("notinbranch"), const))
31
32# undef __DECL_SIMD_acos
33# define __DECL_SIMD_acos __DECL_SIMD_aarch64
34# undef __DECL_SIMD_acosf
35# define __DECL_SIMD_acosf __DECL_SIMD_aarch64
36# undef __DECL_SIMD_acosh
37# define __DECL_SIMD_acosh __DECL_SIMD_aarch64
38# undef __DECL_SIMD_acoshf
39# define __DECL_SIMD_acoshf __DECL_SIMD_aarch64
40# undef __DECL_SIMD_acospi
41# define __DECL_SIMD_acospi __DECL_SIMD_aarch64
42# undef __DECL_SIMD_acospif
43# define __DECL_SIMD_acospif __DECL_SIMD_aarch64
44# undef __DECL_SIMD_asin
45# define __DECL_SIMD_asin __DECL_SIMD_aarch64
46# undef __DECL_SIMD_asinf
47# define __DECL_SIMD_asinf __DECL_SIMD_aarch64
48# undef __DECL_SIMD_asinh
49# define __DECL_SIMD_asinh __DECL_SIMD_aarch64
50# undef __DECL_SIMD_asinhf
51# define __DECL_SIMD_asinhf __DECL_SIMD_aarch64
52# undef __DECL_SIMD_asinpi
53# define __DECL_SIMD_asinpi __DECL_SIMD_aarch64
54# undef __DECL_SIMD_asinpif
55# define __DECL_SIMD_asinpif __DECL_SIMD_aarch64
56# undef __DECL_SIMD_atan
57# define __DECL_SIMD_atan __DECL_SIMD_aarch64
58# undef __DECL_SIMD_atanf
59# define __DECL_SIMD_atanf __DECL_SIMD_aarch64
60# undef __DECL_SIMD_atanh
61# define __DECL_SIMD_atanh __DECL_SIMD_aarch64
62# undef __DECL_SIMD_atanhf
63# define __DECL_SIMD_atanhf __DECL_SIMD_aarch64
64# undef __DECL_SIMD_atanpi
65# define __DECL_SIMD_atanpi __DECL_SIMD_aarch64
66# undef __DECL_SIMD_atanpif
67# define __DECL_SIMD_atanpif __DECL_SIMD_aarch64
68# undef __DECL_SIMD_atan2
69# define __DECL_SIMD_atan2 __DECL_SIMD_aarch64
70# undef __DECL_SIMD_atan2f
71# define __DECL_SIMD_atan2f __DECL_SIMD_aarch64
72# undef __DECL_SIMD_atan2pi
73# define __DECL_SIMD_atan2pi __DECL_SIMD_aarch64
74# undef __DECL_SIMD_atan2pif
75# define __DECL_SIMD_atan2pif __DECL_SIMD_aarch64
76# undef __DECL_SIMD_cbrt
77# define __DECL_SIMD_cbrt __DECL_SIMD_aarch64
78# undef __DECL_SIMD_cbrtf
79# define __DECL_SIMD_cbrtf __DECL_SIMD_aarch64
80# undef __DECL_SIMD_cos
81# define __DECL_SIMD_cos __DECL_SIMD_aarch64
82# undef __DECL_SIMD_cosf
83# define __DECL_SIMD_cosf __DECL_SIMD_aarch64
84# undef __DECL_SIMD_cosh
85# define __DECL_SIMD_cosh __DECL_SIMD_aarch64
86# undef __DECL_SIMD_coshf
87# define __DECL_SIMD_coshf __DECL_SIMD_aarch64
88# undef __DECL_SIMD_cospi
89# define __DECL_SIMD_cospi __DECL_SIMD_aarch64
90# undef __DECL_SIMD_cospif
91# define __DECL_SIMD_cospif __DECL_SIMD_aarch64
92# undef __DECL_SIMD_erf
93# define __DECL_SIMD_erf __DECL_SIMD_aarch64
94# undef __DECL_SIMD_erff
95# define __DECL_SIMD_erff __DECL_SIMD_aarch64
96# undef __DECL_SIMD_erfc
97# define __DECL_SIMD_erfc __DECL_SIMD_aarch64
98# undef __DECL_SIMD_erfcf
99# define __DECL_SIMD_erfcf __DECL_SIMD_aarch64
100# undef __DECL_SIMD_exp
101# define __DECL_SIMD_exp __DECL_SIMD_aarch64
102# undef __DECL_SIMD_expf
103# define __DECL_SIMD_expf __DECL_SIMD_aarch64
104# undef __DECL_SIMD_exp10
105# define __DECL_SIMD_exp10 __DECL_SIMD_aarch64
106# undef __DECL_SIMD_exp10f
107# define __DECL_SIMD_exp10f __DECL_SIMD_aarch64
108# undef __DECL_SIMD_exp2
109# define __DECL_SIMD_exp2 __DECL_SIMD_aarch64
110# undef __DECL_SIMD_exp2f
111# define __DECL_SIMD_exp2f __DECL_SIMD_aarch64
112# undef __DECL_SIMD_expm1
113# define __DECL_SIMD_expm1 __DECL_SIMD_aarch64
114# undef __DECL_SIMD_expm1f
115# define __DECL_SIMD_expm1f __DECL_SIMD_aarch64
116# undef __DECL_SIMD_hypot
117# define __DECL_SIMD_hypot __DECL_SIMD_aarch64
118# undef __DECL_SIMD_hypotf
119# define __DECL_SIMD_hypotf __DECL_SIMD_aarch64
120# undef __DECL_SIMD_log
121# define __DECL_SIMD_log __DECL_SIMD_aarch64
122# undef __DECL_SIMD_logf
123# define __DECL_SIMD_logf __DECL_SIMD_aarch64
124# undef __DECL_SIMD_log10
125# define __DECL_SIMD_log10 __DECL_SIMD_aarch64
126# undef __DECL_SIMD_log10f
127# define __DECL_SIMD_log10f __DECL_SIMD_aarch64
128# undef __DECL_SIMD_log1p
129# define __DECL_SIMD_log1p __DECL_SIMD_aarch64
130# undef __DECL_SIMD_log1pf
131# define __DECL_SIMD_log1pf __DECL_SIMD_aarch64
132# undef __DECL_SIMD_log2
133# define __DECL_SIMD_log2 __DECL_SIMD_aarch64
134# undef __DECL_SIMD_log2f
135# define __DECL_SIMD_log2f __DECL_SIMD_aarch64
136# undef __DECL_SIMD_logp1
137# define __DECL_SIMD_logp1 __DECL_SIMD_aarch64
138# undef __DECL_SIMD_logp1f
139# define __DECL_SIMD_logp1f __DECL_SIMD_aarch64
140# undef __DECL_SIMD_pow
141# define __DECL_SIMD_pow __DECL_SIMD_aarch64
142# undef __DECL_SIMD_powf
143# define __DECL_SIMD_powf __DECL_SIMD_aarch64
144# undef __DECL_SIMD_sin
145# define __DECL_SIMD_sin __DECL_SIMD_aarch64
146# undef __DECL_SIMD_sinf
147# define __DECL_SIMD_sinf __DECL_SIMD_aarch64
148# undef __DECL_SIMD_sinh
149# define __DECL_SIMD_sinh __DECL_SIMD_aarch64
150# undef __DECL_SIMD_sinhf
151# define __DECL_SIMD_sinhf __DECL_SIMD_aarch64
152# undef __DECL_SIMD_sinpi
153# define __DECL_SIMD_sinpi __DECL_SIMD_aarch64
154# undef __DECL_SIMD_sinpif
155# define __DECL_SIMD_sinpif __DECL_SIMD_aarch64
156# undef __DECL_SIMD_tan
157# define __DECL_SIMD_tan __DECL_SIMD_aarch64
158# undef __DECL_SIMD_tanf
159# define __DECL_SIMD_tanf __DECL_SIMD_aarch64
160# undef __DECL_SIMD_tanh
161# define __DECL_SIMD_tanh __DECL_SIMD_aarch64
162# undef __DECL_SIMD_tanhf
163# define __DECL_SIMD_tanhf __DECL_SIMD_aarch64
164# undef __DECL_SIMD_tanpi
165# define __DECL_SIMD_tanpi __DECL_SIMD_aarch64
166# undef __DECL_SIMD_tanpif
167# define __DECL_SIMD_tanpif __DECL_SIMD_aarch64
168#endif
169
170#if __GNUC_PREREQ(9, 0)
171# define __ADVSIMD_VEC_MATH_SUPPORTED
172typedef __Float32x4_t __f32x4_t;
173typedef __Float64x2_t __f64x2_t;
174#elif __glibc_clang_prereq(8, 0)
175# define __ADVSIMD_VEC_MATH_SUPPORTED
176typedef __attribute__ ((__neon_vector_type__ (4))) float __f32x4_t;
177typedef __attribute__ ((__neon_vector_type__ (2))) double __f64x2_t;
178#endif
179
180#if __GNUC_PREREQ(10, 0) || __glibc_clang_prereq(11, 0)
181# define __SVE_VEC_MATH_SUPPORTED
182typedef __SVFloat32_t __sv_f32_t;
183typedef __SVFloat64_t __sv_f64_t;
184typedef __SVBool_t __sv_bool_t;
185#endif
186
187/* If vector types and vector PCS are unsupported in the working
188 compiler, no choice but to omit vector math declarations. */
189
190#ifdef __ADVSIMD_VEC_MATH_SUPPORTED
191
192# define __vpcs __attribute__ ((__aarch64_vector_pcs__))
193
194__vpcs __f32x4_t _ZGVnN4vv_atan2f (__f32x4_t, __f32x4_t);
195__vpcs __f32x4_t _ZGVnN4vv_atan2pif (__f32x4_t, __f32x4_t);
196__vpcs __f32x4_t _ZGVnN4v_acosf (__f32x4_t);
197__vpcs __f32x4_t _ZGVnN4v_acoshf (__f32x4_t);
198__vpcs __f32x4_t _ZGVnN4v_acospif (__f32x4_t);
199__vpcs __f32x4_t _ZGVnN4v_asinf (__f32x4_t);
200__vpcs __f32x4_t _ZGVnN4v_asinhf (__f32x4_t);
201__vpcs __f32x4_t _ZGVnN4v_asinpif (__f32x4_t);
202__vpcs __f32x4_t _ZGVnN4v_atanf (__f32x4_t);
203__vpcs __f32x4_t _ZGVnN4v_atanhf (__f32x4_t);
204__vpcs __f32x4_t _ZGVnN4v_atanpif (__f32x4_t);
205__vpcs __f32x4_t _ZGVnN4v_cbrtf (__f32x4_t);
206__vpcs __f32x4_t _ZGVnN4v_cosf (__f32x4_t);
207__vpcs __f32x4_t _ZGVnN4v_coshf (__f32x4_t);
208__vpcs __f32x4_t _ZGVnN4v_cospif (__f32x4_t);
209__vpcs __f32x4_t _ZGVnN4v_erff (__f32x4_t);
210__vpcs __f32x4_t _ZGVnN4v_erfcf (__f32x4_t);
211__vpcs __f32x4_t _ZGVnN4v_expf (__f32x4_t);
212__vpcs __f32x4_t _ZGVnN4v_exp10f (__f32x4_t);
213__vpcs __f32x4_t _ZGVnN4v_exp2f (__f32x4_t);
214__vpcs __f32x4_t _ZGVnN4v_expm1f (__f32x4_t);
215__vpcs __f32x4_t _ZGVnN4vv_hypotf (__f32x4_t, __f32x4_t);
216__vpcs __f32x4_t _ZGVnN4v_logf (__f32x4_t);
217__vpcs __f32x4_t _ZGVnN4v_log10f (__f32x4_t);
218__vpcs __f32x4_t _ZGVnN4v_log1pf (__f32x4_t);
219__vpcs __f32x4_t _ZGVnN4v_log2f (__f32x4_t);
220__vpcs __f32x4_t _ZGVnN4v_logp1f (__f32x4_t);
221__vpcs __f32x4_t _ZGVnN4vv_powf (__f32x4_t, __f32x4_t);
222__vpcs __f32x4_t _ZGVnN4v_sinf (__f32x4_t);
223__vpcs __f32x4_t _ZGVnN4v_sinhf (__f32x4_t);
224__vpcs __f32x4_t _ZGVnN4v_sinpif (__f32x4_t);
225__vpcs __f32x4_t _ZGVnN4v_tanf (__f32x4_t);
226__vpcs __f32x4_t _ZGVnN4v_tanhf (__f32x4_t);
227__vpcs __f32x4_t _ZGVnN4v_tanpif (__f32x4_t);
228
229__vpcs __f64x2_t _ZGVnN2vv_atan2 (__f64x2_t, __f64x2_t);
230__vpcs __f64x2_t _ZGVnN2vv_atan2pi (__f64x2_t, __f64x2_t);
231__vpcs __f64x2_t _ZGVnN2v_acos (__f64x2_t);
232__vpcs __f64x2_t _ZGVnN2v_acosh (__f64x2_t);
233__vpcs __f64x2_t _ZGVnN2v_acospi (__f64x2_t);
234__vpcs __f64x2_t _ZGVnN2v_asin (__f64x2_t);
235__vpcs __f64x2_t _ZGVnN2v_asinh (__f64x2_t);
236__vpcs __f64x2_t _ZGVnN2v_asinpi (__f64x2_t);
237__vpcs __f64x2_t _ZGVnN2v_atan (__f64x2_t);
238__vpcs __f64x2_t _ZGVnN2v_atanh (__f64x2_t);
239__vpcs __f64x2_t _ZGVnN2v_atanpi (__f64x2_t);
240__vpcs __f64x2_t _ZGVnN2v_cbrt (__f64x2_t);
241__vpcs __f64x2_t _ZGVnN2v_cos (__f64x2_t);
242__vpcs __f64x2_t _ZGVnN2v_cosh (__f64x2_t);
243__vpcs __f64x2_t _ZGVnN2v_cospi (__f64x2_t);
244__vpcs __f64x2_t _ZGVnN2v_erf (__f64x2_t);
245__vpcs __f64x2_t _ZGVnN2v_erfc (__f64x2_t);
246__vpcs __f64x2_t _ZGVnN2v_exp (__f64x2_t);
247__vpcs __f64x2_t _ZGVnN2v_exp10 (__f64x2_t);
248__vpcs __f64x2_t _ZGVnN2v_exp2 (__f64x2_t);
249__vpcs __f64x2_t _ZGVnN2v_expm1 (__f64x2_t);
250__vpcs __f64x2_t _ZGVnN2vv_hypot (__f64x2_t, __f64x2_t);
251__vpcs __f64x2_t _ZGVnN2v_log (__f64x2_t);
252__vpcs __f64x2_t _ZGVnN2v_log10 (__f64x2_t);
253__vpcs __f64x2_t _ZGVnN2v_log1p (__f64x2_t);
254__vpcs __f64x2_t _ZGVnN2v_log2 (__f64x2_t);
255__vpcs __f64x2_t _ZGVnN2v_logp1 (__f64x2_t);
256__vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t);
257__vpcs __f64x2_t _ZGVnN2v_sin (__f64x2_t);
258__vpcs __f64x2_t _ZGVnN2v_sinh (__f64x2_t);
259__vpcs __f64x2_t _ZGVnN2v_sinpi (__f64x2_t);
260__vpcs __f64x2_t _ZGVnN2v_tan (__f64x2_t);
261__vpcs __f64x2_t _ZGVnN2v_tanh (__f64x2_t);
262__vpcs __f64x2_t _ZGVnN2v_tanpi (__f64x2_t);
263
264# undef __ADVSIMD_VEC_MATH_SUPPORTED
265#endif /* __ADVSIMD_VEC_MATH_SUPPORTED */
266
267#ifdef __SVE_VEC_MATH_SUPPORTED
268
269__sv_f32_t _ZGVsMxvv_atan2f (__sv_f32_t, __sv_f32_t, __sv_bool_t);
270__sv_f32_t _ZGVsMxvv_atan2pif (__sv_f32_t, __sv_f32_t, __sv_bool_t);
271__sv_f32_t _ZGVsMxv_acosf (__sv_f32_t, __sv_bool_t);
272__sv_f32_t _ZGVsMxv_acoshf (__sv_f32_t, __sv_bool_t);
273__sv_f32_t _ZGVsMxv_acospif (__sv_f32_t, __sv_bool_t);
274__sv_f32_t _ZGVsMxv_asinf (__sv_f32_t, __sv_bool_t);
275__sv_f32_t _ZGVsMxv_asinhf (__sv_f32_t, __sv_bool_t);
276__sv_f32_t _ZGVsMxv_asinpif (__sv_f32_t, __sv_bool_t);
277__sv_f32_t _ZGVsMxv_atanf (__sv_f32_t, __sv_bool_t);
278__sv_f32_t _ZGVsMxv_atanhf (__sv_f32_t, __sv_bool_t);
279__sv_f32_t _ZGVsMxv_atanpif (__sv_f32_t, __sv_bool_t);
280__sv_f32_t _ZGVsMxv_cbrtf (__sv_f32_t, __sv_bool_t);
281__sv_f32_t _ZGVsMxv_cosf (__sv_f32_t, __sv_bool_t);
282__sv_f32_t _ZGVsMxv_coshf (__sv_f32_t, __sv_bool_t);
283__sv_f32_t _ZGVsMxv_cospif (__sv_f32_t, __sv_bool_t);
284__sv_f32_t _ZGVsMxv_erff (__sv_f32_t, __sv_bool_t);
285__sv_f32_t _ZGVsMxv_erfcf (__sv_f32_t, __sv_bool_t);
286__sv_f32_t _ZGVsMxv_expf (__sv_f32_t, __sv_bool_t);
287__sv_f32_t _ZGVsMxv_exp10f (__sv_f32_t, __sv_bool_t);
288__sv_f32_t _ZGVsMxv_exp2f (__sv_f32_t, __sv_bool_t);
289__sv_f32_t _ZGVsMxv_expm1f (__sv_f32_t, __sv_bool_t);
290__sv_f32_t _ZGVsMxvv_hypotf (__sv_f32_t, __sv_f32_t, __sv_bool_t);
291__sv_f32_t _ZGVsMxv_logf (__sv_f32_t, __sv_bool_t);
292__sv_f32_t _ZGVsMxv_log10f (__sv_f32_t, __sv_bool_t);
293__sv_f32_t _ZGVsMxv_log1pf (__sv_f32_t, __sv_bool_t);
294__sv_f32_t _ZGVsMxv_log2f (__sv_f32_t, __sv_bool_t);
295__sv_f32_t _ZGVsMxv_logp1f (__sv_f32_t, __sv_bool_t);
296__sv_f32_t _ZGVsMxvv_powf (__sv_f32_t, __sv_f32_t, __sv_bool_t);
297__sv_f32_t _ZGVsMxv_sinf (__sv_f32_t, __sv_bool_t);
298__sv_f32_t _ZGVsMxv_sinhf (__sv_f32_t, __sv_bool_t);
299__sv_f32_t _ZGVsMxv_sinpif (__sv_f32_t, __sv_bool_t);
300__sv_f32_t _ZGVsMxv_tanf (__sv_f32_t, __sv_bool_t);
301__sv_f32_t _ZGVsMxv_tanhf (__sv_f32_t, __sv_bool_t);
302__sv_f32_t _ZGVsMxv_tanpif (__sv_f32_t, __sv_bool_t);
303
304__sv_f64_t _ZGVsMxvv_atan2 (__sv_f64_t, __sv_f64_t, __sv_bool_t);
305__sv_f64_t _ZGVsMxvv_atan2pi (__sv_f64_t, __sv_f64_t, __sv_bool_t);
306__sv_f64_t _ZGVsMxv_acos (__sv_f64_t, __sv_bool_t);
307__sv_f64_t _ZGVsMxv_acosh (__sv_f64_t, __sv_bool_t);
308__sv_f64_t _ZGVsMxv_acospi (__sv_f64_t, __sv_bool_t);
309__sv_f64_t _ZGVsMxv_asin (__sv_f64_t, __sv_bool_t);
310__sv_f64_t _ZGVsMxv_asinh (__sv_f64_t, __sv_bool_t);
311__sv_f64_t _ZGVsMxv_asinpi (__sv_f64_t, __sv_bool_t);
312__sv_f64_t _ZGVsMxv_atan (__sv_f64_t, __sv_bool_t);
313__sv_f64_t _ZGVsMxv_atanh (__sv_f64_t, __sv_bool_t);
314__sv_f64_t _ZGVsMxv_atanpi (__sv_f64_t, __sv_bool_t);
315__sv_f64_t _ZGVsMxv_cbrt (__sv_f64_t, __sv_bool_t);
316__sv_f64_t _ZGVsMxv_cos (__sv_f64_t, __sv_bool_t);
317__sv_f64_t _ZGVsMxv_cosh (__sv_f64_t, __sv_bool_t);
318__sv_f64_t _ZGVsMxv_cospi (__sv_f64_t, __sv_bool_t);
319__sv_f64_t _ZGVsMxv_erf (__sv_f64_t, __sv_bool_t);
320__sv_f64_t _ZGVsMxv_erfc (__sv_f64_t, __sv_bool_t);
321__sv_f64_t _ZGVsMxv_exp (__sv_f64_t, __sv_bool_t);
322__sv_f64_t _ZGVsMxv_exp10 (__sv_f64_t, __sv_bool_t);
323__sv_f64_t _ZGVsMxv_exp2 (__sv_f64_t, __sv_bool_t);
324__sv_f64_t _ZGVsMxv_expm1 (__sv_f64_t, __sv_bool_t);
325__sv_f64_t _ZGVsMxvv_hypot (__sv_f64_t, __sv_f64_t, __sv_bool_t);
326__sv_f64_t _ZGVsMxv_log (__sv_f64_t, __sv_bool_t);
327__sv_f64_t _ZGVsMxv_log10 (__sv_f64_t, __sv_bool_t);
328__sv_f64_t _ZGVsMxv_log1p (__sv_f64_t, __sv_bool_t);
329__sv_f64_t _ZGVsMxv_log2 (__sv_f64_t, __sv_bool_t);
330__sv_f64_t _ZGVsMxv_logp1 (__sv_f64_t, __sv_bool_t);
331__sv_f64_t _ZGVsMxvv_pow (__sv_f64_t, __sv_f64_t, __sv_bool_t);
332__sv_f64_t _ZGVsMxv_sin (__sv_f64_t, __sv_bool_t);
333__sv_f64_t _ZGVsMxv_sinh (__sv_f64_t, __sv_bool_t);
334__sv_f64_t _ZGVsMxv_sinpi (__sv_f64_t, __sv_bool_t);
335__sv_f64_t _ZGVsMxv_tan (__sv_f64_t, __sv_bool_t);
336__sv_f64_t _ZGVsMxv_tanh (__sv_f64_t, __sv_bool_t);
337__sv_f64_t _ZGVsMxv_tanpi (__sv_f64_t, __sv_bool_t);
338
339# undef __SVE_VEC_MATH_SUPPORTED
340#endif /* __SVE_VEC_MATH_SUPPORTED */