Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/mingw/mingwex/math/modfl.c')
-rw-r--r--winsup/mingw/mingwex/math/modfl.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/math/modfl.c b/winsup/mingw/mingwex/math/modfl.c
new file mode 100644
index 000000000..5663956f0
--- /dev/null
+++ b/winsup/mingw/mingwex/math/modfl.c
@@ -0,0 +1,21 @@
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+#define FE_ROUNDING_MASK \
+ (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
+
+long double
+modfl (long double value, long double* iptr)
+{
+ long double int_part;
+ unsigned short saved_cw;
+ /* truncate */
+ asm ("fnstcw %0;" : "=m" (saved_cw)); /* save control word */
+ asm ("fldcw %0;" : : "m" ((saved_cw & ~FE_ROUNDING_MASK)
+ | FE_TOWARDZERO));
+ asm ("frndint;" : "=t" (int_part) : "0" (value)); /* round */
+ asm ("fldcw %0;" : : "m" (saved_cw)); /* restore saved cw */
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? 0.0L : value - int_part);
+}