| /** |
| * This file has no copyright assigned and is placed in the Public Domain. |
| * This file is part of the w64 mingw-runtime package. |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| */ |
| #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 = 0.0L; |
| unsigned short saved_cw; |
| unsigned short tmp_cw; |
| /* truncate */ |
| asm ("fnstcw %0;" : "=m" (saved_cw)); /* save control word */ |
| tmp_cw = (saved_cw & ~FE_ROUNDING_MASK) | FE_TOWARDZERO; |
| asm ("fldcw %0;" : : "m" (tmp_cw)); |
| 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); |
| } |