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