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 */