DescriptionWork around GCC bug that results in incorrect simd128_value_t copying.
Under certain conditions GCC on x86 decides to copy simd128_value_t through FPU stack.
For example Int32x4::value getter would contain the following code:
212d5: d9 46 07 fld DWORD PTR [esi+0x7]
212d8: d9 46 0b fld DWORD PTR [esi+0xb]
212db: 8b 46 03 mov eax,DWORD PTR [esi+0x3]
212de: d9 46 0f fld DWORD PTR [esi+0xf]
212e1: d9 ca fxch st(2)
212e3: d9 5b 04 fstp DWORD PTR [ebx+0x4]
212e6: d9 5b 08 fstp DWORD PTR [ebx+0x8]
212e9: 89 03 mov DWORD PTR [ebx],eax
212eb: d9 5b 0c fstp DWORD PTR [ebx+0xc]
This code is incorrect. For example an attempt to copy an int32_t value that
looks like sNaN will result in it turning into a qNaN which changes
the value being copied.
GCC bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58416
This was causing flakiness when people were running WebSocket related tests
locally on Dart VM binaries built with GCC as our WebSocket implementation uses
Int32x4 values to speed up payload masking/unmasking.
Bots were not affected because they are building with clang.
BUG=http://dartbug.com/21220
R=johnmccutchan@google.com
Committed: https://code.google.com/p/dart/source/detail?r=41581
Patch Set 1 #
Messages
Total messages: 4 (1 generated)
|