alpha: Fix exception raising from soft-fp
authorRichard Henderson <rth@twiddle.net>
Tue, 5 Aug 2014 20:36:36 +0000 (13:36 -0700)
committerRichard Henderson <rth@twiddle.net>
Tue, 5 Aug 2014 20:36:36 +0000 (13:36 -0700)
Use the SSI_IEEE_RAISE_EXCEPTION function as from feraiseexcept,
instead of __ieee_get+set_fp_status.  Always raise the FP exceptions
from float-to-integer conversion.

ChangeLog
sysdeps/alpha/soft-fp/Makefile
sysdeps/alpha/soft-fp/ots_cvtxq.c
sysdeps/alpha/soft-fp/sfp-machine.h
sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S

index d94f255..e02d51c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2014-08-05  Richard Henderson  <rth@redhat.com>
 
+       * 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.
+
        * sysdeps/unix/sysv/linux/alpha/lowlevellock.h: Remove file.
 
 2014-08-04  Bernard Ogden  <bernie.ogden@linaro.org>
index 5410a78..83baa7c 100644 (file)
@@ -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)
index 1eef949..2447a38 100644 (file)
@@ -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;
 }
index e11a8dd..bd78534 100644 (file)
@@ -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                                 \
index 3db92d5..c5fa62b 100644 (file)
@@ -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