This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Fix sign of inexact zero results for ldbl-128ibm fmal
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Thu, 22 Nov 2012 02:47:51 +0000
- Subject: Fix sign of inexact zero results for ldbl-128ibm fmal
This patch fixes signs of inexact zero results from fmal (x, y, 0) for
ldbl-128ibm in the same way as fixed for other fma implementations.
(The ldbl-128ibm implementation still needs replacing by a proper
implementation that actually does a fused operation, this patch is simply
about eliminating some of the testsuite failures.)
Tested that this eliminates the fmal testsuite failures for zero
results for ldbl-128ibm.
2012-11-22 Joseph Myers <joseph@codesourcery.com>
[BZ #14645]
* sysdeps/ieee754/ldbl-128ibm/s_fmal.c (__fmal): Compute result as
x * y if x and y are nonzero and z is zero.
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c
index a868b8d..6706eb2 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c
@@ -1,5 +1,5 @@
/* Compute x * y + z as ternary operation.
- Copyright (C) 2011 Free Software Foundation, Inc.
+ Copyright (C) 2011-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David Flaherty <flaherty@linux.vnet.ibm.com>.
@@ -29,6 +29,12 @@ __fmal (long double x, long double y, long double z)
if ((finite ((double)x) && finite ((double)y)) && isinf ((double)z))
return (z);
+ /* If z is zero and x are y are nonzero, compute the result
+ as x * y to avoid the wrong sign of a zero result if x * y
+ underflows to 0. */
+ if (z == 0 && x != 0 && y != 0)
+ return x * y;
+
return (x * y) + z;
}
#ifdef IS_IN_libm
--
Joseph S. Myers
joseph@codesourcery.com