]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
alpha: fix ceil 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:55 +0000 (00:56 -0500)
The alpha version of ceil 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, ceil should never
generate such an exception.

Changelog:
* sysdeps/alpha/fpu/s_ceil.c (__ceil): Add argument with itself
when it is a NaN.
[_IEEE_FP_INEXACT] Remove.
* sysdeps/alpha/fpu/s_ceilf.c (__ceilf): Likewise.

(cherry picked from commit 062e53c195b4a87754632c7d51254867247698b4)

ChangeLog
sysdeps/alpha/fpu/s_ceil.c
sysdeps/alpha/fpu/s_ceilf.c

index de93501270294506e28fc51c8a2786f2b9471d0c..927e1ae9b426e032e0cfa475ad6000bd9a25cc18 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+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.
+       * sysdeps/alpha/fpu/s_ceilf.c (__ceilf): Likewise.
+
 2016-11-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        [BZ #20495]
index c1ff864d4b86976ee509ea39f73bb3a1713ffb1b..e9c350af1cc014f900b4a1f09322fd6d2aca8c42 100644 (file)
 double
 __ceil (double x)
 {
+  if (isnan (x))
+    return x + x;
+
   if (isless (fabs (x), 9007199254740992.0))   /* 1 << DBL_MANT_DIG */
     {
       double tmp1, new_x;
 
       new_x = -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"(new_x));
index 7e63a6fe94e7e416ab20c1f3778904556a336339..77e01a99f743cb5b7547f41a0262ad498e4ebe13 100644 (file)
@@ -25,6 +25,9 @@
 float
 __ceilf (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 @@ __ceilf (float x)
 
       new_x = -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"(new_x));