From: Earnie B. <ea...@us...> - 2004-04-22 16:21:28
|
Update of /cvsroot/mingw/runtime/mingwex/math In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26541/mingwex/math Modified Files: llround.c llroundf.c llroundl.c lround.c lroundf.c lroundl.c Log Message: Merge winsup changes Index: llround.c =================================================================== RCS file: /cvsroot/mingw/runtime/mingwex/math/llround.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** llround.c 5 Feb 2003 23:04:53 -0000 1.2 --- llround.c 22 Apr 2004 16:21:13 -0000 1.3 *************** *** 1,24 **** - #include <fenv.h> #include <math.h> 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; } - --- 1,19 ---- #include <math.h> + #include <limits.h> + #include <errno.h> long long ! 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; } Index: lroundf.c =================================================================== RCS file: /cvsroot/mingw/runtime/mingwex/math/lroundf.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** lroundf.c 12 Aug 2002 13:06:37 -0000 1.1 --- lroundf.c 22 Apr 2004 16:21:13 -0000 1.2 *************** *** 1,23 **** - #include <fenv.h> #include <math.h> 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; ! } --- 1,19 ---- #include <math.h> + #include <limits.h> + #include <errno.h> long ! 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; ! } Index: lround.c =================================================================== RCS file: /cvsroot/mingw/runtime/mingwex/math/lround.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** lround.c 12 Aug 2002 13:06:37 -0000 1.1 --- lround.c 22 Apr 2004 16:21:13 -0000 1.2 *************** *** 1,24 **** - #include <fenv.h> #include <math.h> 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; } - --- 1,19 ---- #include <math.h> + #include <limits.h> + #include <errno.h> long ! 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; } Index: llroundl.c =================================================================== RCS file: /cvsroot/mingw/runtime/mingwex/math/llroundl.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** llroundl.c 12 Aug 2002 13:06:37 -0000 1.1 --- llroundl.c 22 Apr 2004 16:21:13 -0000 1.2 *************** *** 1,22 **** - #include <fenv.h> #include <math.h> 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; } --- 1,19 ---- #include <math.h> + #include <limits.h> + #include <errno.h> long long ! 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; } Index: lroundl.c =================================================================== RCS file: /cvsroot/mingw/runtime/mingwex/math/lroundl.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** lroundl.c 12 Aug 2002 13:06:37 -0000 1.1 --- lroundl.c 22 Apr 2004 16:21:13 -0000 1.2 *************** *** 1,22 **** - #include <fenv.h> #include <math.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; } --- 1,19 ---- #include <math.h> + #include <limits.h> + #include <errno.h> long ! 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; } Index: llroundf.c =================================================================== RCS file: /cvsroot/mingw/runtime/mingwex/math/llroundf.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** llroundf.c 12 Aug 2002 13:06:37 -0000 1.1 --- llroundf.c 22 Apr 2004 16:21:13 -0000 1.2 *************** *** 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; ! } --- 1,19 ---- #include <math.h> + #include <limits.h> + #include <errno.h> long long ! 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; ! } |