diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-10-18 09:59:04 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-10-18 09:59:04 -0400 |
commit | 4855e3ddf5061dd8ddcefafc7185f6f70937434b (patch) | |
tree | 7e29eb6e22a1dda9a7133e577787ac9f9b6c17e7 | |
parent | 23ce5627803ad1e6686355965cd68bb23d05fb28 (diff) | |
download | glibc-4855e3ddf5061dd8ddcefafc7185f6f70937434b.tar glibc-4855e3ddf5061dd8ddcefafc7185f6f70937434b.tar.gz glibc-4855e3ddf5061dd8ddcefafc7185f6f70937434b.tar.bz2 glibc-4855e3ddf5061dd8ddcefafc7185f6f70937434b.zip |
Provide combined internal feholdexcept/fesetround interface
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | math/math_private.h | 7 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_exp2.c | 6 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/math_private.h | 14 |
4 files changed, 27 insertions, 6 deletions
@@ -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 diff --git a/math/math_private.h b/math/math_private.h index a1ce0142b1..38ff09e7e0 100644 --- a/math/math_private.h +++ b/math/math_private.h @@ -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) diff --git a/sysdeps/ieee754/dbl-64/e_exp2.c b/sysdeps/ieee754/dbl-64/e_exp2.c index 734e476ce5..0b7330aace 100644 --- a/sysdeps/ieee754/dbl-64/e_exp2.c +++ b/sysdeps/ieee754/dbl-64/e_exp2.c @@ -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 diff --git a/sysdeps/x86_64/fpu/math_private.h b/sysdeps/x86_64/fpu/math_private.h index 4886c64dc3..28bd9cee2d 100644 --- a/sysdeps/x86_64/fpu/math_private.h +++ b/sysdeps/x86_64/fpu/math_private.h @@ -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)) |