diff options
author | Florian Weimer <fweimer@redhat.com> | 2018-06-21 08:04:29 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2018-06-21 08:04:29 +0200 |
commit | f496b28e61d0342f579bf794c71b80e9c7d0b1b5 (patch) | |
tree | ee777dc879fab83f1b9c110ee97721d2b4aac4d3 /sysdeps/generic | |
parent | 99c7adf99fd0ec4526e592816588d9e3de9a8a4e (diff) | |
download | glibc-f496b28e61d0342f579bf794c71b80e9c7d0b1b5.tar.gz glibc-f496b28e61d0342f579bf794c71b80e9c7d0b1b5.tar.xz glibc-f496b28e61d0342f579bf794c71b80e9c7d0b1b5.zip |
math: Set 387 and SSE2 rounding mode for tgamma on i386 [BZ #23253]
Previously, only the SSE2 rounding mode was set, so the assembler implementations using 387 were not following the expecting rounding mode.
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/math_private.h | 68 |
1 files changed, 37 insertions, 31 deletions
diff --git a/sysdeps/generic/math_private.h b/sysdeps/generic/math_private.h index b6612ba6bf..1212abaf47 100644 --- a/sysdeps/generic/math_private.h +++ b/sysdeps/generic/math_private.h @@ -428,33 +428,6 @@ default_libc_feupdateenv_test (fenv_t *e, int ex) # define HAVE_RM_CTX 0 #endif -#if HAVE_RM_CTX -/* Set/Restore Rounding Modes only when necessary. If defined, these functions - set/restore floating point state only if the state needed within the lexical - block is different from the current state. This saves a lot of time when - the floating point unit is much slower than the fixed point units. */ - -# ifndef libc_feholdsetround_noex_ctx -# define libc_feholdsetround_noex_ctx libc_feholdsetround_ctx -# endif -# ifndef libc_feholdsetround_noexf_ctx -# define libc_feholdsetround_noexf_ctx libc_feholdsetroundf_ctx -# endif -# ifndef libc_feholdsetround_noexl_ctx -# define libc_feholdsetround_noexl_ctx libc_feholdsetroundl_ctx -# endif - -# ifndef libc_feresetround_noex_ctx -# define libc_feresetround_noex_ctx libc_fesetenv_ctx -# endif -# ifndef libc_feresetround_noexf_ctx -# define libc_feresetround_noexf_ctx libc_fesetenvf_ctx -# endif -# ifndef libc_feresetround_noexl_ctx -# define libc_feresetround_noexl_ctx libc_fesetenvl_ctx -# endif - -#else /* Default implementation using standard fenv functions. Avoid unnecessary rounding mode changes by first checking the @@ -462,7 +435,7 @@ default_libc_feupdateenv_test (fenv_t *e, int ex) important for performance. */ static __always_inline void -libc_feholdsetround_ctx (struct rm_ctx *ctx, int round) +default_libc_feholdsetround_ctx (struct rm_ctx *ctx, int round) { ctx->updated_status = false; @@ -476,7 +449,7 @@ libc_feholdsetround_ctx (struct rm_ctx *ctx, int round) } static __always_inline void -libc_feresetround_ctx (struct rm_ctx *ctx) +default_libc_feresetround_ctx (struct rm_ctx *ctx) { /* Restore the rounding mode if updated. */ if (__glibc_unlikely (ctx->updated_status)) @@ -484,7 +457,7 @@ libc_feresetround_ctx (struct rm_ctx *ctx) } static __always_inline void -libc_feholdsetround_noex_ctx (struct rm_ctx *ctx, int round) +default_libc_feholdsetround_noex_ctx (struct rm_ctx *ctx, int round) { /* Save exception flags and rounding mode, and disable exception traps. */ @@ -496,12 +469,45 @@ libc_feholdsetround_noex_ctx (struct rm_ctx *ctx, int round) } static __always_inline void -libc_feresetround_noex_ctx (struct rm_ctx *ctx) +default_libc_feresetround_noex_ctx (struct rm_ctx *ctx) { /* Restore exception flags and rounding mode. */ __fesetenv (&ctx->env); } +#if HAVE_RM_CTX +/* Set/Restore Rounding Modes only when necessary. If defined, these functions + set/restore floating point state only if the state needed within the lexical + block is different from the current state. This saves a lot of time when + the floating point unit is much slower than the fixed point units. */ + +# ifndef libc_feholdsetround_noex_ctx +# define libc_feholdsetround_noex_ctx libc_feholdsetround_ctx +# endif +# ifndef libc_feholdsetround_noexf_ctx +# define libc_feholdsetround_noexf_ctx libc_feholdsetroundf_ctx +# endif +# ifndef libc_feholdsetround_noexl_ctx +# define libc_feholdsetround_noexl_ctx libc_feholdsetroundl_ctx +# endif + +# ifndef libc_feresetround_noex_ctx +# define libc_feresetround_noex_ctx libc_fesetenv_ctx +# endif +# ifndef libc_feresetround_noexf_ctx +# define libc_feresetround_noexf_ctx libc_fesetenvf_ctx +# endif +# ifndef libc_feresetround_noexl_ctx +# define libc_feresetround_noexl_ctx libc_fesetenvl_ctx +# endif + +#else + +# define libc_feholdsetround_ctx default_libc_feholdsetround_ctx +# define libc_feresetround_ctx default_libc_feresetround_ctx +# define libc_feholdsetround_noex_ctx default_libc_feholdsetround_noex_ctx +# define libc_feresetround_noex_ctx default_libc_feresetround_noex_ctx + # define libc_feholdsetroundf_ctx libc_feholdsetround_ctx # define libc_feholdsetroundl_ctx libc_feholdsetround_ctx # define libc_feresetroundf_ctx libc_feresetround_ctx |