diff options
author | Danny Smith <dannysmith@users.sourceforge.net> | 2004-04-22 04:38:24 +0000 |
---|---|---|
committer | Danny Smith <dannysmith@users.sourceforge.net> | 2004-04-22 04:38:24 +0000 |
commit | 1a4b7623f43060162b933ac39a4c841ba0f008d0 (patch) | |
tree | 6ad3d8fac2b0b478f8799368728b2ef468a55002 /winsup/mingw/mingwex/math/lroundl.c | |
parent | b7ede86cfec578cd698cfdbb367845f7e8ed7a25 (diff) | |
download | cygnal-1a4b7623f43060162b933ac39a4c841ba0f008d0.tar.gz cygnal-1a4b7623f43060162b933ac39a4c841ba0f008d0.tar.bz2 cygnal-1a4b7623f43060162b933ac39a4c841ba0f008d0.zip |
* mingwex/math/lround.c: Rewrite.
* mingwex/math/lroundf.c: Rewrite.
* mingwex/math/lroundl.c: Rewrite.
* mingwex/math/llround.c: Rewrite.
* mingwex/math/llroundf.c: Rewrite.
* mingwex/math/llroundl.c: Rewrite.
Diffstat (limited to 'winsup/mingw/mingwex/math/lroundl.c')
-rw-r--r-- | winsup/mingw/mingwex/math/lroundl.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/winsup/mingw/mingwex/math/lroundl.c b/winsup/mingw/mingwex/math/lroundl.c index 6e69c2fdd..7a6348124 100644 --- a/winsup/mingw/mingwex/math/lroundl.c +++ b/winsup/mingw/mingwex/math/lroundl.c @@ -1,22 +1,19 @@ -#include <fenv.h> #include <math.h> +#include <limits.h> +#include <errno.h> long -lroundl (long double x) { - 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__ ( - "fistpl %0" : "=m" (retval) : "t" (x) : "st"); - __asm__ ( - "fldcw %0;" : : "m" (saved_cw) - ); /* restore control word */ - return retval; +lroundl (long double x) +{ + /* Add +/- 0.5, then round towards zero. */ + long double tmp = truncl (x + (x >= 0.0L ? 0.5L : -0.5L)); + if (!isfinite (tmp) + || tmp > (long double)LONG_MAX + || tmp < (long double)LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return tmp > 0.0L ? LONG_MAX : LONG_MIN; */ + } + return (long)tmp; } |