summaryrefslogtreecommitdiff
path: root/sysdeps/ieee754
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2026-03-09 17:11:12 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2026-04-07 13:21:20 -0300
commitdfb150f3aadd93118a78ef9e19c2663f0e1994b7 (patch)
tree8bc471e67e81b32a5c9b1daaf97e8431f1a4fb8f /sysdeps/ieee754
parent7594b4e5a75d41e891782aa7e3fb51924f6840cb (diff)
math: Add fast-path to fmaHEADorigin/masterorigin/HEADmaster
For normal numbers there is no need to issue scalbn, the fma can set the exponend directly. Performance-wise on x86_64-linux-gnu without multi-arch it shows a latency improvement of ~5% and throughput of %7 (and sligth more for ABIs witht tail-call optimization). Checked on x86_64-linux-gnu and i686-linux-gnu with --disable-multi-arch. Reviewed-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r--sysdeps/ieee754/dbl-64/s_fma.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c
index d65d505915..88bda86943 100644
--- a/sysdeps/ieee754/dbl-64/s_fma.c
+++ b/sysdeps/ieee754/dbl-64/s_fma.c
@@ -192,7 +192,10 @@ __fma (double x, double y, double z)
i = -i;
double r = convertfromint64 (i); /* |r| is in [0x1p62,0x1p63] */
- if (e < -1022 - 62)
+ if (__glibc_likely (e >= -1084 && e <= 960))
+ /* Fast-path for normal numbers. */
+ return asdouble (asuint64 (r) + ((int64_t) e << MANTISSA_WIDTH));
+ else if (e < -1022 - 62)
{
/* Result is subnormal before rounding. */
if (e == -1022 - 63)