Provide combined internal feholdexcept/fesetround interface
authorUlrich Drepper <drepper@gmail.com>
Tue, 18 Oct 2011 13:59:04 +0000 (09:59 -0400)
committerUlrich Drepper <drepper@gmail.com>
Tue, 18 Oct 2011 13:59:04 +0000 (09:59 -0400)
ChangeLog
math/math_private.h
sysdeps/ieee754/dbl-64/e_exp2.c
sysdeps/x86_64/fpu/math_private.h

index 3802f85..de8b2c3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index a1ce014..38ff09e 100644 (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)
index 734e476..0b7330a 100644 (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
index 4886c64..28bd9ce 100644 (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))