George Lander | da55ef9 | 2015-11-19 12:05:06 +0000 | [diff] [blame] | 1 | /* |
Szabolcs Nagy | 0d51c04 | 2018-04-25 13:26:22 +0100 | [diff] [blame] | 2 | * Public API. |
George Lander | da55ef9 | 2015-11-19 12:05:06 +0000 | [diff] [blame] | 3 | * |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 4 | * Copyright (c) 2015-2019, Arm Limited. |
Szabolcs Nagy | 11253b0 | 2018-11-12 11:10:57 +0000 | [diff] [blame] | 5 | * SPDX-License-Identifier: MIT |
George Lander | da55ef9 | 2015-11-19 12:05:06 +0000 | [diff] [blame] | 6 | */ |
| 7 | |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 8 | #ifndef _MATHLIB_H |
| 9 | #define _MATHLIB_H |
| 10 | |
Szabolcs Nagy | 875334a | 2018-06-12 10:33:30 +0100 | [diff] [blame] | 11 | float expf (float); |
| 12 | float exp2f (float); |
| 13 | float logf (float); |
| 14 | float log2f (float); |
| 15 | float powf (float, float); |
| 16 | float sinf (float); |
| 17 | float cosf (float); |
| 18 | void sincosf (float, float*, float*); |
Szabolcs Nagy | a7711a3 | 2018-06-05 11:43:57 +0100 | [diff] [blame] | 19 | |
Szabolcs Nagy | 875334a | 2018-06-12 10:33:30 +0100 | [diff] [blame] | 20 | double exp (double); |
| 21 | double exp2 (double); |
| 22 | double log (double); |
| 23 | double log2 (double); |
| 24 | double pow (double, double); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 25 | |
| 26 | /* Scalar functions using the vector algorithm with identical result. */ |
Szabolcs Nagy | c5cba85 | 2019-08-09 15:39:09 +0100 | [diff] [blame] | 27 | float __s_sinf (float); |
| 28 | float __s_cosf (float); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 29 | float __s_expf (float); |
| 30 | float __s_expf_1u (float); |
Szabolcs Nagy | 69170e1 | 2019-10-14 15:21:28 +0100 | [diff] [blame] | 31 | float __s_exp2f (float); |
| 32 | float __s_exp2f_1u (float); |
Szabolcs Nagy | c280e49 | 2019-08-09 15:18:40 +0100 | [diff] [blame] | 33 | float __s_logf (float); |
Szabolcs Nagy | ba75d0a | 2019-08-09 16:24:59 +0100 | [diff] [blame] | 34 | float __s_powf (float, float); |
Szabolcs Nagy | a2f717e | 2019-08-09 16:56:54 +0100 | [diff] [blame] | 35 | double __s_sin (double); |
| 36 | double __s_cos (double); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 37 | double __s_exp (double); |
Szabolcs Nagy | d984098 | 2019-08-29 14:46:28 +0100 | [diff] [blame] | 38 | double __s_log (double); |
Szabolcs Nagy | a807c9b | 2020-01-10 15:10:45 +0000 | [diff] [blame] | 39 | double __s_pow (double, double); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 40 | |
| 41 | #if __aarch64__ |
| 42 | #if __GNUC__ >= 5 |
| 43 | typedef __Float32x4_t __f32x4_t; |
| 44 | typedef __Float64x2_t __f64x2_t; |
| 45 | #elif __clang_major__*100+__clang_minor__ >= 305 |
| 46 | typedef __attribute__((__neon_vector_type__(4))) float __f32x4_t; |
| 47 | typedef __attribute__((__neon_vector_type__(2))) double __f64x2_t; |
| 48 | #else |
| 49 | #error Unsupported compiler |
| 50 | #endif |
| 51 | |
| 52 | /* Vector functions following the base PCS. */ |
Szabolcs Nagy | c5cba85 | 2019-08-09 15:39:09 +0100 | [diff] [blame] | 53 | __f32x4_t __v_sinf (__f32x4_t); |
| 54 | __f32x4_t __v_cosf (__f32x4_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 55 | __f32x4_t __v_expf (__f32x4_t); |
| 56 | __f32x4_t __v_expf_1u (__f32x4_t); |
Szabolcs Nagy | 69170e1 | 2019-10-14 15:21:28 +0100 | [diff] [blame] | 57 | __f32x4_t __v_exp2f (__f32x4_t); |
| 58 | __f32x4_t __v_exp2f_1u (__f32x4_t); |
Szabolcs Nagy | c280e49 | 2019-08-09 15:18:40 +0100 | [diff] [blame] | 59 | __f32x4_t __v_logf (__f32x4_t); |
Szabolcs Nagy | ba75d0a | 2019-08-09 16:24:59 +0100 | [diff] [blame] | 60 | __f32x4_t __v_powf (__f32x4_t, __f32x4_t); |
Szabolcs Nagy | a2f717e | 2019-08-09 16:56:54 +0100 | [diff] [blame] | 61 | __f64x2_t __v_sin (__f64x2_t); |
| 62 | __f64x2_t __v_cos (__f64x2_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 63 | __f64x2_t __v_exp (__f64x2_t); |
Szabolcs Nagy | d984098 | 2019-08-29 14:46:28 +0100 | [diff] [blame] | 64 | __f64x2_t __v_log (__f64x2_t); |
Szabolcs Nagy | a807c9b | 2020-01-10 15:10:45 +0000 | [diff] [blame] | 65 | __f64x2_t __v_pow (__f64x2_t, __f64x2_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 66 | |
| 67 | #if __GNUC__ >= 9 || __clang_major__ >= 8 |
| 68 | #define __vpcs __attribute__((__aarch64_vector_pcs__)) |
| 69 | |
| 70 | /* Vector functions following the vector PCS. */ |
Szabolcs Nagy | c5cba85 | 2019-08-09 15:39:09 +0100 | [diff] [blame] | 71 | __vpcs __f32x4_t __vn_sinf (__f32x4_t); |
| 72 | __vpcs __f32x4_t __vn_cosf (__f32x4_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 73 | __vpcs __f32x4_t __vn_expf (__f32x4_t); |
| 74 | __vpcs __f32x4_t __vn_expf_1u (__f32x4_t); |
Szabolcs Nagy | 69170e1 | 2019-10-14 15:21:28 +0100 | [diff] [blame] | 75 | __vpcs __f32x4_t __vn_exp2f (__f32x4_t); |
| 76 | __vpcs __f32x4_t __vn_exp2f_1u (__f32x4_t); |
Szabolcs Nagy | c280e49 | 2019-08-09 15:18:40 +0100 | [diff] [blame] | 77 | __vpcs __f32x4_t __vn_logf (__f32x4_t); |
Szabolcs Nagy | ba75d0a | 2019-08-09 16:24:59 +0100 | [diff] [blame] | 78 | __vpcs __f32x4_t __vn_powf (__f32x4_t, __f32x4_t); |
Szabolcs Nagy | a2f717e | 2019-08-09 16:56:54 +0100 | [diff] [blame] | 79 | __vpcs __f64x2_t __vn_sin (__f64x2_t); |
| 80 | __vpcs __f64x2_t __vn_cos (__f64x2_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 81 | __vpcs __f64x2_t __vn_exp (__f64x2_t); |
Szabolcs Nagy | d984098 | 2019-08-29 14:46:28 +0100 | [diff] [blame] | 82 | __vpcs __f64x2_t __vn_log (__f64x2_t); |
Szabolcs Nagy | a807c9b | 2020-01-10 15:10:45 +0000 | [diff] [blame] | 83 | __vpcs __f64x2_t __vn_pow (__f64x2_t, __f64x2_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 84 | |
| 85 | /* Vector functions following the vector PCS using ABI names. */ |
Szabolcs Nagy | c5cba85 | 2019-08-09 15:39:09 +0100 | [diff] [blame] | 86 | __vpcs __f32x4_t _ZGVnN4v_sinf (__f32x4_t); |
| 87 | __vpcs __f32x4_t _ZGVnN4v_cosf (__f32x4_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 88 | __vpcs __f32x4_t _ZGVnN4v_expf (__f32x4_t); |
Szabolcs Nagy | 69170e1 | 2019-10-14 15:21:28 +0100 | [diff] [blame] | 89 | __vpcs __f32x4_t _ZGVnN4v_exp2f (__f32x4_t); |
Szabolcs Nagy | c280e49 | 2019-08-09 15:18:40 +0100 | [diff] [blame] | 90 | __vpcs __f32x4_t _ZGVnN4v_logf (__f32x4_t); |
Szabolcs Nagy | ba75d0a | 2019-08-09 16:24:59 +0100 | [diff] [blame] | 91 | __vpcs __f32x4_t _ZGVnN4vv_powf (__f32x4_t, __f32x4_t); |
Szabolcs Nagy | a2f717e | 2019-08-09 16:56:54 +0100 | [diff] [blame] | 92 | __vpcs __f64x2_t _ZGVnN2v_sin (__f64x2_t); |
| 93 | __vpcs __f64x2_t _ZGVnN2v_cos (__f64x2_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 94 | __vpcs __f64x2_t _ZGVnN2v_exp (__f64x2_t); |
Szabolcs Nagy | d984098 | 2019-08-29 14:46:28 +0100 | [diff] [blame] | 95 | __vpcs __f64x2_t _ZGVnN2v_log (__f64x2_t); |
Szabolcs Nagy | a807c9b | 2020-01-10 15:10:45 +0000 | [diff] [blame] | 96 | __vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t); |
Szabolcs Nagy | 7a1f4cf | 2019-07-18 12:51:41 +0100 | [diff] [blame] | 97 | #endif |
| 98 | #endif |
| 99 | |
| 100 | #endif |