From 7d2e8012cfb4fa30086ef330ef1b993cfcc3dd99 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 18 Mar 2012 10:12:16 -0700 Subject: i386: Convert libc_{feholdexcept_setround,updateenv}_53bit to functions. Also fix a bug in libc_feupdateenv_53bit: don't force the rounding precision back to _FPU_EXTENDED, instead restore the precision that the user had in effect beforehand. --- sysdeps/i386/fpu/math_private.h | 58 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) (limited to 'sysdeps/i386/fpu/math_private.h') diff --git a/sysdeps/i386/fpu/math_private.h b/sysdeps/i386/fpu/math_private.h index 65202269b0..9236448978 100644 --- a/sysdeps/i386/fpu/math_private.h +++ b/sysdeps/i386/fpu/math_private.h @@ -1,5 +1,8 @@ #ifndef _MATH_PRIVATE_H +#include +#include + #define math_opt_barrier(x) \ ({ __typeof (x) __x; \ __asm ("" : "=t" (__x) : "0" (x)); \ @@ -15,34 +18,31 @@ do \ } \ while (0) -#include_next +static __always_inline void +libc_feholdexcept_setround_53bit (fenv_t *e, int r) +{ + feholdexcept (e); + fesetround (r); -#include + fpu_control_t cw; + _FPU_GETCW (cw); + cw &= ~(fpu_control_t) _FPU_EXTENDED; + cw |= _FPU_DOUBLE; + _FPU_SETCW (cw); +} +#define libc_feholdexcept_setround_53bit libc_feholdexcept_setround_53bit + +static __always_inline void +libc_feupdateenv_53bit (fenv_t *e) +{ + feupdateenv (e); + + /* Unfortunately, feupdateenv fails to affect the rounding precision. + We can get that back by restoring the exact control word we saved. */ + _FPU_SETCW (e->__control_word); +} +#define libc_feupdateenv_53bit libc_feupdateenv_53bit + +#include_next -#undef libc_feholdexcept_setround_53bit -#define libc_feholdexcept_setround_53bit(e, r) \ - do \ - { \ - fpu_control_t cw; \ - libc_feholdexcept_setround (e, r); \ - _FPU_GETCW (cw); \ - cw &= ~(fpu_control_t) _FPU_EXTENDED; \ - cw |= _FPU_DOUBLE; \ - _FPU_SETCW (cw); \ - } \ - while (0) - -#undef libc_feupdateenv_53bit -#define libc_feupdateenv_53bit(e) \ - do \ - { \ - fpu_control_t cw; \ - libc_feupdateenv (e); \ - _FPU_GETCW (cw); \ - cw &= ~(fpu_control_t) _FPU_EXTENDED; \ - cw |= _FPU_EXTENDED; \ - _FPU_SETCW (cw); \ - } \ - while (0) - -#endif +#endif /* _MATH_PRIVATE_H */ -- cgit 1.4.1