diff --git a/ChangeLog b/ChangeLog index 66782ab866..f6b7c2bbed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-03-19 David S. Miller + + * sysdeps/sparc/fpu/fenv_private.h: New file. + * sysdeps/sparc/fpu/math_private.h: Use it. + (libc_feholdexcept, libc_feholdexceptf, libc_feholdexceptl): + Remove. + (libc_feholdexcept_setround, libc_feholdexcept_setroundf, + (libc_feholdexcept_setroundl): Remove. + (libc_fetestexcept, libc_fetestexceptf, libc_fetestexceptl): + Remove. + (libc_fesetenv, libc_fesetenvf, libc_fesetenvl): Remove. + (libc_feupdateenv, libc_feupdateenvf, libc_feupdateenvf): Remove. + 2012-03-19 H.J. Lu * sysdeps/x86_64/jmpbuf-unwind.h (_JMPBUF_CFA_UNWINDS_ADJ): Cast diff --git a/sysdeps/sparc/fpu/fenv_private.h b/sysdeps/sparc/fpu/fenv_private.h new file mode 100644 index 0000000000..a6e8e95a55 --- /dev/null +++ b/sysdeps/sparc/fpu/fenv_private.h @@ -0,0 +1,106 @@ +#ifndef FENV_PRIVATE_H +#define FENV_PRIVATE_H 1 + +#include + +static __always_inline void +libc_feholdexcept (fenv_t *e) +{ + fenv_t etmp; + __fenv_stfsr(etmp); + *(e) = etmp; + etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT); + __fenv_ldfsr(etmp); +} + +static __always_inline void +libc_feholdexcept_setround (fenv_t *e, int r) +{ + fenv_t etmp; + __fenv_stfsr(etmp); + *(e) = etmp; + etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT); + etmp = (etmp & ~__FE_ROUND_MASK) | (r); + __fenv_ldfsr(etmp); +} + +static __always_inline int +libc_fetestexcept (int e) +{ + fenv_t etmp; + __fenv_stfsr(etmp); + return etmp & (e) & FE_ALL_EXCEPT; +} + +static __always_inline void +libc_fesetenv (fenv_t *e) +{ + __fenv_ldfsr(*e); +} + +static __always_inline int +libc_feupdateenv_test (fenv_t *e, int ex) +{ + fenv_t etmp; + + __fenv_stfsr(etmp); + etmp &= FE_ALL_EXCEPT; + + __fenv_ldfsr(*e); + + __feraiseexcept (etmp); + + return etmp & ex; +} + +static __always_inline void +libc_feupdateenv (fenv_t *e) +{ + libc_feupdateenv_test (e, 0); +} + +static __always_inline void +libc_feholdsetround (fenv_t *e, int r) +{ + fenv_t etmp; + __fenv_stfsr(etmp); + *(e) = etmp; + etmp = (etmp & ~__FE_ROUND_MASK) | (r); + __fenv_ldfsr(etmp); +} + +static __always_inline void +libc_feresetround (fenv_t *e) +{ + fenv_t etmp; + __fenv_stfsr(etmp); + etmp = (etmp & ~__FE_ROUND_MASK) | (*e & __FE_ROUND_MASK); + __fenv_ldfsr(etmp); +} + +#define libc_feholdexceptf libc_feholdexcept +#define libc_feholdexcept_setroundf libc_feholdexcept_setround +#define libc_fetestexceptf libc_fetestexcept +#define libc_fesetenvf libc_fesetenv +#define libc_feupdateenv_testf libc_feupdateenv_test +#define libc_feupdateenvf libc_feupdateenv +#define libc_feholdsetroundf libc_feholdsetround +#define libc_feresetroundf libc_feresetround +#define libc_feholdexcept libc_feholdexcept +#define libc_feholdexcept_setround libc_feholdexcept_setround +#define libc_fetestexcept libc_fetestexcept +#define libc_fesetenv libc_fesetenv +#define libc_feupdateenv_test libc_feupdateenv_test +#define libc_feupdateenv libc_feupdateenv +#define libc_feholdsetround libc_feholdsetround +#define libc_feresetround libc_feresetround +#define libc_feholdexceptl libc_feholdexcept +#define libc_feholdexcept_setroundl libc_feholdexcept_setround +#define libc_fetestexceptl libc_fetestexcept +#define libc_fesetenvl libc_fesetenv +#define libc_feupdateenv_testl libc_feupdateenv_test +#define libc_feupdateenvl libc_feupdateenv +#define libc_feholdsetroundl libc_feholdsetround +#define libc_feresetroundl libc_feresetround + +#endif /* FENV_PRIVATE_H */ diff --git a/sysdeps/sparc/fpu/math_private.h b/sysdeps/sparc/fpu/math_private.h index 05ef623644..27946cec7b 100644 --- a/sysdeps/sparc/fpu/math_private.h +++ b/sysdeps/sparc/fpu/math_private.h @@ -1,68 +1,7 @@ #ifndef SPARC_MATH_PRIVATE_H #define SPARC_MATH_PRIVATE_H 1 +#include "fenv_private.h" #include_next -#include - -#undef libc_feholdexcept -#define libc_feholdexcept(e) \ - do { \ - fenv_t etmp; \ - __fenv_stfsr(etmp); \ - *(e) = etmp; \ - etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT); \ - __fenv_ldfsr(etmp); \ - } while (0) -#undef libc_feholdexceptf -#define libc_feholdexceptf(e) libc_feholdexcept (e) -#undef libc_feholdexceptl -#define libc_feholdexceptl(e) libc_feholdexcept (e) - -#undef libc_feholdexcept_setround -#define libc_feholdexcept_setround(e, r) \ - do { \ - fenv_t etmp; \ - __fenv_stfsr(etmp); \ - *(e) = etmp; \ - etmp = etmp & ~((0x1f << 23) | FE_ALL_EXCEPT); \ - etmp = (etmp & ~__FE_ROUND_MASK) | (r); \ - __fenv_ldfsr(etmp); \ - } while (0) -#undef libc_feholdexcept_setroundf -#define libc_feholdexcept_setroundf(e, r) libc_feholdexcept_setround (e, r) -#undef libc_feholdexcept_setroundl -#define libc_feholdexcept_setroundl(e, r) libc_feholdexcept_setround (e, r) - -#undef libc_fetestexcept -#define libc_fetestexcept(e) \ - ({ \ - fenv_t etmp; \ - __fenv_stfsr(etmp); \ - etmp & (e) & FE_ALL_EXCEPT; }) -#undef libc_fetestexceptf -#define libc_fetestexceptf(e) libc_fetestexcept (e) -#undef libc_fetestexceptl -#define libc_fetestexceptl(e) libc_fetestexcept (e) - -#undef libc_fesetenv -#define libc_fesetenv(e) \ - __fenv_ldfsr(*e) -#undef libc_fesetenvf -#define libc_fesetenvf(e) libc_fesetenv (e) -#undef libc_fesetenvl -#define libc_fesetenvl(e) libc_fesetenv (e) - -#undef libc_feupdateenv -#define libc_feupdateenv(e) \ - do { \ - fenv_t etmp; \ - __fenv_stfsr(etmp); \ - __fenv_ldfsr(*e); \ - __feraiseexcept (etmp & FE_ALL_EXCEPT); \ - } while (0) -#undef libc_feupdateenvf -#define libc_feupdateenvf(e) libc_feupdateenv (e) -#undef libc_feupdateenvl -#define libc_feupdateenvl(e) libc_feupdateenv (e) #endif /* SPARC_MATH_PRIVATE_H */