Posted to tcl by kbk at Thu Jul 02 18:23:23 GMT 2015view raw
- 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)