diff options
Diffstat (limited to 'sysdeps/hppa/fpu/fsetexcptflg.c')
-rw-r--r-- | sysdeps/hppa/fpu/fsetexcptflg.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/sysdeps/hppa/fpu/fsetexcptflg.c b/sysdeps/hppa/fpu/fsetexcptflg.c index 2c34a1e287..c31de8bbe4 100644 --- a/sysdeps/hppa/fpu/fsetexcptflg.c +++ b/sysdeps/hppa/fpu/fsetexcptflg.c @@ -18,19 +18,25 @@ <http://www.gnu.org/licenses/>. */ #include <fenv.h> -#include <math.h> +#include <fpu_control.h> int fesetexceptflag (const fexcept_t *flagp, int excepts) { - union { unsigned long long l; unsigned int sw[2]; } s; + fpu_control_t fpsr; + fpu_control_t fpsr_new; /* Get the current status word. */ - __asm__ ("fstd %%fr0,0(%1)" : "=m" (s.l) : "r" (&s.l) : "%r0"); - /* Install new raised trap bits */ - s.sw[0] |= (*flagp & excepts & FE_ALL_EXCEPT) << 27; + _FPU_GETCW (fpsr); + excepts &= FE_ALL_EXCEPT; + + /* Install new raised flags. */ + fpsr_new = fpsr & ~(excepts << _FPU_HPPA_SHIFT_FLAGS); + fpsr_new |= (*flagp & excepts) << _FPU_HPPA_SHIFT_FLAGS; + /* Store the new status word. */ - __asm__ ("fldd 0(%0),%%fr0" : : "r" (&s.l), "m" (s.l) : "%r0"); + if (fpsr != fpsr_new) + _FPU_SETCW (fpsr_new); /* Success. */ return 0; |