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