about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAurelien Jarno <aurelien@aurel32.net>2016-08-02 09:18:59 +0200
committerMike Frysinger <vapier@gentoo.org>2016-12-08 00:36:15 -0500
commit51a313c50445eded2cfbbb60da2bbb98f3e9b219 (patch)
treeb63c49a151e3f80da458a7921da6a0a205193164
parent12bf4f130d46a075c628a2c948b31973b2a12222 (diff)
downloadglibc-51a313c50445eded2cfbbb60da2bbb98f3e9b219.tar.gz
glibc-51a313c50445eded2cfbbb60da2bbb98f3e9b219.tar.xz
glibc-51a313c50445eded2cfbbb60da2bbb98f3e9b219.zip
alpha: fix rint on sNaN input
The alpha version of rint wrongly return sNaN for sNaN input. Fix that
by checking for NaN and by returning the input value added with itself
in that case.

Changelog:
	* sysdeps/alpha/fpu/s_rint.c (__rint): Add argument with itself
	when it is a NaN.
	* sysdeps/alpha/fpu/s_rintf.c (__rintf): Likewise.

(cherry picked from commit cb7f9d63b921ea1a1cbb4ab377a8484fd5da9a2b)
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/alpha/fpu/s_rint.c3
-rw-r--r--sysdeps/alpha/fpu/s_rintf.c3
3 files changed, 11 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f8dc172cc..b4d4b6af2a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2016-08-02  Aurelien Jarno  <aurelien@aurel32.net>
 
+2016-08-02  Aurelien Jarno  <aurelien@aurel32.net>
+
 	* sysdeps/alpha/fpu/s_ceil.c (__ceil): Add argument with itself
 	when it is a NaN.
 	[_IEEE_FP_INEXACT] Remove.
@@ -8,6 +10,9 @@
 	when it is a NaN.
 	[_IEEE_FP_INEXACT] Remove.
 	* sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.
+	* sysdeps/alpha/fpu/s_rint.c (__rint): Add argument with itself
+	when it is a NaN.
+	* sysdeps/alpha/fpu/s_rintf.c (__rintf): Likewise.
 
 2016-11-23  Matthew Fortune  <Matthew.Fortune@imgtec.com>
 	    Maciej W. Rozycki  <macro@imgtec.com>
diff --git a/sysdeps/alpha/fpu/s_rint.c b/sysdeps/alpha/fpu/s_rint.c
index f33fe72c11..259348afc0 100644
--- a/sysdeps/alpha/fpu/s_rint.c
+++ b/sysdeps/alpha/fpu/s_rint.c
@@ -23,6 +23,9 @@
 double
 __rint (double x)
 {
+  if (isnan (x))
+    return x + x;
+
   if (isless (fabs (x), 9007199254740992.0))	/* 1 << DBL_MANT_DIG */
     {
       double tmp1, new_x;
diff --git a/sysdeps/alpha/fpu/s_rintf.c b/sysdeps/alpha/fpu/s_rintf.c
index 1400dfe8d7..645728ad5b 100644
--- a/sysdeps/alpha/fpu/s_rintf.c
+++ b/sysdeps/alpha/fpu/s_rintf.c
@@ -22,6 +22,9 @@
 float
 __rintf (float x)
 {
+  if (isnanf (x))
+    return x + x;
+
   if (isless (fabsf (x), 16777216.0f))	/* 1 << FLT_MANT_DIG */
     {
       /* Note that Alpha S_Floating is stored in registers in a