mirror of git://sourceware.org/git/glibc.git
Provide combined internal feholdexcept/fesetround interface
This commit is contained in:
parent
23ce562780
commit
4855e3ddf5
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue