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)