diff options
author | Richard Henderson <rth@twiddle.net> | 2014-08-05 13:36:36 -0700 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2014-08-05 13:36:36 -0700 |
commit | 27bb6dc0db1d0da548a0be3ec1aa33e2c25565cd (patch) | |
tree | 827283a9175ea2dcf94027ebca637fd5ec83bda7 | |
parent | d3f364d3c79cc6cbeb0bf6f8cec90c9e4465db0f (diff) | |
download | glibc-27bb6dc0db1d0da548a0be3ec1aa33e2c25565cd.tar glibc-27bb6dc0db1d0da548a0be3ec1aa33e2c25565cd.tar.gz glibc-27bb6dc0db1d0da548a0be3ec1aa33e2c25565cd.tar.bz2 glibc-27bb6dc0db1d0da548a0be3ec1aa33e2c25565cd.zip |
alpha: Fix exception raising from soft-fp
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.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | sysdeps/alpha/soft-fp/Makefile | 3 | ||||
-rw-r--r-- | sysdeps/alpha/soft-fp/ots_cvtxq.c | 4 | ||||
-rw-r--r-- | sysdeps/alpha/soft-fp/sfp-machine.h | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/fraiseexcpt.S | 9 |
5 files changed, 21 insertions, 12 deletions
@@ -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> diff --git a/sysdeps/alpha/soft-fp/Makefile b/sysdeps/alpha/soft-fp/Makefile index 5410a78984..83baa7c49d 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 1eef9490c3..2447a381ac 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 e11a8dd7ca..bd78534163 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 3db92d598b..c5fa62bc99 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 |