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
#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)
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
#undef libc_feholdexcept
#define libc_feholdexcept(e) \
- do { \
+ do { \
unsigned int mxcsr; \
asm ("stmxcsr %0" : "=m" (*&mxcsr)); \
(e)->__mxcsr = mxcsr; \
// #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))