From 1a4b7623f43060162b933ac39a4c841ba0f008d0 Mon Sep 17 00:00:00 2001 From: Danny Smith Date: Thu, 22 Apr 2004 04:38:24 +0000 Subject: [PATCH] * 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. --- winsup/mingw/ChangeLog | 9 +++++++ winsup/mingw/mingwex/math/llround.c | 35 ++++++++++++--------------- winsup/mingw/mingwex/math/llroundf.c | 36 +++++++++++++--------------- winsup/mingw/mingwex/math/llroundl.c | 33 ++++++++++++------------- winsup/mingw/mingwex/math/lround.c | 35 ++++++++++++--------------- winsup/mingw/mingwex/math/lroundf.c | 36 +++++++++++++--------------- winsup/mingw/mingwex/math/lroundl.c | 33 ++++++++++++------------- 7 files changed, 101 insertions(+), 116 deletions(-) diff --git a/winsup/mingw/ChangeLog b/winsup/mingw/ChangeLog index 26c4739ff..07dc38759 100644 --- a/winsup/mingw/ChangeLog +++ b/winsup/mingw/ChangeLog @@ -1,3 +1,12 @@ +2004-04-22 Danny Smith + + * 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. + 2004-04-20 Earnie Boyd * CONTRIBUTORS: New file. diff --git a/winsup/mingw/mingwex/math/llround.c b/winsup/mingw/mingwex/math/llround.c index f8fafc48d..45b754c75 100644 --- a/winsup/mingw/mingwex/math/llround.c +++ b/winsup/mingw/mingwex/math/llround.c @@ -1,24 +1,19 @@ -#include #include +#include +#include long long -llround (double 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; +llround (double x) +{ + /* Add +/- 0.5, then round towards zero. */ + double tmp = trunc (x + (x >= 0.0 ? 0.5 : -0.5)); + if (!isfinite (tmp) + || tmp > (double)LONG_LONG_MAX + || tmp < (double)LONG_LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return tmp > 0.0 ? LONG_LONG_MAX : LONG_LONG_MIN; */ + } + return (long long)tmp; } - diff --git a/winsup/mingw/mingwex/math/llroundf.c b/winsup/mingw/mingwex/math/llroundf.c index b6c431f9d..6a6e9b51e 100644 --- a/winsup/mingw/mingwex/math/llroundf.c +++ b/winsup/mingw/mingwex/math/llroundf.c @@ -1,23 +1,19 @@ -#include #include +#include +#include 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; -} +llroundf (float x) +{ + /* Add +/- 0.5, then round towards zero. */ + float tmp = truncf (x + (x >= 0.0F ? 0.5F : -0.5F)); + if (!isfinite (tmp) + || tmp > (float)LONG_LONG_MAX + || tmp < (float)LONG_LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return tmp > 0.0F ? LONG_LONG_MAX : LONG_LONG_MIN; */ + } + return (long long)tmp; +} diff --git a/winsup/mingw/mingwex/math/llroundl.c b/winsup/mingw/mingwex/math/llroundl.c index ad334fb2c..9d2217411 100644 --- a/winsup/mingw/mingwex/math/llroundl.c +++ b/winsup/mingw/mingwex/math/llroundl.c @@ -1,22 +1,19 @@ -#include #include +#include +#include long long -llroundl (long double 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; +llroundl (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_LONG_MAX + || tmp < (long double)LONG_LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return tmp > 0.0L ? LONG_LONG_MAX : LONG_LONG_MIN; */ + } + return (long long)tmp; } diff --git a/winsup/mingw/mingwex/math/lround.c b/winsup/mingw/mingwex/math/lround.c index 4b0b0d047..7ee50df90 100644 --- a/winsup/mingw/mingwex/math/lround.c +++ b/winsup/mingw/mingwex/math/lround.c @@ -1,24 +1,19 @@ -#include #include +#include +#include long -lround (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; +lround (double x) +{ + /* Add +/- 0.5 then then round towards zero. */ + double tmp = trunc (x + (x >= 0.0 ? 0.5 : -0.5)); + if (!isfinite (tmp) + || tmp > (double)LONG_MAX + || tmp < (double)LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return tmp > 0.0 ? LONG_MAX : LONG_MIN; */ + } + return (long)tmp; } - diff --git a/winsup/mingw/mingwex/math/lroundf.c b/winsup/mingw/mingwex/math/lroundf.c index 40051bfcb..82df69842 100644 --- a/winsup/mingw/mingwex/math/lroundf.c +++ b/winsup/mingw/mingwex/math/lroundf.c @@ -1,23 +1,19 @@ -#include #include +#include +#include long -lroundf (float 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; -} +lroundf (float x) +{ + /* Add +/- 0.5, then round towards zero. */ + float tmp = truncf (x + (x >= 0.0F ? 0.5F : -0.5F)); + if (!isfinite (tmp) + || tmp > (float)LONG_MAX + || tmp < (float)LONG_MIN) + { + errno = ERANGE; + /* Undefined behaviour, so we could return anything. */ + /* return tmp > 0.0F ? LONG_MAX : LONG_MIN; */ + } + return (long)tmp; +} 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 #include +#include +#include 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; } -- 2.43.5