Posted to tcl by kbk at Thu Jul 02 18:23:23 GMT 2015view raw

  1. Index: generic/tclStrToD.c
  2. ==================================================================
  3. --- generic/tclStrToD.c
  4. +++ generic/tclStrToD.c
  5. @@ -47,22 +47,36 @@
  6. * and ix86-isms are factored out here.
  7. */
  8.  
  9. #if defined(__GNUC__)
  10. typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
  11. +typedef unsigned int32_t mxcsr_t;
  12.  
  13. #define _FPU_GETCW(cw) __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw))
  14. #define _FPU_SETCW(cw) __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw))
  15. -# define FPU_IEEE_ROUNDING 0x027f
  16. +#define _SSE_GETMXCSR(csr) __asm__ __volatile__ ("stxmxcsr %0" : : "=m" (*&cw))
  17. +#define _SSE_SETMXCSR(csr) __asm__ __volatile__ ("ldxmxcsr %0" : : "m" (*&cw))
  18. +
  19. +# define FPU_IEEE_ROUNDING 0x123f;
  20. +# define SSE_IEEE_ROUNDING 0x00001f80;
  21. # define ADJUST_FPU_CONTROL_WORD
  22. #define TCL_IEEE_DOUBLE_ROUNDING \
  23. + do { \
  24. fpu_control_t roundTo53Bits = FPU_IEEE_ROUNDING; \
  25. + mxcsr_t sseRoundTo53Bits = SSE_IEEE_ROUNDING; \
  26. fpu_control_t oldRoundingMode; \
  27. + mxcsr_t oldSseRoundingMode; \
  28. _FPU_GETCW(oldRoundingMode); \
  29. - _FPU_SETCW(roundTo53Bits)
  30. -#define TCL_DEFAULT_DOUBLE_ROUNDING \
  31. - _FPU_SETCW(oldRoundingMode)
  32. + _SSE_GETMXCSR(oldSseRoundingMode); \
  33. + _FPU_SETCW(roundTo53Bits); \
  34. + _SSE_SETMXCSR(sseRoundTo53Bits); \
  35. + } while(0)
  36. +#define TCL_DEFAULT_DOUBLE_ROUNDING \
  37. + do { \
  38. + _SSE_SETMXCSR(oldSseRoundingMode); \
  39. + _FPU_SETCW(oldRoundingMode); \
  40. + } while(0)
  41.  
  42. /*
  43. * Sun ProC needs sunmath for rounding control on x86 like gcc above.
  44. */
  45. #elif defined(__sun)
  46.  
  47.