Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Oct 2024 01:19:46 GMT
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 3d77026d8a48 - stable/13 - libm: fma: correct zero sign with small inputs
Message-ID:  <202410010119.4911Jk59016799@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=3d77026d8a48a8d056a145b56f288f838c159afc

commit 3d77026d8a48a8d056a145b56f288f838c159afc
Author:     Steve Kargl <kargl@FreeBSD.org>
AuthorDate: 2024-06-16 23:41:38 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2024-10-01 01:19:13 +0000

    libm: fma: correct zero sign with small inputs
    
    This is a fixed version of 888796ade284.
    
    PR:             277783
    Reported by:    Victor Stinner
    Reviewed by:    emaste
    MFC after:      1 week
    
    (cherry picked from commit 888796ade2842486d3167067e8034254c38aadd3)
    (cherry picked from commit e77ad954bb825983b4346b9cc646c9c910b1be24)
    (cherry picked from commit 34f746cc7f8a8dd261027a8b392b76e70adc8438)
    (cherry picked from commit dc39004bc670fe33ae6759816380c93a37268dd6)
---
 lib/msun/src/s_fma.c  | 4 ++--
 lib/msun/src/s_fmal.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/msun/src/s_fma.c b/lib/msun/src/s_fma.c
index 017067c6c92a..fb12c0369fec 100644
--- a/lib/msun/src/s_fma.c
+++ b/lib/msun/src/s_fma.c
@@ -261,14 +261,14 @@ fma(double x, double y, double z)
 
 	spread = ex + ey;
 
-	if (r.hi == 0.0) {
+	if (r.hi == 0.0 && xy.lo == 0) {
 		/*
 		 * When the addends cancel to 0, ensure that the result has
 		 * the correct sign.
 		 */
 		fesetround(oround);
 		volatile double vzs = zs; /* XXX gcc CSE bug workaround */
-		return (xy.hi + vzs + ldexp(xy.lo, spread));
+		return (xy.hi + vzs);
 	}
 
 	if (oround != FE_TONEAREST) {
diff --git a/lib/msun/src/s_fmal.c b/lib/msun/src/s_fmal.c
index acaaaaf3678d..f7aa42287d7a 100644
--- a/lib/msun/src/s_fmal.c
+++ b/lib/msun/src/s_fmal.c
@@ -242,14 +242,14 @@ fmal(long double x, long double y, long double z)
 
 	spread = ex + ey;
 
-	if (r.hi == 0.0) {
+	if (r.hi == 0.0 && xy.lo == 0) {
 		/*
 		 * When the addends cancel to 0, ensure that the result has
 		 * the correct sign.
 		 */
 		fesetround(oround);
 		volatile long double vzs = zs; /* XXX gcc CSE bug workaround */
-		return (xy.hi + vzs + ldexpl(xy.lo, spread));
+		return (xy.hi + vzs);
 	}
 
 	if (oround != FE_TONEAREST) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202410010119.4911Jk59016799>