summaryrefslogtreecommitdiffstats
path: root/lib/msun/i387/fenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/msun/i387/fenv.c')
-rw-r--r--lib/msun/i387/fenv.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/msun/i387/fenv.c b/lib/msun/i387/fenv.c
index 5c996b3..6f51ba2 100644
--- a/lib/msun/i387/fenv.c
+++ b/lib/msun/i387/fenv.c
@@ -29,8 +29,14 @@
#include <sys/cdefs.h>
#include <sys/types.h>
#include <machine/npx.h>
+
+#define __fenv_static
#include "fenv.h"
+#ifdef __GNUC_GNU_INLINE__
+#error "This file must be compiled with C99 'inline' semantics"
+#endif
+
const fenv_t __fe_dfl_env = {
__INITIAL_NPXCW__,
0x0000,
@@ -83,6 +89,9 @@ __test_sse(void)
return (0);
}
+extern inline int feclearexcept(int __excepts);
+extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts);
+
int
fesetexceptflag(const fexcept_t *flagp, int excepts)
{
@@ -114,6 +123,10 @@ feraiseexcept(int excepts)
return (0);
}
+extern inline int fetestexcept(int __excepts);
+extern inline int fegetround(void);
+extern inline int fesetround(int __round);
+
int
fegetenv(fenv_t *envp)
{
@@ -149,6 +162,8 @@ feholdexcept(fenv_t *envp)
return (0);
}
+extern inline int fesetenv(const fenv_t *__envp);
+
int
feupdateenv(const fenv_t *envp)
{
@@ -177,14 +192,14 @@ __feenableexcept(int mask)
__stmxcsr(&mxcsr);
else
mxcsr = 0;
- omask = (control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+ omask = ~(control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
control &= ~mask;
__fldcw(control);
if (__HAS_SSE()) {
mxcsr &= ~(mask << _SSE_EMASK_SHIFT);
__ldmxcsr(mxcsr);
}
- return (~omask);
+ return (omask);
}
int
@@ -199,14 +214,14 @@ __fedisableexcept(int mask)
__stmxcsr(&mxcsr);
else
mxcsr = 0;
- omask = (control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
+ omask = ~(control | mxcsr >> _SSE_EMASK_SHIFT) & FE_ALL_EXCEPT;
control |= mask;
__fldcw(control);
if (__HAS_SSE()) {
mxcsr |= mask << _SSE_EMASK_SHIFT;
__ldmxcsr(mxcsr);
}
- return (~omask);
+ return (omask);
}
__weak_reference(__feenableexcept, feenableexcept);
OpenPOWER on IntegriCloud