diff options
-rw-r--r-- | pl/math/Dir.mk | 15 | ||||
-rw-r--r-- | pl/math/include/pl_test.h | 6 | ||||
-rw-r--r-- | pl/math/test/pl_test.h | 17 | ||||
-rwxr-xr-x | pl/math/test/runulp.sh | 162 | ||||
-rw-r--r-- | pl/math/v_asinh_2u5.c | 1 | ||||
-rw-r--r-- | pl/math/v_asinhf_2u7.c | 1 | ||||
-rw-r--r-- | pl/math/v_atanhf_3u1.c | 1 | ||||
-rw-r--r-- | pl/math/v_cbrtf_1u5.c | 1 | ||||
-rw-r--r-- | pl/math/v_cosh_2u.c | 1 | ||||
-rw-r--r-- | pl/math/v_coshf_2u4.c | 1 | ||||
-rw-r--r-- | pl/math/v_expm1_2u5.c | 1 | ||||
-rw-r--r-- | pl/math/v_expm1f_1u6.c | 1 | ||||
-rw-r--r-- | pl/math/v_log1p_2u5.c | 1 | ||||
-rw-r--r-- | pl/math/v_log1pf_2u1.c | 1 | ||||
-rw-r--r-- | pl/math/v_log2f_2u6.c | 1 | ||||
-rw-r--r-- | pl/math/v_sinh_3u.c | 1 | ||||
-rw-r--r-- | pl/math/v_sinhf_2u3.c | 1 | ||||
-rw-r--r-- | pl/math/v_tanf_3u2.c | 1 | ||||
-rw-r--r-- | pl/math/v_tanhf_2u6.c | 1 |
19 files changed, 121 insertions, 94 deletions
diff --git a/pl/math/Dir.mk b/pl/math/Dir.mk index 0cae7be..b27bcee 100644 --- a/pl/math/Dir.mk +++ b/pl/math/Dir.mk @@ -147,18 +147,24 @@ ulp-input-dir=$(B)/test/inputs math-lib-lims = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.ulp,$(basename $(math-lib-srcs))) math-lib-aliases = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.alias,$(basename $(math-lib-srcs))) +math-lib-fenvs = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.fenv,$(basename $(math-lib-srcs))) $(math-lib-lims): CFLAGS_PL += -I$(PLM) -I$(PLM)/include $(math-cflags) $(math-lib-aliases): CFLAGS_PL += -I$(PLM) -I$(PLM)/include $(math-cflags) +$(math-lib-fenvs): CFLAGS_PL += -I$(PLM) -I$(PLM)/include $(math-cflags) $(ulp-input-dir)/%.ulp: $(PLM)/%.c mkdir -p $(@D) - $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep "PL_TEST_ULP" || true; } > $@ + $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep -o "PL_TEST_ULP [^ ]* [^ ]*" || true; } > $@ $(ulp-input-dir)/%.alias: $(PLM)/%.c mkdir -p $(@D) $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep "PL_TEST_ALIAS" || true; } | sed "s/_x / /g"> $@ +$(ulp-input-dir)/%.fenv: $(PLM)/%.c + mkdir -p $(@D) + $(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep -o "PL_TEST_EXPECT_FENV_ENABLED [^ ]*" || true; } > $@ + ulp-lims := $(ulp-input-dir)/limits $(ulp-lims): $(math-lib-lims) cat $^ | sed "s/PL_TEST_ULP //g;s/^ *//g" > $@ @@ -167,12 +173,17 @@ ulp-aliases := $(ulp-input-dir)/aliases $(ulp-aliases): $(math-lib-aliases) cat $^ | sed "s/PL_TEST_ALIAS //g;s/^ *//g" > $@ -check-pl/math-ulp: $(math-tools) $(ulp-lims) $(ulp-aliases) +fenv-exps := $(ulp-input-dir)/fenv +$(fenv-exps): $(math-lib-fenvs) + cat $^ | sed "s/PL_TEST_EXPECT_FENV_ENABLED //g;s/^ *//g" > $@ + +check-pl/math-ulp: $(math-tools) $(ulp-lims) $(ulp-aliases) $(fenv-exps) WANT_ERRNO=$(WANT_ERRNO) \ WANT_SVE_MATH=$(WANT_SVE_MATH) \ ULPFLAGS="$(math-ulpflags)" \ LIMITS=../../../$(ulp-lims) \ ALIASES=../../../$(ulp-aliases) \ + FENV=../../../$(fenv-exps) \ build/pl/bin/runulp.sh $(EMULATOR) check-pl/math: check-pl/math-test check-pl/math-rtest check-pl/math-ulp diff --git a/pl/math/include/pl_test.h b/pl/math/include/pl_test.h index 1ab3814..8999efa 100644 --- a/pl/math/include/pl_test.h +++ b/pl/math/include/pl_test.h @@ -14,3 +14,9 @@ strong_alias. Use PL_ALIAS instead of strong_alias to make sure the alias is also added to the test suite. */ #define PL_ALIAS(a, b) strong_alias (a, b) + +/* Emit routine name if e == 1 and f is expected to correctly trigger fenv + exceptions. e allows declaration to be emitted conditionally upon certain + build flags - defer expansion by one pass to allow those flags to be expanded + properly. */ +#define PL_TEST_EXPECT_FENV(f, e) diff --git a/pl/math/test/pl_test.h b/pl/math/test/pl_test.h index d4901b1..66dc73a 100644 --- a/pl/math/test/pl_test.h +++ b/pl/math/test/pl_test.h @@ -6,9 +6,24 @@ * SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception. */ -/* Emit the max ULP threshold, l, for routine f. */ +/* Emit the max ULP threshold, l, for routine f. Piggy-back PL_TEST_EXPECT_FENV + on PL_TEST_ULP to add EXPECT_FENV to all scalar routines. */ +#if !(V_SUPPORTED || SV_SUPPORTED) +#define PL_TEST_ULP(f, l) \ + PL_TEST_EXPECT_FENV (f, 1) \ + PL_TEST_ULP f l +#else #define PL_TEST_ULP(f, l) PL_TEST_ULP f l +#endif /* Emit aliases to allow test params to be mapped from aliases back to their aliasees. */ #define PL_ALIAS(a, b) PL_TEST_ALIAS a b + +/* Emit routine name if e == 1 and f is expected to correctly trigger fenv + exceptions. e allows declaration to be emitted conditionally upon certain + build flags - defer expansion by one pass to allow those flags to be expanded + properly. */ +#define PL_TEST_EXPECT_FENV(f, e) PL_TEST_EXPECT_FENV_ (f, e) +#define PL_TEST_EXPECT_FENV_(f, e) PL_TEST_EXPECT_FENV_##e (f) +#define PL_TEST_EXPECT_FENV_1(f) PL_TEST_EXPECT_FENV_ENABLED f diff --git a/pl/math/test/runulp.sh b/pl/math/test/runulp.sh index 3e31c00..d6c3196 100755 --- a/pl/math/test/runulp.sh +++ b/pl/math/test/runulp.sh @@ -24,7 +24,9 @@ t() { key=$(cat $ALIASES | { grep " $1$" || echo $1; } | awk '{print $1}') L=$(cat $LIMITS | grep "^$key " | awk '{print $2}') [[ $L =~ ^[0-9]+\.[0-9]+$ ]] - $emu ./ulp -e $L $flags ${5:-} $1 $2 $3 $4 && PASS=$((PASS+1)) || FAIL=$((FAIL+1)) + extra_flags="${5:-}" + grep -q "^$key$" $FENV || extra_flags="$extra_flags -f" + $emu ./ulp -e $L $flags ${extra_flags} $1 $2 $3 $4 && PASS=$((PASS+1)) || FAIL=$((FAIL+1)) } check() { @@ -584,7 +586,7 @@ range_sve_erfc=' 0 inf 40000 ' -while read G F R D A +while read G F R A do [ "$R" = 1 ] && { [[ $G != sve_* ]] || [ $WANT_SVE_MATH -eq 1 ]; } || continue case "$G" in \#*) continue ;; esac @@ -592,30 +594,8 @@ do while read X do [ -n "$X" ] || continue - # fenv checking is enabled by default, but we almost - # always want to disable it for vector routines. There - # are, however, a small number of vector routines in - # pl/math which are supposed to set fenv correctly - # when WANT_ERRNO is enabled. A hack is needed to - # ensure fenv checking is enabled for routines where - # this is the case. Pass "fenv" as fourth argument to - # prevent -f being added to the run line when - # WANT_ERRNO is enabled. - f="-f" - if [ $WANT_ERRNO -eq 1 ]; then - if [ "$D" = "fenv" ]; then - f="" - elif [ "$D" = "nofenv" ]; then - # Need to pass this if you want additional - # arguments but keep fenv checking disabled. - f="-f" - elif [ ! -z "$D" ]; then - echo "Unrecognised 4th argument: $D" - exit 1 - fi - fi case "$X" in \#*) continue ;; esac - t $F $X "$A $f" + t $F $X "$A" done << EOF $range EOF @@ -646,18 +626,18 @@ log2 __s_log2 $runs log2 __v_log2 $runv log2 __vn_log2 $runvn log2 _ZGVnN2v_log2 $runvn -expm1 __s_expm1 $runs fenv -expm1 __v_expm1 $runv fenv -expm1 __vn_expm1 $runvn fenv -expm1 _ZGVnN2v_expm1 $runvn fenv -sinh __s_sinh $runs fenv -sinh __v_sinh $runv fenv -sinh __vn_sinh $runvn fenv -sinh _ZGVnN2v_sinh $runvn fenv -cosh __s_cosh $runs fenv -cosh __v_cosh $runv fenv -cosh __vn_cosh $runvn fenv -cosh _ZGVnN2v_cosh $runvn fenv +expm1 __s_expm1 $runs +expm1 __v_expm1 $runv +expm1 __vn_expm1 $runvn +expm1 _ZGVnN2v_expm1 $runvn +sinh __s_sinh $runs +sinh __v_sinh $runv +sinh __vn_sinh $runvn +sinh _ZGVnN2v_sinh $runvn +cosh __s_cosh $runs +cosh __v_cosh $runv +cosh __vn_cosh $runvn +cosh _ZGVnN2v_cosh $runvn atanf __s_atanf $runs atanf __v_atanf $runv @@ -679,62 +659,62 @@ log10f __s_log10f $runs log10f __v_log10f $runv log10f __vn_log10f $runvn log10f _ZGVnN4v_log10f $runvn -log1pf __s_log1pf $runs fenv -log1pf __v_log1pf $runv fenv -log1pf __vn_log1pf $runvn fenv -log1pf _ZGVnN4v_log1pf $runvn fenv -asinhf __s_asinhf $runs fenv -asinhf __v_asinhf $runv fenv -asinhf __vn_asinhf $runvn fenv -asinhf _ZGVnN4v_asinhf $runvn fenv -log2f __s_log2f $runs fenv -log2f __v_log2f $runv fenv -log2f __vn_log2f $runvn fenv -log2f _ZGVnN4v_log2f $runvn fenv -tanf __s_tanf $runs fenv -tanf __v_tanf $runv fenv -tanf __vn_tanf $runvn fenv -tanf _ZGVnN4v_tanf $runvn fenv -log1p __s_log1p $runs fenv -log1p __v_log1p $runv fenv -log1p __vn_log1p $runvn fenv -log1p _ZGVnN2v_log1p $runvn fenv -expm1f __s_expm1f $runs fenv -expm1f __v_expm1f $runv fenv -expm1f __vn_expm1f $runvn fenv -expm1f _ZGVnN4v_expm1f $runvn fenv -sinhf __s_sinhf $runs fenv -sinhf __v_sinhf $runv fenv -sinhf __vn_sinhf $runvn fenv -sinhf _ZGVnN4v_sinhf $runvn fenv -coshf __s_coshf $runs fenv -coshf __v_coshf $runv fenv -coshf __vn_coshf $runvn fenv -coshf _ZGVnN4v_coshf $runvn fenv -atanhf __s_atanhf $runs fenv -c 0 -atanhf __v_atanhf $runv fenv -c 0 -atanhf __vn_atanhf $runvn fenv -c 0 -atanhf _ZGVnN4v_atanhf $runvn fenv -c 0 -cbrtf __s_cbrtf $runs fenv -cbrtf __v_cbrtf $runv fenv -cbrtf __vn_cbrtf $runvn fenv -cbrtf _ZGVnN4v_cbrtf $runvn fenv -asinh __s_asinh $runs fenv +log1pf __s_log1pf $runs +log1pf __v_log1pf $runv +log1pf __vn_log1pf $runvn +log1pf _ZGVnN4v_log1pf $runvn +asinhf __s_asinhf $runs +asinhf __v_asinhf $runv +asinhf __vn_asinhf $runvn +asinhf _ZGVnN4v_asinhf $runvn +log2f __s_log2f $runs +log2f __v_log2f $runv +log2f __vn_log2f $runvn +log2f _ZGVnN4v_log2f $runvn +tanf __s_tanf $runs +tanf __v_tanf $runv +tanf __vn_tanf $runvn +tanf _ZGVnN4v_tanf $runvn +log1p __s_log1p $runs +log1p __v_log1p $runv +log1p __vn_log1p $runvn +log1p _ZGVnN2v_log1p $runvn +expm1f __s_expm1f $runs +expm1f __v_expm1f $runv +expm1f __vn_expm1f $runvn +expm1f _ZGVnN4v_expm1f $runvn +sinhf __s_sinhf $runs +sinhf __v_sinhf $runv +sinhf __vn_sinhf $runvn +sinhf _ZGVnN4v_sinhf $runvn +coshf __s_coshf $runs +coshf __v_coshf $runv +coshf __vn_coshf $runvn +coshf _ZGVnN4v_coshf $runvn +atanhf __s_atanhf $runs -c 0 +atanhf __v_atanhf $runv -c 0 +atanhf __vn_atanhf $runvn -c 0 +atanhf _ZGVnN4v_atanhf $runvn -c 0 +cbrtf __s_cbrtf $runs +cbrtf __v_cbrtf $runv +cbrtf __vn_cbrtf $runvn +cbrtf _ZGVnN4v_cbrtf $runvn +asinh __s_asinh $runs # Test vector asinh 3 times, with control lane < 1, > 1 and special. # Ensures the v_sel is choosing the right option in all cases. -asinh __v_asinh $runv fenv -c 0.5 -asinh __vn_asinh $runvn fenv -c 0.5 -asinh _ZGVnN2v_asinh $runvn fenv -c 0.5 -asinh __v_asinh $runv fenv -c 2 -asinh __vn_asinh $runvn fenv -c 2 -asinh _ZGVnN2v_asinh $runvn fenv -c 2 -asinh __v_asinh $runv fenv -c 0x1p600 -asinh __vn_asinh $runvn fenv -c 0x1p600 -asinh _ZGVnN2v_asinh $runvn fenv -c 0x1p600 -tanhf __s_tanhf $runs fenv -tanhf __v_tanhf $runv fenv -tanhf __vn_tanhf $runvn fenv -tanhf _ZGVnN4v_tanhf $runvn fenv +asinh __v_asinh $runv -c 0.5 +asinh __vn_asinh $runvn -c 0.5 +asinh _ZGVnN2v_asinh $runvn -c 0.5 +asinh __v_asinh $runv -c 2 +asinh __vn_asinh $runvn -c 2 +asinh _ZGVnN2v_asinh $runvn -c 2 +asinh __v_asinh $runv -c 0x1p600 +asinh __vn_asinh $runvn -c 0x1p600 +asinh _ZGVnN2v_asinh $runvn -c 0x1p600 +tanhf __s_tanhf $runs +tanhf __v_tanhf $runv +tanhf __vn_tanhf $runvn +tanhf _ZGVnN4v_tanhf $runvn sve_cosf __sv_cosf $runsv sve_cosf _ZGVsMxv_cosf $runsv diff --git a/pl/math/v_asinh_2u5.c b/pl/math/v_asinh_2u5.c index d7f9a50..23171a1 100644 --- a/pl/math/v_asinh_2u5.c +++ b/pl/math/v_asinh_2u5.c @@ -156,4 +156,5 @@ VPCS_ALIAS PL_SIG (V, D, 1, asinh, -10.0, 10.0) PL_TEST_ULP (V_NAME (asinh), 1.54) +PL_TEST_EXPECT_FENV (V_NAME (asinh), WANT_ERRNO) #endif diff --git a/pl/math/v_asinhf_2u7.c b/pl/math/v_asinhf_2u7.c index 812e28f..32fe773 100644 --- a/pl/math/v_asinhf_2u7.c +++ b/pl/math/v_asinhf_2u7.c @@ -57,4 +57,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, asinh, -10.0, 10.0) PL_TEST_ULP (V_NAME (asinhf), 2.17) +PL_TEST_EXPECT_FENV (V_NAME (asinhf), WANT_ERRNO) #endif diff --git a/pl/math/v_atanhf_3u1.c b/pl/math/v_atanhf_3u1.c index c950c46..4cff1fc 100644 --- a/pl/math/v_atanhf_3u1.c +++ b/pl/math/v_atanhf_3u1.c @@ -51,4 +51,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, atanh, -1.0, 1.0) PL_TEST_ULP (V_NAME (atanhf), 2.59) +PL_TEST_EXPECT_FENV (V_NAME (atanhf), WANT_ERRNO) #endif diff --git a/pl/math/v_cbrtf_1u5.c b/pl/math/v_cbrtf_1u5.c index b5f4c72..756a468 100644 --- a/pl/math/v_cbrtf_1u5.c +++ b/pl/math/v_cbrtf_1u5.c @@ -89,4 +89,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, cbrt, -10.0, 10.0) PL_TEST_ULP (V_NAME (cbrtf), 1.03) +PL_TEST_EXPECT_FENV (V_NAME (cbrtf), WANT_ERRNO) #endif diff --git a/pl/math/v_cosh_2u.c b/pl/math/v_cosh_2u.c index 1cac350..63f877e 100644 --- a/pl/math/v_cosh_2u.c +++ b/pl/math/v_cosh_2u.c @@ -87,4 +87,5 @@ VPCS_ALIAS PL_SIG (V, D, 1, cosh, -10.0, 10.0) PL_TEST_ULP (V_NAME (cosh), 1.43) +PL_TEST_EXPECT_FENV (V_NAME (cosh), WANT_ERRNO) #endif diff --git a/pl/math/v_coshf_2u4.c b/pl/math/v_coshf_2u4.c index b0a2be1..f101681 100644 --- a/pl/math/v_coshf_2u4.c +++ b/pl/math/v_coshf_2u4.c @@ -63,4 +63,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, cosh, -10.0, 10.0) PL_TEST_ULP (V_NAME (coshf), 1.89) +PL_TEST_EXPECT_FENV (V_NAME (coshf), WANT_ERRNO) #endif diff --git a/pl/math/v_expm1_2u5.c b/pl/math/v_expm1_2u5.c index e0a31a5..216bdbc 100644 --- a/pl/math/v_expm1_2u5.c +++ b/pl/math/v_expm1_2u5.c @@ -103,4 +103,5 @@ VPCS_ALIAS PL_SIG (V, D, 1, expm1, -9.9, 9.9) PL_TEST_ULP (V_NAME (expm1), 1.68) +PL_TEST_EXPECT_FENV (V_NAME (expm1), WANT_ERRNO) #endif diff --git a/pl/math/v_expm1f_1u6.c b/pl/math/v_expm1f_1u6.c index dd211f9..6e47fac 100644 --- a/pl/math/v_expm1f_1u6.c +++ b/pl/math/v_expm1f_1u6.c @@ -86,4 +86,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, expm1, -9.9, 9.9) PL_TEST_ULP (V_NAME (expm1f), 1.02) +PL_TEST_EXPECT_FENV (V_NAME (expm1f), WANT_ERRNO) #endif diff --git a/pl/math/v_log1p_2u5.c b/pl/math/v_log1p_2u5.c index 889fac0..7a8c6bf 100644 --- a/pl/math/v_log1p_2u5.c +++ b/pl/math/v_log1p_2u5.c @@ -107,4 +107,5 @@ VPCS_ALIAS PL_SIG (V, D, 1, log1p, -0.9, 10.0) PL_TEST_ULP (V_NAME (log1p), 1.97) +PL_TEST_EXPECT_FENV (V_NAME (log1p), WANT_ERRNO) #endif diff --git a/pl/math/v_log1pf_2u1.c b/pl/math/v_log1pf_2u1.c index 93c896b..f351ecd 100644 --- a/pl/math/v_log1pf_2u1.c +++ b/pl/math/v_log1pf_2u1.c @@ -147,4 +147,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, log1p, -0.9, 10.0) PL_TEST_ULP (V_NAME (log1pf), 1.53) +PL_TEST_EXPECT_FENV (V_NAME (log1pf), WANT_ERRNO) #endif diff --git a/pl/math/v_log2f_2u6.c b/pl/math/v_log2f_2u6.c index 8d7d138..a3c9aac 100644 --- a/pl/math/v_log2f_2u6.c +++ b/pl/math/v_log2f_2u6.c @@ -122,4 +122,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, log2, 0.01, 11.1) PL_TEST_ULP (V_NAME (log2f), 2.10) +PL_TEST_EXPECT_FENV (V_NAME (log2f), WANT_ERRNO) #endif diff --git a/pl/math/v_sinh_3u.c b/pl/math/v_sinh_3u.c index 7d6b612..bab8896 100644 --- a/pl/math/v_sinh_3u.c +++ b/pl/math/v_sinh_3u.c @@ -46,4 +46,5 @@ VPCS_ALIAS PL_SIG (V, D, 1, sinh, -10.0, 10.0) PL_TEST_ULP (V_NAME (sinh), 2.08) +PL_TEST_EXPECT_FENV (V_NAME (sinh), WANT_ERRNO) #endif diff --git a/pl/math/v_sinhf_2u3.c b/pl/math/v_sinhf_2u3.c index 76bfe78..ecedf55 100644 --- a/pl/math/v_sinhf_2u3.c +++ b/pl/math/v_sinhf_2u3.c @@ -45,4 +45,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, sinh, -10.0, 10.0) PL_TEST_ULP (V_NAME (sinhf), 1.76) +PL_TEST_EXPECT_FENV (V_NAME (sinhf), WANT_ERRNO) #endif diff --git a/pl/math/v_tanf_3u2.c b/pl/math/v_tanf_3u2.c index 73b0807..51ede3c 100644 --- a/pl/math/v_tanf_3u2.c +++ b/pl/math/v_tanf_3u2.c @@ -119,4 +119,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, tan, -3.1, 3.1) PL_TEST_ULP (V_NAME (tanf), 2.7) +PL_TEST_EXPECT_FENV (V_NAME (tanf), WANT_ERRNO) #endif diff --git a/pl/math/v_tanhf_2u6.c b/pl/math/v_tanhf_2u6.c index bb86794..ae87f50 100644 --- a/pl/math/v_tanhf_2u6.c +++ b/pl/math/v_tanhf_2u6.c @@ -92,4 +92,5 @@ VPCS_ALIAS PL_SIG (V, F, 1, tanh, -10.0, 10.0) PL_TEST_ULP (V_NAME (tanhf), 2.09) +PL_TEST_EXPECT_FENV (V_NAME (tanhf), WANT_ERRNO) #endif |