aboutsummaryrefslogtreecommitdiff
path: root/pl/math/test
diff options
context:
space:
mode:
authorJoe Ramsay <Joe.Ramsay@arm.com>2022-11-09 14:52:49 +0000
committerJoe Ramsay <joe.ramsay@arm.com>2022-11-09 14:52:49 +0000
commitcf69308ea773524eec9365108d608e4c9e4036af (patch)
tree382ba2d86e42d0c898b812410011a7e8fddc8e0b /pl/math/test
parent1721f53563004249849968a4f78a3ed162b5e8e1 (diff)
downloadarm-optimized-routines-cf69308ea773524eec9365108d608e4c9e4036af.tar.gz
pl/math/test: Simplify ulp and bench macros
Reduces the amount of boilerplate developers need to write for new routines.
Diffstat (limited to 'pl/math/test')
-rw-r--r--pl/math/test/mathbench_funcs.h190
-rw-r--r--pl/math/test/ulp_funcs.h164
-rw-r--r--pl/math/test/ulp_wrappers.h50
3 files changed, 144 insertions, 260 deletions
diff --git a/pl/math/test/mathbench_funcs.h b/pl/math/test/mathbench_funcs.h
index e73206e..d09cdb0 100644
--- a/pl/math/test/mathbench_funcs.h
+++ b/pl/math/test/mathbench_funcs.h
@@ -5,6 +5,27 @@
* Copyright (c) 2022, Arm Limited.
* SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
*/
+
+#ifdef __vpcs
+
+#define ZVNF(f, a, b) F(__s_##f, a, b) VF(__v_##f, a, b) VNF(__vn_##f, a, b) VNF(_ZGVnN4v_##f, a, b)
+#define ZVND(f, a, b) D(__s_##f, a, b) VD(__v_##f, a, b) VND(__vn_##f, a, b) VND(_ZGVnN2v_##f, a, b)
+
+#elif __aarch64__
+
+#define ZVNF(f, a, b) F(__s_##f, a, b) VF(__v_##f, a, b)
+#define ZVND(f, a, b) D(__s_##f, a, b) VD(__v_##f, a, b)
+
+#else
+
+#define ZVNF(f, a, b) F(__s_##f, a, b)
+#define ZVND(f, a, b) D(__s_##f, a, b)
+
+#endif
+
+#define VZSVF(f, a, b) SVF(__sv_##f##_x, a, b) SVF(_ZGVsMsv_##f, a, b)
+#define VZSVD(f, a, b) SVD(__sv_##f##_x, a, b) SVD(_ZGVsMsv_##f, a, b)
+
F (acoshf, 1.0, 10.0)
F (asinhf, -10.0, 10.0)
F (atanf, -10.0, 10.0)
@@ -36,154 +57,53 @@ D (log2, 0.01, 11.1)
D (sin, -3.1, 3.1)
#if WANT_VMATH
-F (__s_asinhf, -10.0, 10.0)
-F (__s_atanf, -10.0, 10.0)
-D (__s_atan, -10.0, 10.0)
+ZVNF (asinhf, -10.0, 10.0)
+ZVNF (atanf, -10.0, 10.0)
+ZVND (atan, -10.0, 10.0)
+ZVNF (coshf, -10.0, 10.0)
+ZVNF (erff, -4.0, 4.0)
+ZVND (erf, -6.0, 6.0)
+ZVNF (erfcf, -6.0, 28.0)
+ZVND (erfc, -6.0, 28.0)
+ZVNF (expm1f, -9.9, 9.9)
+ZVND (expm1, -9.9, 9.9)
+ZVNF (log10f, 0.01, 11.1)
+ZVND (log10, 0.01, 11.1)
+ZVNF (log1pf, -0.9, 10.0)
+ZVND (log1p, -0.9, 10.0)
+ZVNF (log2f, 0.01, 11.1)
+ZVND (log2, 0.01, 11.1)
+ZVNF (sinhf, -10.0, 10.0)
+ZVNF (tanf, -3.1, 3.1)
{"__s_atan2f", 'f', 0, -10.0, 10.0, {.f = __s_atan2f_wrap}},
{"__s_atan2", 'd', 0, -10.0, 10.0, {.d = __s_atan2_wrap}},
-F (__s_coshf, -10.0, 10.0)
-F (__s_erff, -4.0, 4.0)
-D (__s_erf, -6.0, 6.0)
-F (__s_erfcf, -6.0, 28.0)
-D (__s_erfc, -6.0, 28.0)
-F (__s_expm1f, -9.9, 9.9)
-D (__s_expm1, -9.9, 9.9)
-F (__s_log10f, 0.01, 11.1)
-D (__s_log10, 0.01, 11.1)
-F (__s_log1pf, -0.9, 10.0)
-D (__s_log1p, -0.9, 10.0)
-F (__s_log2f, 0.01, 11.1)
-D (__s_log2, 0.01, 11.1)
-F (__s_sinhf, -10.0, 10.0)
-F (__s_tanf, -3.1, 3.1)
-#if __aarch64__
-VF (__v_asinhf, -10.0, 10.0)
-VF (__v_atanf, -10.0, 10.0)
-VD (__v_atan, -10.0, 10.0)
{"__v_atan2f", 'f', 'v', -10.0, 10.0, {.vf = __v_atan2f_wrap}},
{"__v_atan2", 'd', 'v', -10.0, 10.0, {.vd = __v_atan2_wrap}},
-VF (__v_coshf, -10.0, 10.0)
-VF (__v_erff, -4.0, 4.0)
-VD (__v_erf, -6.0, 6.0)
-VF (__v_erfcf, -6.0, 28.0)
-VD (__v_erfc, -6.0, 28.0)
-VF (__v_expm1f, -9.9, 9.9)
-VD (__v_expm1, -9.9, 9.9)
-VD (__v_log10, 0.01, 11.1)
-VF (__v_log10f, 0.01, 11.1)
-VF (__v_log1pf, -0.9, 10.0)
-VD (__v_log1p, -0.9, 10.0)
-VF (__v_log2f, 0.01, 11.1)
-VD (__v_log2, 0.01, 11.1)
-VF (__v_sinhf, -10.0, 10.0)
-VF (__v_tanf, -3.1, 3.1)
-#ifdef __vpcs
-VNF (__vn_asinhf, -10.0, 10.0)
-VNF (_ZGVnN4v_asinhf, -10.0, 10.0)
-
-VNF (__vn_atanf, -10.0, 10.0)
-VNF (_ZGVnN4v_atanf, -10.0, 10.0)
-
-VND (__vn_atan, -10.0, 10.0)
-VND (_ZGVnN2v_atan, -10.0, 10.0)
-
{"__vn_atan2f", 'f', 'n', -10.0, 10.0, {.vnf = __vn_atan2f_wrap}},
{"_ZGVnN4vv_atan2f", 'f', 'n', -10.0, 10.0, {.vnf = _Z_atan2f_wrap}},
-
{"__vn_atan2", 'd', 'n', -10.0, 10.0, {.vnd = __vn_atan2_wrap}},
{"_ZGVnN2vv_atan2", 'd', 'n', -10.0, 10.0, {.vnd = _Z_atan2_wrap}},
-VNF (__vn_coshf, -10.0, 10.0)
-VNF (_ZGVnN4v_coshf, -10.0, 10.0)
-
-VNF (__vn_erff, -4.0, 4.0)
-VNF (_ZGVnN4v_erff, -4.0, 4.0)
-
-VND (__vn_erf, -6.0, 6.0)
-VND (_ZGVnN2v_erf, -6.0, 6.0)
-
-VNF (__vn_erfcf, -6.0, 28.0)
-VNF (_ZGVnN4v_erfcf, -6.0, 28.0)
-
-VND (__vn_erfc, -6.0, 28.0)
-VND (_ZGVnN2v_erfc, -6.0, 28.0)
-
-VNF (__vn_expm1f, -9.9, 9.9)
-VNF (_ZGVnN4v_expm1f, -9.9, 9.9)
-
-VND (__vn_expm1, -9.9, 9.9)
-VND (_ZGVnN2v_expm1, -9.9, 9.9)
-
-VNF (__vn_log10f, 0.01, 11.1)
-VNF (_ZGVnN4v_log10f, 0.01, 11.1)
-
-VND (__vn_log10, 0.01, 11.1)
-VND (_ZGVnN2v_log10, 0.01, 11.1)
-
-VNF (__vn_log1pf, -0.9, 10.0)
-VNF (_ZGVnN4v_log1pf, -0.9, 10.0)
-
-VND (__vn_log1p, -0.9, 10.0)
-VND (_ZGVnN2v_log1p, -0.9, 10.0)
-
-VNF (__vn_log2f, 0.01, 11.1)
-VNF (_ZGVnN4v_log2f, 0.01, 11.1)
-
-VND (__vn_log2, 0.01, 11.1)
-VND (_ZGVnN2v_log2, 0.01, 11.1)
-
-VNF (__vn_sinhf, -10.0, 10.0)
-VNF (_ZGVnN4v_sinhf, -10.0, 10.0)
-
-VNF (__vn_tanf, -3.1, 3.1)
-VNF (_ZGVnN4v_tanf, -3.1, 3.1)
-#endif
-#endif
#if WANT_SVE_MATH
-SVF (__sv_atanf_x, -3.1, 3.1)
-SVF (_ZGVsMxv_atanf, -3.1, 3.1)
-SVD (__sv_atan_x, -3.1, 3.1)
-SVD (_ZGVsMxv_atan, -3.1, 3.1)
-
+ZSVF (atanf, -3.1, 3.1)
+ZSVD (atan, -3.1, 3.1)
{"__sv_atan2f_x", 'f', 'n', -10.0, 10.0, {.svf = __sv_atan2f_wrap}},
{"_ZGVsMxvv_atan2f", 'f', 'n', -10.0, 10.0, {.svf = _Z_sv_atan2f_wrap}},
-{"__sv_atan2", 'd', 'n', -10.0, 10.0, {.svd = __sv_atan2_wrap}},
+{"__sv_atan2_x", 'd', 'n', -10.0, 10.0, {.svd = __sv_atan2_wrap}},
{"_ZGVsM2vv_atan2", 'd', 'n', -10.0, 10.0, {.svd = _Z_sv_atan2_wrap}},
-
-SVF (__sv_erff_x, -4.0, 4.0)
-SVF (_ZGVsMxv_erff, -4.0, 4.0)
-SVD (__sv_erf_x, -4.0, 4.0)
-SVD (_ZGVsMxv_erf, -4.0, 4.0)
-
-SVD (__sv_erfc_x, -4, 10)
-SVD (_ZGVsMxv_erfc, -4, 10)
-
-SVF (__sv_expf_x, -9.9, 9.9)
-SVF (_ZGVsMxv_expf, -9.9, 9.9)
-
-SVF (__sv_cosf_x, -3.1, 3.1)
-SVF (_ZGVsMxv_cosf, -3.1, 3.1)
-SVF (__sv_sinf_x, -3.1, 3.1)
-SVF (_ZGVsMxv_sinf, -3.1, 3.1)
-
-SVF (__sv_logf_x, 0.01, 11.1)
-SVF (_ZGVsMxv_logf, 0.01, 11.1)
-SVD (__sv_log_x, 0.01, 11.1)
-SVD (_ZGVsMxv_log, 0.01, 11.1)
-
-SVF (__sv_log10f_x, 0.01, 11.1)
-SVF (_ZGVsMxv_log10f, 0.01, 11.1)
-SVD (__sv_log10_x, 0.01, 11.1)
-SVD (_ZGVsMxv_log10, 0.01, 11.1)
-
-SVD (__sv_cos_x, -3.1, 3.1)
-SVD (_ZGVsMxv_cos, -3.1, 3.1)
-SVD (__sv_sin_x, -3.1, 3.1)
-SVD (_ZGVsMxv_sin, -3.1, 3.1)
-
-SVF (__sv_tanf_x, -3.1, 3.1)
-SVF (_ZGVsMxv_tanf, -3.1, 3.1)
-
+ZSVF (erff, -4.0, 4.0)
+ZSVD (erf, -4.0, 4.0)
+ZSVD (erfc, -4, 10)
+ZSVF (expf, -9.9, 9.9)
+ZSVF (cosf, -3.1, 3.1)
+ZSVD (cos, -3.1, 3.1)
+ZSVF (sinf, -3.1, 3.1)
+ZSVD (sin, -3.1, 3.1)
+ZSVF (logf, 0.01, 11.1)
+ZSVD (log, 0.01, 11.1)
+ZSVF (log10f, 0.01, 11.1)
+ZSVD (log10, 0.01, 11.1)
+ZSVF (tanf, -3.1, 3.1)
{"__sv_powif_x", 'f', 'n', -10.0, 10.0, {.svf = __sv_powif_wrap}},
{"_ZGVsMxvv_powi", 'f', 'n', -10.0, 10.0, {.svf = _Z_sv_powi_wrap}},
{"__sv_powi_x", 'd', 'n', -10.0, 10.0, {.svd = __sv_powi_wrap}},
diff --git a/pl/math/test/ulp_funcs.h b/pl/math/test/ulp_funcs.h
index 98b63c8..a6c3866 100644
--- a/pl/math/test/ulp_funcs.h
+++ b/pl/math/test/ulp_funcs.h
@@ -4,6 +4,35 @@
* Copyright (c) 2022, Arm Limited.
* SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
*/
+
+#ifdef __vpcs
+
+#define _ZVNF1(f) SF1 (f) VF1 (f) ZVNF1 (f)
+#define _ZVND1(f) SD1 (f) VD1 (f) ZVND1 (f)
+#define _ZVNF2(f) SF2 (f) VF2 (f) ZVNF2 (f)
+#define _ZVND2(f) SD2 (f) VD2 (f) ZVND2 (f)
+
+#elif __aarch64
+
+#define _ZVNF1(f) SF1 (f) VF1 (f)
+#define _ZVND1(f) SD1 (f) VD1 (f)
+#define _ZVNF2(f) SF2 (f) VF2 (f)
+#define _ZVND2(f) SD2 (f) VD2 (f)
+
+#else
+
+#define _ZVNF1(f) SF1 (f)
+#define _ZVND1(f) SD1 (f)
+#define _ZVNF2(f) SF2 (f)
+#define _ZVND2(f) SD2 (f)
+
+#endif
+
+#define _ZSVF1(f) SVF1 (f) ZSVF1 (f)
+#define _ZSVF2(f) SVF2 (f) ZSVF2 (f)
+#define _ZSVD1(f) SVD1 (f) ZSVD1 (f)
+#define _ZSVD2(f) SVD2 (f) ZSVD2 (f)
+
F1 (acosh)
F1 (asinh)
F2 (atan2)
@@ -23,108 +52,47 @@ D1 (expm1)
D1 (log10)
D1 (log1p)
#if WANT_VMATH
-SF1 (asinh)
-SF1 (atan)
-SD1 (atan)
-SF2 (atan2)
-SD2 (atan2)
-SF1 (cosh)
-SF1 (erf)
-SD1 (erf)
-SF1 (erfc)
-SD1 (erfc)
-SF1 (expm1)
-SD1 (expm1)
-SF1 (log10)
-SD1 (log10)
-SF1 (log1p)
-SD1 (log1p)
-SF1 (log2)
-SD1 (log2)
-SF1 (sinh)
-SF1 (tan)
-#if __aarch64__
-VF1 (asinh)
-VF1 (atan)
-VD1 (atan)
-VF2 (atan2)
-VD2 (atan2)
-VF1 (cosh)
-VF1 (erf)
-VD1 (erf)
-VF1 (erfc)
-VD1 (erfc)
-VF1 (expm1)
-VD1 (expm1)
-VF1 (log10)
-VD1 (log10)
-VF1 (log1p)
-VD1 (log1p)
-VF1 (log2)
-VD1 (log2)
-VF1 (sinh)
-VF1 (tan)
-#ifdef __vpcs
-ZVNF1 (asinh)
-ZVNF1 (atan)
-ZVND1 (atan)
-ZVNF2 (atan2)
-ZVND2 (atan2)
-ZVNF1 (cosh)
-ZVNF1 (erf)
-ZVND1 (erf)
-ZVNF1 (erfc)
-ZVND1 (erfc)
-ZVNF1 (expm1)
-ZVND1 (expm1)
-ZVNF1 (log10)
-ZVND1 (log10)
-ZVNF1 (log1p)
-ZVND1 (log1p)
-ZVNF1 (log2)
-ZVND1 (log2)
-ZVNF1 (sinh)
-ZVNF1 (tan)
-#endif
-#endif
+_ZVNF1 (asinh)
+_ZVNF1 (atan)
+_ZVND1 (atan)
+_ZVNF2 (atan2)
+_ZVND2 (atan2)
+_ZVNF1 (cosh)
+_ZVNF1 (erf)
+_ZVND1 (erf)
+_ZVNF1 (erfc)
+_ZVND1 (erfc)
+_ZVNF1 (expm1)
+_ZVND1 (expm1)
+_ZVNF1 (log10)
+_ZVND1 (log10)
+_ZVNF1 (log1p)
+_ZVND1 (log1p)
+_ZVNF1 (log2)
+_ZVND1 (log2)
+_ZVNF1 (sinh)
+_ZVNF1 (tan)
#if WANT_SVE_MATH
-SVF2 (atan2)
-ZSVF2 (atan2)
-SVD2 (atan2)
-ZSVD2 (atan2)
-SVF1 (atan)
-ZSVF1 (atan)
-SVD1 (atan)
-ZSVD1 (atan)
-SVF1 (cos)
-ZSVF1 (cos)
-SVD1 (cos)
-ZSVD1 (cos)
-SVF1 (erf)
-ZSVF1 (erf)
-SVD1 (erf)
-ZSVD1 (erf)
-SVD1 (erfc)
-ZSVD1 (erfc)
-SVF1 (exp)
-ZSVF1 (exp)
-SVF1 (log)
-ZSVF1 (log)
-SVD1 (log)
-ZSVD1 (log)
-SVF1 (log10)
-ZSVF1 (log10)
-SVD1 (log10)
-ZSVD1 (log10)
+_ZSVF2 (atan2)
+_ZSVD2 (atan2)
+_ZSVF1 (atan)
+_ZSVD1 (atan)
+_ZSVF1 (cos)
+_ZSVD1 (cos)
+_ZSVF1 (erf)
+_ZSVD1 (erf)
+_ZSVD1 (erfc)
+_ZSVF1 (exp)
+_ZSVF1 (log)
+_ZSVD1 (log)
+_ZSVF1 (log10)
+_ZSVD1 (log10)
F (__sv_powi, sv_powi, ref_powi, mpfr_powi, 2, 0, d2, 0)
F (_ZGVsMxvv_powk, Z_sv_powk, ref_powi, mpfr_powi, 2, 0, d2, 0)
F (__sv_powif, sv_powif, ref_powif, mpfr_powi, 2, 1, f2, 0)
F (_ZGVsMxvv_powi, Z_sv_powi, ref_powif, mpfr_powi, 2, 1, f2, 0)
-SVF1 (sin)
-ZSVF1 (sin)
-SVD1 (sin)
-ZSVD1 (sin)
-SVF1 (tan)
-ZSVF1 (tan)
+_ZSVF1 (sin)
+_ZSVD1 (sin)
+_ZSVF1 (tan)
#endif
#endif
diff --git a/pl/math/test/ulp_wrappers.h b/pl/math/test/ulp_wrappers.h
index 9c639c1..18dfe13 100644
--- a/pl/math/test/ulp_wrappers.h
+++ b/pl/math/test/ulp_wrappers.h
@@ -75,10 +75,28 @@ DECL_POW_INT_REF(ref_powi, long double, double, int)
#define ZVD1_WRAP(func) static double Z_##func(double x) { return _ZGVnN2v_##func(argd(x))[0]; }
#define ZVD2_WRAP(func) static double Z_##func(double x, double y) { return _ZGVnN2vv_##func(argd(x), argd(y))[0]; }
-#define ZVNF1_WRAP(func) VNF1_WRAP(func) ZVF1_WRAP(func)
-#define ZVNF2_WRAP(func) VNF2_WRAP(func) ZVF2_WRAP(func)
-#define ZVND1_WRAP(func) VND1_WRAP(func) ZVD1_WRAP(func)
-#define ZVND2_WRAP(func) VND2_WRAP(func) ZVD2_WRAP(func)
+#ifdef __vpcs
+
+#define ZVNF1_WRAP(func) VF1_WRAP(func) VNF1_WRAP(func) ZVF1_WRAP(func)
+#define ZVNF2_WRAP(func) VF2_WRAP(func) VNF2_WRAP(func) ZVF2_WRAP(func)
+#define ZVND1_WRAP(func) VD1_WRAP(func) VND1_WRAP(func) ZVD1_WRAP(func)
+#define ZVND2_WRAP(func) VD2_WRAP(func) VND2_WRAP(func) ZVD2_WRAP(func)
+
+#elif __aarch64__
+
+#define ZVNF1_WRAP(func) VF1_WRAP(func) VNF1_WRAP(func)
+#define ZVNF2_WRAP(func) VF2_WRAP(func) VNF2_WRAP(func)
+#define ZVND1_WRAP(func) VD1_WRAP(func) VND1_WRAP(func)
+#define ZVND2_WRAP(func) VD2_WRAP(func) VND2_WRAP(func)
+
+#else
+
+#define ZVNF1_WRAP(func) VF1_WRAP(func)
+#define ZVNF2_WRAP(func) VF2_WRAP(func)
+#define ZVND1_WRAP(func) VD1_WRAP(func)
+#define ZVND2_WRAP(func) VD2_WRAP(func)
+
+#endif
#define SVF1_WRAP(func) static float sv_##func##f(float x) { return svretf(__sv_##func##f_x(svargf(x), svptrue_b32())); }
#define SVF2_WRAP(func) static float sv_##func##f(float x, float y) { return svretf(__sv_##func##f_x(svargf(x), svargf(y), svptrue_b32())); }
@@ -96,28 +114,7 @@ DECL_POW_INT_REF(ref_powi, long double, double, int)
#define ZSVND2_WRAP(func) SVD2_WRAP(func) ZSVD2_WRAP(func)
/* Wrappers for vector functions. */
-#if __aarch64__ && WANT_VMATH
-VF1_WRAP(asinh)
-VF1_WRAP(atan)
-VF2_WRAP(atan2)
-VF1_WRAP(cosh)
-VF1_WRAP(erf)
-VF1_WRAP(erfc)
-VF1_WRAP(expm1)
-VF1_WRAP(log10)
-VF1_WRAP(log1p)
-VF1_WRAP(log2)
-VF1_WRAP(sinh)
-VF1_WRAP(tan)
-VD1_WRAP(atan)
-VD2_WRAP(atan2)
-VD1_WRAP(erf)
-VD1_WRAP(erfc)
-VD1_WRAP(expm1)
-VD1_WRAP(log10)
-VD1_WRAP(log1p)
-VD1_WRAP(log2)
-#ifdef __vpcs
+#if WANT_VMATH
ZVNF1_WRAP(asinh)
ZVNF1_WRAP(atan)
ZVNF2_WRAP(atan2)
@@ -138,7 +135,6 @@ ZVND1_WRAP(expm1)
ZVND1_WRAP(log10)
ZVND1_WRAP(log1p)
ZVND1_WRAP(log2)
-#endif
#if WANT_SVE_MATH
ZSVNF2_WRAP(atan2)
ZSVNF1_WRAP(atan)