summaryrefslogtreecommitdiffstats
path: root/winsup/mingw/mingwex/fesetround.c
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/mingw/mingwex/fesetround.c')
-rw-r--r--winsup/mingw/mingwex/fesetround.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/fesetround.c b/winsup/mingw/mingwex/fesetround.c
index a8cef86a4..e90dbb4e7 100644
--- a/winsup/mingw/mingwex/fesetround.c
+++ b/winsup/mingw/mingwex/fesetround.c
@@ -1,4 +1,6 @@
#include <fenv.h>
+#include "cpu_features.h"
+
/* 7.6.3.2
The fesetround function establishes the rounding direction
represented by its argument round. If the argument is not equal
@@ -15,5 +17,14 @@ int fesetround (int mode)
_cw &= ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO);
_cw |= mode;
__asm__ volatile ("fldcw %0;" : : "m" (_cw));
+
+ if (__HAS_SSE)
+ {
+ __asm__ volatile ("stmxcsr %0" : "=m" (_cw));
+ _cw &= ~ 0x6000;
+ _cw |= (mode << __MXCSR_ROUND_FLAG_SHIFT);
+ __asm__ volatile ("ldmxcsr %0" : : "m" (_cw));
+ }
+
return 0;
}