xref: /freebsd-src/contrib/arm-optimized-routines/math/include/mathlib.h (revision 072a4ba82a01476eaee33781ccd241033eefcf0b)
131914882SAlex Richardson /*
231914882SAlex Richardson  * Public API.
331914882SAlex Richardson  *
431914882SAlex Richardson  * Copyright (c) 2015-2020, Arm Limited.
5*072a4ba8SAndrew Turner  * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
631914882SAlex Richardson  */
731914882SAlex Richardson 
831914882SAlex Richardson #ifndef _MATHLIB_H
931914882SAlex Richardson #define _MATHLIB_H
1031914882SAlex Richardson 
1131914882SAlex Richardson float expf (float);
1231914882SAlex Richardson float exp2f (float);
1331914882SAlex Richardson float logf (float);
1431914882SAlex Richardson float log2f (float);
1531914882SAlex Richardson float powf (float, float);
1631914882SAlex Richardson float sinf (float);
1731914882SAlex Richardson float cosf (float);
1831914882SAlex Richardson void sincosf (float, float*, float*);
1931914882SAlex Richardson 
2031914882SAlex Richardson double exp (double);
2131914882SAlex Richardson double exp2 (double);
2231914882SAlex Richardson double log (double);
2331914882SAlex Richardson double log2 (double);
2431914882SAlex Richardson double pow (double, double);
2531914882SAlex Richardson 
2631914882SAlex Richardson /* Scalar functions using the vector algorithm with identical result.  */
2731914882SAlex Richardson float __s_sinf (float);
2831914882SAlex Richardson float __s_cosf (float);
2931914882SAlex Richardson float __s_expf (float);
3031914882SAlex Richardson float __s_expf_1u (float);
3131914882SAlex Richardson float __s_exp2f (float);
3231914882SAlex Richardson float __s_exp2f_1u (float);
3331914882SAlex Richardson float __s_logf (float);
3431914882SAlex Richardson float __s_powf (float, float);
3531914882SAlex Richardson double __s_sin (double);
3631914882SAlex Richardson double __s_cos (double);
3731914882SAlex Richardson double __s_exp (double);
3831914882SAlex Richardson double __s_log (double);
3931914882SAlex Richardson double __s_pow (double, double);
4031914882SAlex Richardson 
4131914882SAlex Richardson #if __aarch64__
4231914882SAlex Richardson #if __GNUC__ >= 5
4331914882SAlex Richardson typedef __Float32x4_t __f32x4_t;
4431914882SAlex Richardson typedef __Float64x2_t __f64x2_t;
4531914882SAlex Richardson #elif __clang_major__*100+__clang_minor__ >= 305
4631914882SAlex Richardson typedef __attribute__((__neon_vector_type__(4))) float __f32x4_t;
4731914882SAlex Richardson typedef __attribute__((__neon_vector_type__(2))) double __f64x2_t;
4831914882SAlex Richardson #else
4931914882SAlex Richardson #error Unsupported compiler
5031914882SAlex Richardson #endif
5131914882SAlex Richardson 
5231914882SAlex Richardson /* Vector functions following the base PCS.  */
5331914882SAlex Richardson __f32x4_t __v_sinf (__f32x4_t);
5431914882SAlex Richardson __f32x4_t __v_cosf (__f32x4_t);
5531914882SAlex Richardson __f32x4_t __v_expf (__f32x4_t);
5631914882SAlex Richardson __f32x4_t __v_expf_1u (__f32x4_t);
5731914882SAlex Richardson __f32x4_t __v_exp2f (__f32x4_t);
5831914882SAlex Richardson __f32x4_t __v_exp2f_1u (__f32x4_t);
5931914882SAlex Richardson __f32x4_t __v_logf (__f32x4_t);
6031914882SAlex Richardson __f32x4_t __v_powf (__f32x4_t, __f32x4_t);
6131914882SAlex Richardson __f64x2_t __v_sin (__f64x2_t);
6231914882SAlex Richardson __f64x2_t __v_cos (__f64x2_t);
6331914882SAlex Richardson __f64x2_t __v_exp (__f64x2_t);
6431914882SAlex Richardson __f64x2_t __v_log (__f64x2_t);
6531914882SAlex Richardson __f64x2_t __v_pow (__f64x2_t, __f64x2_t);
6631914882SAlex Richardson 
6731914882SAlex Richardson #if __GNUC__ >= 9 || __clang_major__ >= 8
6831914882SAlex Richardson #define __vpcs __attribute__((__aarch64_vector_pcs__))
6931914882SAlex Richardson 
7031914882SAlex Richardson /* Vector functions following the vector PCS.  */
7131914882SAlex Richardson __vpcs __f32x4_t __vn_sinf (__f32x4_t);
7231914882SAlex Richardson __vpcs __f32x4_t __vn_cosf (__f32x4_t);
7331914882SAlex Richardson __vpcs __f32x4_t __vn_expf (__f32x4_t);
7431914882SAlex Richardson __vpcs __f32x4_t __vn_expf_1u (__f32x4_t);
7531914882SAlex Richardson __vpcs __f32x4_t __vn_exp2f (__f32x4_t);
7631914882SAlex Richardson __vpcs __f32x4_t __vn_exp2f_1u (__f32x4_t);
7731914882SAlex Richardson __vpcs __f32x4_t __vn_logf (__f32x4_t);
7831914882SAlex Richardson __vpcs __f32x4_t __vn_powf (__f32x4_t, __f32x4_t);
7931914882SAlex Richardson __vpcs __f64x2_t __vn_sin (__f64x2_t);
8031914882SAlex Richardson __vpcs __f64x2_t __vn_cos (__f64x2_t);
8131914882SAlex Richardson __vpcs __f64x2_t __vn_exp (__f64x2_t);
8231914882SAlex Richardson __vpcs __f64x2_t __vn_log (__f64x2_t);
8331914882SAlex Richardson __vpcs __f64x2_t __vn_pow (__f64x2_t, __f64x2_t);
8431914882SAlex Richardson 
8531914882SAlex Richardson /* Vector functions following the vector PCS using ABI names.  */
8631914882SAlex Richardson __vpcs __f32x4_t _ZGVnN4v_sinf (__f32x4_t);
8731914882SAlex Richardson __vpcs __f32x4_t _ZGVnN4v_cosf (__f32x4_t);
8831914882SAlex Richardson __vpcs __f32x4_t _ZGVnN4v_expf (__f32x4_t);
8931914882SAlex Richardson __vpcs __f32x4_t _ZGVnN4v_exp2f (__f32x4_t);
9031914882SAlex Richardson __vpcs __f32x4_t _ZGVnN4v_logf (__f32x4_t);
9131914882SAlex Richardson __vpcs __f32x4_t _ZGVnN4vv_powf (__f32x4_t, __f32x4_t);
9231914882SAlex Richardson __vpcs __f64x2_t _ZGVnN2v_sin (__f64x2_t);
9331914882SAlex Richardson __vpcs __f64x2_t _ZGVnN2v_cos (__f64x2_t);
9431914882SAlex Richardson __vpcs __f64x2_t _ZGVnN2v_exp (__f64x2_t);
9531914882SAlex Richardson __vpcs __f64x2_t _ZGVnN2v_log (__f64x2_t);
9631914882SAlex Richardson __vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t);
9731914882SAlex Richardson #endif
9831914882SAlex Richardson #endif
9931914882SAlex Richardson 
10031914882SAlex Richardson #endif
101