]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
alpha: fix floor on sNaN input
authorAurelien Jarno <aurelien@aurel32.net>
Tue, 2 Aug 2016 07:18:59 +0000 (09:18 +0200)
committerMike Frysinger <vapier@gentoo.org>
Thu, 8 Dec 2016 05:56:59 +0000 (00:56 -0500)
The alpha version of floor wrongly return sNaN for sNaN input. Fix that
by checking for NaN and by returning the input value added with itself
in that case.

Finally remove the code to handle inexact exception, floor should never
generate such an exception.

Changelog:
* sysdeps/alpha/fpu/s_floor.c (__floor): Add argument with itself
when it is a NaN.
[_IEEE_FP_INEXACT] Remove.
* sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.

(cherry picked from commit 65cc568cf57156e5230db9a061645e54ff028a41)

ChangeLog
sysdeps/alpha/fpu/s_floor.c
sysdeps/alpha/fpu/s_floorf.c

index 927e1ae9b426e032e0cfa475ad6000bd9a25cc18..77204f41bc35a6ab5cb99c0b484ce467e532fcd7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,10 @@
        when it is a NaN.
        [_IEEE_FP_INEXACT] Remove.
        * sysdeps/alpha/fpu/s_ceilf.c (__ceilf): Likewise.
+       * sysdeps/alpha/fpu/s_floor.c (__floor): Add argument with itself
+       when it is a NaN.
+       [_IEEE_FP_INEXACT] Remove.
+       * sysdeps/alpha/fpu/s_floorf.c (__floorf): Likewise.
 
 2016-11-30  H.J. Lu  <hongjiu.lu@intel.com>
 
index 1a6f8c4617567b6394ea979fa2b8afcd4144566f..9930f6be42afe86b69061634d4dd97735c732cdc 100644 (file)
 double
 __floor (double x)
 {
+  if (isnan (x))
+    return x + x;
+
   if (isless (fabs (x), 9007199254740992.0))   /* 1 << DBL_MANT_DIG */
     {
       double tmp1, new_x;
 
       __asm (
-#ifdef _IEEE_FP_INEXACT
-            "cvttq/svim %2,%1\n\t"
-#else
             "cvttq/svm %2,%1\n\t"
-#endif
             "cvtqt/m %1,%0\n\t"
             : "=f"(new_x), "=&f"(tmp1)
             : "f"(x));
index 8cd80e2b42d7e27c60e42f690d90bd5920536fd4..015c04f40d805b57f75f79eb19c86f52c76067c6 100644 (file)
@@ -26,6 +26,9 @@
 float
 __floorf (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
@@ -36,11 +39,7 @@ __floorf (float x)
       float tmp1, tmp2, new_x;
 
       __asm ("cvtst/s %3,%2\n\t"
-#ifdef _IEEE_FP_INEXACT
-            "cvttq/svim %2,%1\n\t"
-#else
             "cvttq/svm %2,%1\n\t"
-#endif
             "cvtqt/m %1,%0\n\t"
             : "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2)
             : "f"(x));