| Index: src/ia32/macro-assembler-ia32.cc
|
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
|
| index f3a4e58c416cf45f3ba29835ae96cc84a2b8a1e1..1368501e225c1c2aaa995aab34a1914160e0f365 100644
|
| --- a/src/ia32/macro-assembler-ia32.cc
|
| +++ b/src/ia32/macro-assembler-ia32.cc
|
| @@ -392,12 +392,14 @@ void MacroAssembler::LoadUint32(XMMRegister dst,
|
| }
|
|
|
|
|
| -void MacroAssembler::RecordWriteArray(Register object,
|
| - Register value,
|
| - Register index,
|
| - SaveFPRegsMode save_fp,
|
| - RememberedSetAction remembered_set_action,
|
| - SmiCheck smi_check) {
|
| +void MacroAssembler::RecordWriteArray(
|
| + Register object,
|
| + Register value,
|
| + Register index,
|
| + SaveFPRegsMode save_fp,
|
| + RememberedSetAction remembered_set_action,
|
| + SmiCheck smi_check,
|
| + PointersToHereCheck pointers_to_here_check_for_value) {
|
| // First, check if a write barrier is even needed. The tests below
|
| // catch stores of Smis.
|
| Label done;
|
| @@ -416,8 +418,8 @@ void MacroAssembler::RecordWriteArray(Register object,
|
| lea(dst, Operand(object, index, times_half_pointer_size,
|
| FixedArray::kHeaderSize - kHeapObjectTag));
|
|
|
| - RecordWrite(
|
| - object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK);
|
| + RecordWrite(object, dst, value, save_fp, remembered_set_action,
|
| + OMIT_SMI_CHECK, pointers_to_here_check_for_value);
|
|
|
| bind(&done);
|
|
|
| @@ -437,7 +439,8 @@ void MacroAssembler::RecordWriteField(
|
| Register dst,
|
| SaveFPRegsMode save_fp,
|
| RememberedSetAction remembered_set_action,
|
| - SmiCheck smi_check) {
|
| + SmiCheck smi_check,
|
| + PointersToHereCheck pointers_to_here_check_for_value) {
|
| // First, check if a write barrier is even needed. The tests below
|
| // catch stores of Smis.
|
| Label done;
|
| @@ -460,8 +463,8 @@ void MacroAssembler::RecordWriteField(
|
| bind(&ok);
|
| }
|
|
|
| - RecordWrite(
|
| - object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK);
|
| + RecordWrite(object, dst, value, save_fp, remembered_set_action,
|
| + OMIT_SMI_CHECK, pointers_to_here_check_for_value);
|
|
|
| bind(&done);
|
|
|
| @@ -502,6 +505,9 @@ void MacroAssembler::RecordWriteForMap(
|
| return;
|
| }
|
|
|
| + // Compute the address.
|
| + lea(address, FieldOperand(object, HeapObject::kMapOffset));
|
| +
|
| // Count number of write barriers in generated code.
|
| isolate()->counters()->write_barriers_static()->Increment();
|
| IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1);
|
| @@ -517,12 +523,6 @@ void MacroAssembler::RecordWriteForMap(
|
| &done,
|
| Label::kNear);
|
|
|
| - // Delay the initialization of |address| and |value| for the stub until it's
|
| - // known that the will be needed. Up until this point their values are not
|
| - // needed since they are embedded in the operands of instructions that need
|
| - // them.
|
| - lea(address, FieldOperand(object, HeapObject::kMapOffset));
|
| - mov(value, Immediate(map));
|
| RecordWriteStub stub(isolate(), object, value, address, OMIT_REMEMBERED_SET,
|
| save_fp);
|
| CallStub(&stub);
|
| @@ -539,12 +539,14 @@ void MacroAssembler::RecordWriteForMap(
|
| }
|
|
|
|
|
| -void MacroAssembler::RecordWrite(Register object,
|
| - Register address,
|
| - Register value,
|
| - SaveFPRegsMode fp_mode,
|
| - RememberedSetAction remembered_set_action,
|
| - SmiCheck smi_check) {
|
| +void MacroAssembler::RecordWrite(
|
| + Register object,
|
| + Register address,
|
| + Register value,
|
| + SaveFPRegsMode fp_mode,
|
| + RememberedSetAction remembered_set_action,
|
| + SmiCheck smi_check,
|
| + PointersToHereCheck pointers_to_here_check_for_value) {
|
| ASSERT(!object.is(value));
|
| ASSERT(!object.is(address));
|
| ASSERT(!value.is(address));
|
| @@ -576,12 +578,14 @@ void MacroAssembler::RecordWrite(Register object,
|
| JumpIfSmi(value, &done, Label::kNear);
|
| }
|
|
|
| - CheckPageFlag(value,
|
| - value, // Used as scratch.
|
| - MemoryChunk::kPointersToHereAreInterestingMask,
|
| - zero,
|
| - &done,
|
| - Label::kNear);
|
| + if (pointers_to_here_check_for_value != kPointersToHereAreAlwaysInteresting) {
|
| + CheckPageFlag(value,
|
| + value, // Used as scratch.
|
| + MemoryChunk::kPointersToHereAreInterestingMask,
|
| + zero,
|
| + &done,
|
| + Label::kNear);
|
| + }
|
| CheckPageFlag(object,
|
| value, // Used as scratch.
|
| MemoryChunk::kPointersFromHereAreInterestingMask,
|
|
|