about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-05-27 13:59:24 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-05-27 13:59:24 +0000
commitbba14195895fa612a8ef484e9856127a1be4f80f (patch)
tree051ea27d98def6f54e13367559ffc7c0d7f83a24 /sysdeps
parent98c9c9d9ca6c1eb8e30fe449b1e1121b8c498715 (diff)
downloadglibc-bba14195895fa612a8ef484e9856127a1be4f80f.tar.gz
glibc-bba14195895fa612a8ef484e9856127a1be4f80f.tar.xz
glibc-bba14195895fa612a8ef484e9856127a1be4f80f.zip
Fix ldbl-128ibm ceill, rintl etc. for sNaN arguments (bug 20156).
The ldbl-128ibm implementations of ceill, floorl, roundl, truncl,
rintl and nearbyintl wrongly return an sNaN when given an sNaN
argument.  This patch fixes them to add such an argument to itself to
turn it into a quiet NaN.  (The code structure means this "else" case
applies to any argument which is zero or not finite; it's OK to do
this in all such cases.)

Tested for powerpc.

	[BZ #20156]
	* sysdeps/ieee754/ldbl-128ibm/s_ceill.c (__ceill): Add high part
	to itself when zero or not finite.
	* sysdeps/ieee754/ldbl-128ibm/s_floorl.c (__floorl): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_rintl.c (__rintl): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_roundl.c (__roundl): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/s_truncl.c (__truncl): Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_ceill.c3
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_floorl.c3
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_rintl.c3
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_roundl.c3
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_truncl.c3
5 files changed, 15 insertions, 0 deletions
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_ceill.c b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c
index 635fddc633..71f56233f9 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_ceill.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c
@@ -52,6 +52,9 @@ __ceill (long double x)
 	  ldbl_canonicalize_int (&xh, &xl);
 	}
     }
+  else
+    /* Quiet signaling NaN arguments.  */
+    xh += xh;
 
   return ldbl_pack (xh, xl);
 }
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_floorl.c b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c
index a1469646b0..61ac568c60 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_floorl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c
@@ -52,6 +52,9 @@ __floorl (long double x)
 	  ldbl_canonicalize_int (&xh, &xl);
 	}
     }
+  else
+    /* Quiet signaling NaN arguments.  */
+    xh += xh;
 
   return ldbl_pack (xh, xl);
 }
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_rintl.c b/sysdeps/ieee754/ldbl-128ibm/s_rintl.c
index e4af01c9a0..f7ff673ceb 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_rintl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_rintl.c
@@ -119,6 +119,9 @@ __rintl (long double x)
       fesetround (save_round);
 #endif
     }
+  else
+    /* Quiet signaling NaN arguments.  */
+    xh += xh;
 
   return ldbl_pack (xh, xl);
 }
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_roundl.c b/sysdeps/ieee754/ldbl-128ibm/s_roundl.c
index b01510fef3..2d75eb0ca8 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_roundl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_roundl.c
@@ -77,6 +77,9 @@ __roundl (long double x)
 	  ldbl_canonicalize_int (&xh, &xl);
 	}
     }
+  else
+    /* Quiet signaling NaN arguments.  */
+    xh += xh;
 
   return ldbl_pack (xh, xl);
 }
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_truncl.c b/sysdeps/ieee754/ldbl-128ibm/s_truncl.c
index b7d4bb5956..a2c60a89f4 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_truncl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_truncl.c
@@ -52,6 +52,9 @@ __truncl (long double x)
 	  ldbl_canonicalize_int (&xh, &xl);
 	}
     }
+  else
+    /* Quiet signaling NaN arguments.  */
+    xh += xh;
 
   return ldbl_pack (xh, xl);
 }