diff options
| author | sebres <sebres@users.sourceforge.net> | 2022-07-22 13:10:32 (GMT) | 
|---|---|---|
| committer | sebres <sebres@users.sourceforge.net> | 2022-07-22 13:10:32 (GMT) | 
| commit | b69f262ad8aca1cb0d2e9d3a3c906b0eea06bb6c (patch) | |
| tree | bab83eaaba33e082a5497c72d808c2ff17b8a4af | |
| parent | aefbc875acfc5e238b4d17ec233044a07cf23cca (diff) | |
| download | tcl-b69f262ad8aca1cb0d2e9d3a3c906b0eea06bb6c.zip tcl-b69f262ad8aca1cb0d2e9d3a3c906b0eea06bb6c.tar.gz tcl-b69f262ad8aca1cb0d2e9d3a3c906b0eea06bb6c.tar.bz2 | |
amend to [f3db59139e] (fix [713653b951]) - i386 only, resolve mixed declarations and code (forbiddeen in ISO C)
| -rw-r--r-- | generic/tclStrToD.c | 45 | 
1 files changed, 24 insertions, 21 deletions
| diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c index 375746d..557eaa1 100644 --- a/generic/tclStrToD.c +++ b/generic/tclStrToD.c @@ -51,44 +51,43 @@   * file exists only on Linux; it is missing on Cygwin and MinGW. Most gcc-isms   * and ix86-isms are factored out here.   */ - -#if defined(__GNUC__) +# if defined(__GNUC__)  typedef unsigned int	fpu_control_t __attribute__ ((__mode__ (__HI__))); -#define _FPU_GETCW(cw)	__asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw)) -#define _FPU_SETCW(cw)	__asm__ __volatile__ ("fldcw %0" : : "m" (*&cw)) -#   define FPU_IEEE_ROUNDING	0x027F -#   define ADJUST_FPU_CONTROL_WORD -#define TCL_IEEE_DOUBLE_ROUNDING \ +#  define _FPU_GETCW(cw)	__asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw)) +#  define _FPU_SETCW(cw)	__asm__ __volatile__ ("fldcw %0" : : "m" (*&cw)) +#  define FPU_IEEE_ROUNDING	0x027F +#  define ADJUST_FPU_CONTROL_WORD +#  define TCL_IEEE_DOUBLE_ROUNDING_DECL \      fpu_control_t roundTo53Bits = FPU_IEEE_ROUNDING;	\ -    fpu_control_t oldRoundingMode;			\ +    fpu_control_t oldRoundingMode; +#  define TCL_IEEE_DOUBLE_ROUNDING \      _FPU_GETCW(oldRoundingMode);			\      _FPU_SETCW(roundTo53Bits) -#define TCL_DEFAULT_DOUBLE_ROUNDING \ +#  define TCL_DEFAULT_DOUBLE_ROUNDING \      _FPU_SETCW(oldRoundingMode)  /*   * Sun ProC needs sunmath for rounding control on x86 like gcc above.   */ -#elif defined(__sun) -#include <sunmath.h> -#define TCL_IEEE_DOUBLE_ROUNDING \ +# elif defined(__sun) +#  include <sunmath.h> +#  define TCL_IEEE_DOUBLE_ROUNDING_DECL +#  define TCL_IEEE_DOUBLE_ROUNDING \      ieee_flags("set","precision","double",NULL) -#define TCL_DEFAULT_DOUBLE_ROUNDING \ +#  define TCL_DEFAULT_DOUBLE_ROUNDING \      ieee_flags("clear","precision",NULL,NULL) +# endif +#endif  /*   * Other platforms are assumed to always operate in full IEEE mode, so we make   * the macros to go in and out of that mode do nothing.   */ - -#else /* !__GNUC__ && !__sun */ -#define TCL_IEEE_DOUBLE_ROUNDING	((void) 0) -#define TCL_DEFAULT_DOUBLE_ROUNDING	((void) 0) -#endif -#else /* !__i386 */ -#define TCL_IEEE_DOUBLE_ROUNDING	((void) 0) -#define TCL_DEFAULT_DOUBLE_ROUNDING	((void) 0) +#ifndef TCL_IEEE_DOUBLE_ROUNDING /* !__i386 || (!__GNUC__ && !__sun) */ +#  define TCL_IEEE_DOUBLE_ROUNDING_DECL +#  define TCL_IEEE_DOUBLE_ROUNDING	((void) 0) +#  define TCL_DEFAULT_DOUBLE_ROUNDING	((void) 0)  #endif  /* @@ -1627,6 +1626,8 @@ MakeLowPrecisionDouble(      int numSigDigs,		/* Number of digits in the significand */      long exponent)		/* Power of ten */  { +    TCL_IEEE_DOUBLE_ROUNDING_DECL +      mp_int significandBig;	/* Significand expressed as a bignum. */      /* @@ -1750,6 +1751,8 @@ MakeHighPrecisionDouble(      int numSigDigs,		/* Number of significant digits */      long exponent)		/* Power of 10 by which to multiply */  { +    TCL_IEEE_DOUBLE_ROUNDING_DECL +      int machexp;		/* Machine exponent of a power of 10. */      /* | 
