http://bugs.winehq.org/show_bug.cgi?id=30465
--- Comment #4 from Ulrik Dickow u.dickow@gmail.com 2012-04-17 06:43:25 CDT --- Created attachment 39836 --> http://bugs.winehq.org/attachment.cgi?id=39836 Small stand-alone C(++) test program fiddling with the floating point CW
This small C/C++ test program demonstrates the effect of the floating point control word on the x86 platform using old-fashioned 387 code (the default on 32-bit compiles). It shows that if the CW, as in the wine crash, is 0x1372 when we reach the cast
(int32_t) d
then that cast will indeed trigger an Invalid floating point operation exception IF d is too large to fit in an int32_t -- but not if it just has a value at or between two valid 32 bit integers.
So a simple and portable way of avoiding the problem, modifying only Gecko C++ source code, would be to replace
if (JSDOUBLE_IS_NEGZERO(d)) with if (JSDOUBLE_IS_NEGZERO(d) || d < INT32_MIN || d > INT32_MAX)
in JSDOUBLE_IS_INT32 in wine-gecko/js/src/jsval.h.
Oops, now I see that only a few days ago in the main git repo for wine-gecko, it was replaced with MOZ_DOUBLE_IS_INT32 -- but the same implementation, so the same fix can apply. It will make the code slower, though.
The test program also proves that if you compile with -mfpmath=sse -msse2, it will not crash.