diff options
author | Danny Smith <dannysmith@users.sourceforge.net> | 2002-07-29 07:00:10 +0400 |
---|---|---|
committer | Danny Smith <dannysmith@users.sourceforge.net> | 2002-07-29 07:00:10 +0400 |
commit | b8cdc234c67d883b7e9d6e4caf4ba15972ac7788 (patch) | |
tree | e45d96d2d976020ad018e6e919bbeae2500e884a /winsup/mingw/mingwex/math/llroundf.c | |
parent | 840e611264ac6ad7d41bc0b275945f50067cda50 (diff) |
Add incomplet long double math support to libmingwex.a
Diffstat (limited to 'winsup/mingw/mingwex/math/llroundf.c')
-rw-r--r-- | winsup/mingw/mingwex/math/llroundf.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/winsup/mingw/mingwex/math/llroundf.c b/winsup/mingw/mingwex/math/llroundf.c new file mode 100644 index 000000000..b6c431f9d --- /dev/null +++ b/winsup/mingw/mingwex/math/llroundf.c @@ -0,0 +1,23 @@ +#include <fenv.h> +#include <math.h> + +long long +llroundf (float x) { + long long 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__ __volatile__ ( + "fistpll %0" : "=m" (retval) : "t" (x) : "st" + ); + __asm__ ( + "fldcw %0;" : : "m" (saved_cw) + ); /* restore control word */ + return retval; +} |