]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
alpha: fix trunc for big input values
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:57:11 +0000 (00:57 -0500)
The alpha specific version of trunc and truncf always add and subtract
0x1.0p23 or 0x1.0p52 even for big values. This causes this kind of
errors in the testsuite:

  Failure: Test: trunc_towardzero (0x1p107)
  Result:
   is:          1.6225927682921334e+32   0x1.fffffffffffffp+106
   should be:   1.6225927682921336e+32   0x1.0000000000000p+107
   difference:  1.8014398509481984e+16   0x1.0000000000000p+54
   ulp       :  0.5000
   max.ulp   :  0.0000

Change this by returning the input value when its absolute value is
greater than 0x1.0p23 or 0x1.0p52. NaN have to go through the add and
subtract operations to get possibly silenced.

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

Changelog:
* sysdeps/alpha/fpu/s_trunc.c (__trunc): Return the input value
when its absolute value is greater than 0x1.0p52.
[_IEEE_FP_INEXACT] Remove.
* sysdeps/alpha/fpu/s_truncf.c (__truncf): Return the input value
when its absolute value is greater than 0x1.0p23.
[_IEEE_FP_INEXACT] Remove.

(cherry picked from commit b74d259fe793499134eb743222cd8dd7c74a31ce)

ChangeLog
sysdeps/alpha/fpu/s_trunc.c
sysdeps/alpha/fpu/s_truncf.c

index 66cfa3d420c8d6e769048d6f4d7fd88c38283bc3..06360aa836622e8c02226d22b3a9f8a4770a95be 100644 (file)
--- a/ChangeLog
+++ b/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.
+       * sysdeps/alpha/fpu/s_trunc.c (__trunc): Return the input value
+       when its absolute value is greater than 0x1.0p52.
+       [_IEEE_FP_INEXACT] Remove.
+       * sysdeps/alpha/fpu/s_truncf.c (__truncf): Return the input value
+       when its absolute value is greater than 0x1.0p23.
+       [_IEEE_FP_INEXACT] Remove.
 
 2016-11-30  H.J. Lu  <hongjiu.lu@intel.com>
 
index 16cb114a72f5f13f780e21bf71d89a39e2986eaa..4b986a6926ebc323e89747dcfe201d13a15634e5 100644 (file)
@@ -28,12 +28,11 @@ __trunc (double x)
   double two52 = copysign (0x1.0p52, x);
   double r, tmp;
 
+  if (isgreaterequal (fabs (x), 0x1.0p52))
+    return x;
+
   __asm (
-#ifdef _IEEE_FP_INEXACT
-        "addt/suic %2, %3, %1\n\tsubt/suic %1, %3, %0"
-#else
         "addt/suc %2, %3, %1\n\tsubt/suc %1, %3, %0"
-#endif
         : "=&f"(r), "=&f"(tmp)
         : "f"(x), "f"(two52));
 
index 2290f282954ddb0fa3bcf5b8aa771c6947075f04..3e933561663bea13423fe335d7c76e32d6e83804 100644 (file)
@@ -27,12 +27,11 @@ __truncf (float x)
   float two23 = copysignf (0x1.0p23, x);
   float r, tmp;
 
+  if (isgreaterequal (fabsf (x), 0x1.0p23))
+    return x;
+
   __asm (
-#ifdef _IEEE_FP_INEXACT
-        "adds/suic %2, %3, %1\n\tsubs/suic %1, %3, %0"
-#else
         "adds/suc %2, %3, %1\n\tsubs/suc %1, %3, %0"
-#endif
         : "=&f"(r), "=&f"(tmp)
         : "f"(x), "f"(two23));