blob: 449300839b67ec703ae508a81e09c79dc1e6da2a [file] [log] [blame]
George Landerda55ef92015-11-19 12:05:06 +00001/*
Szabolcs Nagy0d51c042018-04-25 13:26:22 +01002 * Public API.
George Landerda55ef92015-11-19 12:05:06 +00003 *
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +01004 * Copyright (c) 2015-2019, Arm Limited.
Szabolcs Nagy11253b02018-11-12 11:10:57 +00005 * SPDX-License-Identifier: MIT
George Landerda55ef92015-11-19 12:05:06 +00006 */
7
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +01008#ifndef _MATHLIB_H
9#define _MATHLIB_H
10
Szabolcs Nagy875334a2018-06-12 10:33:30 +010011float expf (float);
12float exp2f (float);
13float logf (float);
14float log2f (float);
15float powf (float, float);
16float sinf (float);
17float cosf (float);
18void sincosf (float, float*, float*);
Szabolcs Nagya7711a32018-06-05 11:43:57 +010019
Szabolcs Nagy875334a2018-06-12 10:33:30 +010020double exp (double);
21double exp2 (double);
22double log (double);
23double log2 (double);
24double pow (double, double);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010025
26/* Scalar functions using the vector algorithm with identical result. */
Szabolcs Nagyc5cba852019-08-09 15:39:09 +010027float __s_sinf (float);
28float __s_cosf (float);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010029float __s_expf (float);
30float __s_expf_1u (float);
Szabolcs Nagy69170e12019-10-14 15:21:28 +010031float __s_exp2f (float);
32float __s_exp2f_1u (float);
Szabolcs Nagyc280e492019-08-09 15:18:40 +010033float __s_logf (float);
Szabolcs Nagyba75d0a2019-08-09 16:24:59 +010034float __s_powf (float, float);
Szabolcs Nagya2f717e2019-08-09 16:56:54 +010035double __s_sin (double);
36double __s_cos (double);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010037double __s_exp (double);
Szabolcs Nagyd9840982019-08-29 14:46:28 +010038double __s_log (double);
Szabolcs Nagya807c9b2020-01-10 15:10:45 +000039double __s_pow (double, double);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010040
41#if __aarch64__
42#if __GNUC__ >= 5
43typedef __Float32x4_t __f32x4_t;
44typedef __Float64x2_t __f64x2_t;
45#elif __clang_major__*100+__clang_minor__ >= 305
46typedef __attribute__((__neon_vector_type__(4))) float __f32x4_t;
47typedef __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 Nagyc5cba852019-08-09 15:39:09 +010053__f32x4_t __v_sinf (__f32x4_t);
54__f32x4_t __v_cosf (__f32x4_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010055__f32x4_t __v_expf (__f32x4_t);
56__f32x4_t __v_expf_1u (__f32x4_t);
Szabolcs Nagy69170e12019-10-14 15:21:28 +010057__f32x4_t __v_exp2f (__f32x4_t);
58__f32x4_t __v_exp2f_1u (__f32x4_t);
Szabolcs Nagyc280e492019-08-09 15:18:40 +010059__f32x4_t __v_logf (__f32x4_t);
Szabolcs Nagyba75d0a2019-08-09 16:24:59 +010060__f32x4_t __v_powf (__f32x4_t, __f32x4_t);
Szabolcs Nagya2f717e2019-08-09 16:56:54 +010061__f64x2_t __v_sin (__f64x2_t);
62__f64x2_t __v_cos (__f64x2_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010063__f64x2_t __v_exp (__f64x2_t);
Szabolcs Nagyd9840982019-08-29 14:46:28 +010064__f64x2_t __v_log (__f64x2_t);
Szabolcs Nagya807c9b2020-01-10 15:10:45 +000065__f64x2_t __v_pow (__f64x2_t, __f64x2_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010066
67#if __GNUC__ >= 9 || __clang_major__ >= 8
68#define __vpcs __attribute__((__aarch64_vector_pcs__))
69
70/* Vector functions following the vector PCS. */
Szabolcs Nagyc5cba852019-08-09 15:39:09 +010071__vpcs __f32x4_t __vn_sinf (__f32x4_t);
72__vpcs __f32x4_t __vn_cosf (__f32x4_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010073__vpcs __f32x4_t __vn_expf (__f32x4_t);
74__vpcs __f32x4_t __vn_expf_1u (__f32x4_t);
Szabolcs Nagy69170e12019-10-14 15:21:28 +010075__vpcs __f32x4_t __vn_exp2f (__f32x4_t);
76__vpcs __f32x4_t __vn_exp2f_1u (__f32x4_t);
Szabolcs Nagyc280e492019-08-09 15:18:40 +010077__vpcs __f32x4_t __vn_logf (__f32x4_t);
Szabolcs Nagyba75d0a2019-08-09 16:24:59 +010078__vpcs __f32x4_t __vn_powf (__f32x4_t, __f32x4_t);
Szabolcs Nagya2f717e2019-08-09 16:56:54 +010079__vpcs __f64x2_t __vn_sin (__f64x2_t);
80__vpcs __f64x2_t __vn_cos (__f64x2_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010081__vpcs __f64x2_t __vn_exp (__f64x2_t);
Szabolcs Nagyd9840982019-08-29 14:46:28 +010082__vpcs __f64x2_t __vn_log (__f64x2_t);
Szabolcs Nagya807c9b2020-01-10 15:10:45 +000083__vpcs __f64x2_t __vn_pow (__f64x2_t, __f64x2_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010084
85/* Vector functions following the vector PCS using ABI names. */
Szabolcs Nagyc5cba852019-08-09 15:39:09 +010086__vpcs __f32x4_t _ZGVnN4v_sinf (__f32x4_t);
87__vpcs __f32x4_t _ZGVnN4v_cosf (__f32x4_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010088__vpcs __f32x4_t _ZGVnN4v_expf (__f32x4_t);
Szabolcs Nagy69170e12019-10-14 15:21:28 +010089__vpcs __f32x4_t _ZGVnN4v_exp2f (__f32x4_t);
Szabolcs Nagyc280e492019-08-09 15:18:40 +010090__vpcs __f32x4_t _ZGVnN4v_logf (__f32x4_t);
Szabolcs Nagyba75d0a2019-08-09 16:24:59 +010091__vpcs __f32x4_t _ZGVnN4vv_powf (__f32x4_t, __f32x4_t);
Szabolcs Nagya2f717e2019-08-09 16:56:54 +010092__vpcs __f64x2_t _ZGVnN2v_sin (__f64x2_t);
93__vpcs __f64x2_t _ZGVnN2v_cos (__f64x2_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010094__vpcs __f64x2_t _ZGVnN2v_exp (__f64x2_t);
Szabolcs Nagyd9840982019-08-29 14:46:28 +010095__vpcs __f64x2_t _ZGVnN2v_log (__f64x2_t);
Szabolcs Nagya807c9b2020-01-10 15:10:45 +000096__vpcs __f64x2_t _ZGVnN2vv_pow (__f64x2_t, __f64x2_t);
Szabolcs Nagy7a1f4cf2019-07-18 12:51:41 +010097#endif
98#endif
99
100#endif