Posted to tcl by kbk at Thu Jul 02 18:23:23 GMT 2015view pretty
Index: generic/tclStrToD.c ================================================================== --- generic/tclStrToD.c +++ generic/tclStrToD.c @@ -47,22 +47,36 @@ * and ix86-isms are factored out here. */ #if defined(__GNUC__) typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); +typedef unsigned int32_t mxcsr_t; #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 _SSE_GETMXCSR(csr) __asm__ __volatile__ ("stxmxcsr %0" : : "=m" (*&cw)) +#define _SSE_SETMXCSR(csr) __asm__ __volatile__ ("ldxmxcsr %0" : : "m" (*&cw)) + +# define FPU_IEEE_ROUNDING 0x123f; +# define SSE_IEEE_ROUNDING 0x00001f80; # define ADJUST_FPU_CONTROL_WORD #define TCL_IEEE_DOUBLE_ROUNDING \ + do { \ fpu_control_t roundTo53Bits = FPU_IEEE_ROUNDING; \ + mxcsr_t sseRoundTo53Bits = SSE_IEEE_ROUNDING; \ fpu_control_t oldRoundingMode; \ + mxcsr_t oldSseRoundingMode; \ _FPU_GETCW(oldRoundingMode); \ - _FPU_SETCW(roundTo53Bits) -#define TCL_DEFAULT_DOUBLE_ROUNDING \ - _FPU_SETCW(oldRoundingMode) + _SSE_GETMXCSR(oldSseRoundingMode); \ + _FPU_SETCW(roundTo53Bits); \ + _SSE_SETMXCSR(sseRoundTo53Bits); \ + } while(0) +#define TCL_DEFAULT_DOUBLE_ROUNDING \ + do { \ + _SSE_SETMXCSR(oldSseRoundingMode); \ + _FPU_SETCW(oldRoundingMode); \ + } while(0) /* * Sun ProC needs sunmath for rounding control on x86 like gcc above. */ #elif defined(__sun)