This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[COMMITTED] alpha: Fix exception raising from soft-fp
- From: Richard Henderson <rth at twiddle dot net>
- To: libc-alpha at sourceware dot org
- Date: Tue, 5 Aug 2014 10:46:59 -1000
- Subject: [COMMITTED] alpha: Fix exception raising from soft-fp
- Authentication-results: sourceware.org; auth=none
Use the SSI_IEEE_RAISE_EXCEPTION function as from feraiseexcept,
instead of __ieee_get+set_fp_status. Since the normal function
is in libm, pull a private copy into libc.
Always raise the FP exceptions from float-to-integer conversion.
The comment re overflow detection is as for cvttq/v, which raises
a separate integer overflow exception. We don't handle this bit
either before or after this patch. Anyway, one must use a special
compler flag to enable this mode, not unlike -ftrapv.
Fixes all of the failures in math/test-ldouble.
r~
---
ChangeLog | 9 +++++++++
sysdeps/alpha/soft-fp/Makefile | 3 ++-
sysdeps/alpha/soft-fp/ots_cvtxq.c | 4 +---
sysdeps/alpha/soft-fp/sfp-machine.h | 8 ++++----
sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S | 9 +++++----
5 files changed, 21 insertions(+), 12 deletions(-)
* sysdeps/alpha/soft-fp/ots_cvtxq.c (_OtsCvtXQ): Always raise
exceptions.
* sysdeps/alpha/soft-fp/Makefile [soft-fp] (sysdep_routines):
Add fraiseexcpt.
* sysdeps/alpha/soft-fp/sfp-machine.h (FP_HANDLE_EXCEPTIONS):
Use __feraiseexcept.
* sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S (feraiseexcept):
Protect libm symbols with IS_IN_libm.
2014-08-04 Bernard Ogden <bernie.ogden@linaro.org>
diff --git a/sysdeps/alpha/soft-fp/Makefile b/sysdeps/alpha/soft-fp/Makefile
index 5410a78..83baa7c 100644
--- a/sysdeps/alpha/soft-fp/Makefile
+++ b/sysdeps/alpha/soft-fp/Makefile
@@ -2,7 +2,8 @@
ifeq ($(subdir),soft-fp)
sysdep_routines += ots_add ots_sub ots_mul ots_div ots_cmp ots_cmpe \
- ots_cvtxq ots_cvtqx ots_cvtqux ots_cvttx ots_cvtxt ots_nintxq
+ ots_cvtxq ots_cvtqx ots_cvtqux ots_cvttx ots_cvtxt ots_nintxq \
+ fraiseexcpt
endif
ifeq ($(subdir),math)
diff --git a/sysdeps/alpha/soft-fp/ots_cvtxq.c b/sysdeps/alpha/soft-fp/ots_cvtxq.c
index 1eef949..2447a38 100644
--- a/sysdeps/alpha/soft-fp/ots_cvtxq.c
+++ b/sysdeps/alpha/soft-fp/ots_cvtxq.c
@@ -35,9 +35,7 @@ _OtsCvtXQ (long al, long ah, long _round)
FP_INIT_ROUNDMODE;
FP_UNPACK_RAW_Q(A, a);
FP_TO_INT_Q(r, A, 64, s);
-
- if (s > 0 && (_fex &= FP_EX_INVALID))
- FP_HANDLE_EXCEPTIONS;
+ FP_HANDLE_EXCEPTIONS;
return r;
}
diff --git a/sysdeps/alpha/soft-fp/sfp-machine.h b/sysdeps/alpha/soft-fp/sfp-machine.h
index e11a8dd..bd78534 100644
--- a/sysdeps/alpha/soft-fp/sfp-machine.h
+++ b/sysdeps/alpha/soft-fp/sfp-machine.h
@@ -86,13 +86,13 @@ do { \
} \
} while (0)
+/* We copy the libm function into libc for soft-fp. */
+extern int __feraiseexcept (int __excepts) attribute_hidden;
+
#define FP_HANDLE_EXCEPTIONS \
do { \
if (__builtin_expect (_fex, 0)) \
- { \
- unsigned long t = __ieee_get_fp_control (); \
- __ieee_set_fp_control (t | _fex); \
- } \
+ __feraiseexcept (_fex); \
} while (0)
#define FP_TRAPPING_EXCEPTIONS \
diff --git a/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S b/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S
index 3db92d5..c5fa62b 100644
--- a/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S
+++ b/sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S
@@ -46,11 +46,12 @@ ENTRY(__feraiseexcept)
END(__feraiseexcept)
cfi_endproc
-#include <shlib-compat.h>
-#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
+#ifdef IS_IN_libm
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2)
strong_alias (__feraiseexcept, __old_feraiseexcept)
compat_symbol (libm, __old_feraiseexcept, feraiseexcept, GLIBC_2_1);
-#endif
-
+# endif
libm_hidden_ver (__feraiseexcept, feraiseexcept)
versioned_symbol (libm, __feraiseexcept, feraiseexcept, GLIBC_2_2);
+#endif
--
1.9.3