aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Ramsay <Joe.Ramsay@arm.com>2022-12-13 10:22:26 +0000
committerJoe Ramsay <joe.ramsay@arm.com>2022-12-13 10:22:26 +0000
commit3c0af1a73df1551a372294d4b05573b2a47f051e (patch)
tree9781ed7875bc0473b740f3ddf00d2ce9850808a4
parent80abd605ee62de59fbfbaba397028326a1148a16 (diff)
downloadarm-optimized-routines-3c0af1a73df1551a372294d4b05573b2a47f051e.tar.gz
pl/math: Set fenv flags in Neon log1p
New behaviour is hidden behind WANT_ERRNO config option.
-rwxr-xr-xpl/math/test/runulp.sh8
-rw-r--r--pl/math/v_log1p_2u5.c7
2 files changed, 10 insertions, 5 deletions
diff --git a/pl/math/test/runulp.sh b/pl/math/test/runulp.sh
index 21d0a8c..a1410b4 100755
--- a/pl/math/test/runulp.sh
+++ b/pl/math/test/runulp.sh
@@ -763,10 +763,10 @@ tanf __s_tanf $runs fenv
tanf __v_tanf $runv fenv
tanf __vn_tanf $runvn fenv
tanf _ZGVnN4v_tanf $runvn fenv
-log1p __s_log1p $runs
-log1p __v_log1p $runv
-log1p __vn_log1p $runvn
-log1p _ZGVnN2v_log1p $runvn
+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
diff --git a/pl/math/v_log1p_2u5.c b/pl/math/v_log1p_2u5.c
index d97a622..3781522 100644
--- a/pl/math/v_log1p_2u5.c
+++ b/pl/math/v_log1p_2u5.c
@@ -49,6 +49,11 @@ VPCS_ATTR v_f64_t V_NAME (log1p) (v_f64_t x)
= v_cond_u64 ((ia >= v_u64 (0x7ff0000000000000))
| (ix >= 0xbff0000000000000) | (ix == 0x8000000000000000));
+#if WANT_ERRNO
+ if (unlikely (v_any_u64 (special)))
+ x = v_sel_f64 (special, v_f64 (0), x);
+#endif
+
/* With x + 1 = t * 2^k (where t = f + 1 and k is chosen such that f
is in [sqrt(2)/2, sqrt(2)]):
log1p(x) = k*log(2) + log1p(f).
@@ -92,7 +97,7 @@ VPCS_ATTR v_f64_t V_NAME (log1p) (v_f64_t x)
v_f64_t y = v_fma_f64 (f * f, p, ylo + yhi);
if (unlikely (v_any_u64 (special)))
- return specialcase (x, y, special);
+ return specialcase (v_as_f64_u64 (ix), y, special);
return y;
}