about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2018-01-03 17:03:48 -0200
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2018-01-04 17:49:17 -0200
commitb0a4eca2fcfe2a6bc3cbb3951241c4facc887670 (patch)
tree9a054c288d58f4aa2eeb8624ec3eb486fd45d6a8
parent4854ddd874d4aafb1ac21f551abda58ac4f9144d (diff)
downloadglibc-b0a4eca2fcfe2a6bc3cbb3951241c4facc887670.tar.gz
glibc-b0a4eca2fcfe2a6bc3cbb3951241c4facc887670.tar.xz
glibc-b0a4eca2fcfe2a6bc3cbb3951241c4facc887670.zip
alpha: Remove s_trunc{f} implementation (BZ#22666)
As discussed in libc-alpha [1], alpha trunc{f} implementation uses
addt/suc and subt/suc and although the Alpha Architecture
Handbook version 3 states that that ADDx SUBx OUTPUT Exceptions
(B.3 Mapping to IEEE Standard) should not generate Inexact if INE
bit is set, the Alpha 21264 [2] chip manual (A.8 IEEE Floating-Point
Conformance) states that ADDx SUBx OUTPUT does generate inexact
exception for inexact result regardless.

As Joseph noted [3] to correctly fix it on alpha we need to either
avoid the instruction or avoid any inexact bit from it being set
on return from the function (while preserving the inexact bit that
might be set on the entry to the function).  The later will result
mf_fpcr followed by a mt_fpcr to get and set the fpcr which will
defeat the optimization itself.

So the patch just remove the alpha optimized and rely on generic
implementation.  It fixes the math/test-*-{trunc} on alpha.

        [BZ #15479]
        [BZ #22666]
        * sysdeps/alpha/fpu/s_trunc.c: Remove file.
        * sysdeps/alpha/fpu/s_truncf.c: Likewise.

[1] https://sourceware.org/ml/libc-alpha/2018-01/msg00114.html
[2] https://www.star.bnl.gov/public/daq/HARDWARE/21264_data_sheet.pdf
[3] https://sourceware.org/ml/libc-alpha/2018-01/msg00086.html

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/alpha/fpu/s_trunc.c45
-rw-r--r--sysdeps/alpha/fpu/s_truncf.c44
3 files changed, 5 insertions, 89 deletions
diff --git a/ChangeLog b/ChangeLog
index 41af6507c6..485e526035 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,11 @@
 2018-01-03  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
 	[BZ #15479]
+	[BZ #22666]
+	* sysdeps/alpha/fpu/s_trunc.c: Remove file.
+	* sysdeps/alpha/fpu/s_truncf.c: Likewise.
+
+	[BZ #15479]
 	[BZ #22665]
 	* sysdeps/alpha/fpu/s_ceil.c: Remove file.
 	* sysdeps/alpha/fpu/s_ceilf.c: Likewise.
diff --git a/sysdeps/alpha/fpu/s_trunc.c b/sysdeps/alpha/fpu/s_trunc.c
deleted file mode 100644
index 6ba7297614..0000000000
--- a/sysdeps/alpha/fpu/s_trunc.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 2007-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
-
-
-/* Use the chopped rounding mode conversion instructions to implement trunc. */
-
-double
-__trunc (double x)
-{
-  double two52 = copysign (0x1.0p52, x);
-  double r, tmp;
-
-  if (isgreaterequal (fabs (x), 0x1.0p52))
-    return x;
-
-  __asm (
-	 "addt/suc %2, %3, %1\n\tsubt/suc %1, %3, %0"
-	 : "=&f"(r), "=&f"(tmp)
-	 : "f"(x), "f"(two52));
-
-  /* trunc(-0) == -0, and in general we'll always have the same
-     sign as our input.  */
-  return copysign (r, x);
-}
-
-libm_alias_double (__trunc, trunc)
diff --git a/sysdeps/alpha/fpu/s_truncf.c b/sysdeps/alpha/fpu/s_truncf.c
deleted file mode 100644
index 168c5a4f2a..0000000000
--- a/sysdeps/alpha/fpu/s_truncf.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (C) 2007-2018 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <math.h>
-#include <libm-alias-float.h>
-
-
-/* Use the chopped rounding mode conversion instructions to implement trunc. */
-
-float
-__truncf (float x)
-{
-  float two23 = copysignf (0x1.0p23, x);
-  float r, tmp;
-
-  if (isgreaterequal (fabsf (x), 0x1.0p23))
-    return x;
-
-  __asm (
-	 "adds/suc %2, %3, %1\n\tsubs/suc %1, %3, %0"
-	 : "=&f"(r), "=&f"(tmp)
-	 : "f"(x), "f"(two23));
-
-  /* trunc(-0) == -0, and in general we'll always have the same
-     sign as our input.  */
-  return copysignf (r, x);
-}
-
-libm_alias_float (__trunc, trunc)