aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc/fpu/feenablxcpt.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/fpu/feenablxcpt.c')
-rw-r--r--sysdeps/powerpc/fpu/feenablxcpt.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sysdeps/powerpc/fpu/feenablxcpt.c b/sysdeps/powerpc/fpu/feenablxcpt.c
index 8ad0f97ac7..01a68cf086 100644
--- a/sysdeps/powerpc/fpu/feenablxcpt.c
+++ b/sysdeps/powerpc/fpu/feenablxcpt.c
@@ -22,15 +22,17 @@
int
feenableexcept (int excepts)
{
- fenv_union_t fe;
- int result, new;
+ fenv_union_t fe, curr;
+ int result = 0, new;
- result = __fegetexcept ();
+ /* Get current exception mask to return. */
+ fe.fenv = curr.fenv = fegetenv_register ();
+ result = fenv_reg_to_exceptions (fe.l);
if ((excepts & FE_ALL_INVALID) == FE_ALL_INVALID)
excepts = (excepts | FE_INVALID) & ~ FE_ALL_INVALID;
- fe.fenv = fegetenv_register ();
+ /* Sets the new exception mask. */
if (excepts & FE_INEXACT)
fe.l |= (1 << (31 - FPSCR_XE));
if (excepts & FE_DIVBYZERO)
@@ -41,7 +43,9 @@ feenableexcept (int excepts)
fe.l |= (1 << (31 - FPSCR_OE));
if (excepts & FE_INVALID)
fe.l |= (1 << (31 - FPSCR_VE));
- fesetenv_register (fe.fenv);
+
+ if (fe.l != curr.l)
+ fesetenv_register (fe.fenv);
new = __fegetexcept ();
if (new != 0 && result == 0)