| Index: src/ia32/ic-ia32.cc
|
| ===================================================================
|
| --- src/ia32/ic-ia32.cc (revision 3405)
|
| +++ src/ia32/ic-ia32.cc (working copy)
|
| @@ -459,14 +459,16 @@
|
| // FP(0): value
|
| __ AllocateHeapNumber(eax, ebx, ecx, &failed_allocation);
|
| // Set the value.
|
| - __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| + __ GenerateHeapNumberValueAddress(ebx, eax);
|
| + __ fstp_d(Operand(ebx, 0));
|
| __ ret(0);
|
| } else if (array_type == kExternalFloatArray) {
|
| // For the floating-point array type, we need to always allocate a
|
| // HeapNumber.
|
| __ AllocateHeapNumber(eax, ebx, ecx, &failed_allocation);
|
| // Set the value.
|
| - __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| + __ GenerateHeapNumberValueAddress(ebx, eax);
|
| + __ fstp_d(Operand(ebx, 0));
|
| __ ret(0);
|
| } else {
|
| __ shl(eax, kSmiTagSize);
|
| @@ -721,7 +723,8 @@
|
| // The WebGL specification leaves the behavior of storing NaN and
|
| // +/-Infinity into integer arrays basically undefined. For more
|
| // reproducible behavior, convert these to zero.
|
| - __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| + __ GenerateHeapNumberValueAddress(edx, eax);
|
| + __ fld_d(Operand(edx, 0));
|
| __ mov(edx, eax); // Save the value.
|
| __ mov(ecx, FieldOperand(ecx, ExternalArray::kExternalPointerOffset));
|
| // ebx: untagged index
|
| @@ -772,7 +775,8 @@
|
| // This test would apparently detect both NaN and Infinity,
|
| // but we've already checked for NaN using the FPU hardware
|
| // above.
|
| - __ mov_w(edi, FieldOperand(edx, HeapNumber::kValueOffset + 6));
|
| + __ GenerateHeapNumberValueAddress(edi, edx);
|
| + __ mov_w(edi, Operand(edi, 6));
|
| __ and_(edi, 0x7FF0);
|
| __ cmp(edi, 0x7FF0);
|
| __ j(not_equal, ¬_infinity);
|
|
|