about summary refs log tree commit diff
path: root/sysdeps/ieee754/ldbl-96/s_fma.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-10-15 15:26:06 -0400
committerUlrich Drepper <drepper@gmail.com>2010-10-15 15:26:06 -0400
commit3e692e0518b4f4679352d25102bd47cf3f85c592 (patch)
treea3f4cefdf037d6c72a8267277dbe0bd0922f2d3e /sysdeps/ieee754/ldbl-96/s_fma.c
parentf3f7372de1401b99f0a318ce09caf73e42d6f022 (diff)
downloadglibc-3e692e0518b4f4679352d25102bd47cf3f85c592.tar.gz
glibc-3e692e0518b4f4679352d25102bd47cf3f85c592.tar.xz
glibc-3e692e0518b4f4679352d25102bd47cf3f85c592.zip
Implement fmal, some fma bugfixes
Diffstat (limited to 'sysdeps/ieee754/ldbl-96/s_fma.c')
-rw-r--r--sysdeps/ieee754/ldbl-96/s_fma.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sysdeps/ieee754/ldbl-96/s_fma.c b/sysdeps/ieee754/ldbl-96/s_fma.c
index 90c6d1f29d..6c7e9d0d36 100644
--- a/sysdeps/ieee754/ldbl-96/s_fma.c
+++ b/sysdeps/ieee754/ldbl-96/s_fma.c
@@ -30,11 +30,20 @@
 double
 __fma (double x, double y, double z)
 {
+  if (__builtin_expect (isinf (z), 0))
+    {
+      /* If z is Inf, but x and y are finite, the result should be
+	 z rather than NaN.  */
+      if (finite (x) && finite (y))
+	return (z + x) + y;
+      return (x * y) + z;
+    }
+
   /* Multiplication m1 + m2 = x * y using Dekker's algorithm.  */
 #define C ((1ULL << (LDBL_MANT_DIG + 1) / 2) + 1)
-  long double x1 = x * C;
-  long double y1 = y * C;
-  long double m1 = x * y;
+  long double x1 = (long double) x * C;
+  long double y1 = (long double) y * C;
+  long double m1 = (long double) x * y;
   x1 = (x - x1) + x1;
   y1 = (y - y1) + y1;
   long double x2 = x - x1;