diff options
Diffstat (limited to 'winsup/mingw/mingwex/round.c')
-rw-r--r-- | winsup/mingw/mingwex/round.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/round.c b/winsup/mingw/mingwex/round.c new file mode 100644 index 000000000..9d8e949e4 --- /dev/null +++ b/winsup/mingw/mingwex/round.c @@ -0,0 +1,29 @@ +#include <fenv.h> + +double +round (double x) { + double retval; + unsigned short saved_cw, _cw; + __asm__ ( + "fnstcw %0;" + : "=m" (saved_cw) + ); /* save control word */ + _cw = ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO) + | (x > 0.0 ? FE_UPWARD : FE_DOWNWARD); /* round away from zero */ + __asm__ ( + "fldcw %0;" + : + : "m" (_cw) + ); /* load the rounding control */ + __asm__ ( + "frndint;" + : "=t" (retval) + : "0" (x) + ); /* do the rounding */ + __asm__ ( + "fldcw %0;" + : + : "m" (saved_cw) + ); /* restore control word */ + return retval; +} |