From 76c96cf7ec0dc38089c9a887f80b3222f6084c82 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 11 Mar 2014 22:30:40 +0000 Subject: [PATCH] Fix MIPS libc_feresetround*_ctx to preserve exceptions. Testing on mips64 showed missing underflow exceptions (from exp, for example) in non-default rounding modes, caused by libc_feresetround*_ctx wrongly restoring a saved environment without preserving exceptions, when that's only valid for the _noex variants. (I don't know why Steve didn't see this in his testing.) This patch fixes this by using libc_feupdateenv_mips_ctx for the relevant macros and removing the problem definitions. The problem definitions aren't suitable for the _noex macros either because they only discard exceptions in non-default rounding modes, and while for some uses of *_noex/*_NOEX it doesn't matter whether exceptions are discarded, dbl-64/e_remainder.c requires SET_RESTORE_ROUND_NOEX to cause exceptions to be discarded. I think the accumulated set of macros / functions for optimized exception / rounding mode handling could do with a careful review by now, and possible refactoring, and at least one new feature (extracting the saved rounding mode from an environment / context variable - see dbl-64/e_sqrt.c for a case where this could be used). Tested mips64. * sysdeps/mips/math_private.h [__mips_hard_float] (libc_feresetround_ctx): Define to libc_feupdateenv_mips_ctx not libc_feresetround_mips_ctx. [__mips_hard_float] (libc_feresetroundf_ctx): Likewise. [__mips_hard_float] (libc_feresetroundl_ctx): Likewise. [__mips_hard_float] (libc_feresetround_mips_ctx): Remove. --- ChangeLog | 7 +++++++ sysdeps/mips/math_private.h | 13 +++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ca74dc312b..cae7f85a68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2014-03-11 Joseph Myers + * sysdeps/mips/math_private.h [__mips_hard_float] + (libc_feresetround_ctx): Define to libc_feupdateenv_mips_ctx not + libc_feresetround_mips_ctx. + [__mips_hard_float] (libc_feresetroundf_ctx): Likewise. + [__mips_hard_float] (libc_feresetroundl_ctx): Likewise. + [__mips_hard_float] (libc_feresetround_mips_ctx): Remove. + [BZ #16677] * math/s_nextafter.c (__nextafter): Do not return value from overflowing computation. diff --git a/sysdeps/mips/math_private.h b/sysdeps/mips/math_private.h index edf604728c..7f2cdf5459 100644 --- a/sysdeps/mips/math_private.h +++ b/sysdeps/mips/math_private.h @@ -217,6 +217,9 @@ libc_feupdateenv_mips_ctx (struct rm_ctx *ctx) # define libc_feupdateenv_ctx libc_feupdateenv_mips_ctx # define libc_feupdateenvf_ctx libc_feupdateenv_mips_ctx # define libc_feupdateenvl_ctx libc_feupdateenv_mips_ctx +# define libc_feresetround_ctx libc_feupdateenv_mips_ctx +# define libc_feresetroundf_ctx libc_feupdateenv_mips_ctx +# define libc_feresetroundl_ctx libc_feupdateenv_mips_ctx static __always_inline void libc_feholdsetround_mips_ctx (struct rm_ctx *ctx, int round) @@ -242,16 +245,6 @@ libc_feholdsetround_mips_ctx (struct rm_ctx *ctx, int round) # define libc_feholdsetroundf_ctx libc_feholdsetround_mips_ctx # define libc_feholdsetroundl_ctx libc_feholdsetround_mips_ctx -static __always_inline void -libc_feresetround_mips_ctx (struct rm_ctx *ctx) -{ - if (__glibc_unlikely (ctx->updated_status)) - _FPU_SETCW (ctx->env); -} -# define libc_feresetround_ctx libc_feresetround_mips_ctx -# define libc_feresetroundf_ctx libc_feresetround_mips_ctx -# define libc_feresetroundl_ctx libc_feresetround_mips_ctx - #endif #include_next -- 2.11.4.GIT