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)