Provide combined internal feholdexcept/fesetround interface

This commit is contained in:
Ulrich Drepper 2011-10-18 09:59:04 -04:00
parent 23ce562780
commit 4855e3ddf5
4 changed files with 27 additions and 6 deletions

View File

@ -1,5 +1,11 @@
2011-10-18 Ulrich Drepper <drepper@gmail.com>
* math/math_private.h: Define defaults for libc_feholdexcept_setround,
libc_feholdexcept_setroundf, libc_feholdexcept_setroundl.
* sysdeps/ieee754/dbl-64/e_exp2.c: Use libc_feholdexcept_setround.
* sysdeps/x86_64/fpu/math_private.h: Define special version of
libc_feholdexcept_setround.
* sysdeps/x86_64/fpu/multiarch/Makefile [math] (libm-sysdep-routines):
Add s_nearbyint-c and s_nearbyintf-c.
* sysdeps/x86_64/fpu/bits/mathinline.h: Define nearbyint and

View File

@ -376,6 +376,13 @@ extern void __docos (double __x, double __dx, double __v[]);
#define libc_feholdexceptf(e) (void) feholdexcept (e)
#define libc_feholdexceptl(e) (void) feholdexcept (e)
#define libc_feholdexcept_setround(e, r) \
do { feholdexcept (e); fesetround (r); } while (0)
#define libc_feholdexcept_setroundf(e, r) \
do { feholdexcept (e); fesetround (r); } while (0)
#define libc_feholdexcept_setroundl(e, r) \
do { feholdexcept (e); fesetround (r); } while (0)
#define libc_fesetenv(e) (void) fesetenv (e)
#define libc_fesetenvf(e) (void) fesetenv (e)
#define libc_fesetenvl(e) (void) fesetenv (e)

View File

@ -64,11 +64,7 @@ __ieee754_exp2 (double x)
union ieee754_double ex2_u, scale_u;
fenv_t oldenv;
libc_feholdexcept (&oldenv);
#ifdef FE_TONEAREST
/* If we don't have this, it's too bad. */
libc_fesetround (FE_TONEAREST);
#endif
libc_feholdexcept_setround (&oldenv, FE_TONEAREST);
/* 1. Argument reduction.
Choose integers ex, -256 <= t < 256, and some real

View File

@ -145,7 +145,7 @@ do { \
#undef libc_feholdexcept
#define libc_feholdexcept(e) \
do { \
do { \
unsigned int mxcsr; \
asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
(e)->__mxcsr = mxcsr; \
@ -155,6 +155,18 @@ do { \
// #define libc_feholdexceptf(e) (void) feholdexcept (e)
// #define libc_feholdexceptl(e) (void) feholdexcept (e)
#undef libc_feholdexcept_setround
#define libc_feholdexcept_setround(e, r) \
do { \
unsigned int mxcsr; \
asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
(e)->__mxcsr = mxcsr; \
mxcsr = ((mxcsr | 0x1f80) & ~0x603f) | ((r) << 3); \
asm volatile ("ldmxcsr %0" : : "m" (*&mxcsr)); \
} while (0)
// #define libc_feholdexcept_setroundf(e, r) ...
// #define libc_feholdexcept_setroundl(e, r) ...
#undef libc_fesetenv
#define libc_fesetenv(e) \
asm volatile ("ldmxcsr %0" : : "m" ((e)->__mxcsr))