| Index: src/mips64/macro-assembler-mips64.cc
|
| diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc
|
| index 203427f64106d1fc9043560042429f720d649c32..1f5590dab2f87dcdf5adb1565b28aa9afda44eb2 100644
|
| --- a/src/mips64/macro-assembler-mips64.cc
|
| +++ b/src/mips64/macro-assembler-mips64.cc
|
| @@ -371,6 +371,67 @@ void MacroAssembler::RecordWrite(
|
| }
|
| }
|
|
|
| +void MacroAssembler::RecordWriteCodeEntryField(Register js_function,
|
| + Register code_entry,
|
| + Register scratch) {
|
| + const int offset = JSFunction::kCodeEntryOffset;
|
| +
|
| + // Since a code entry (value) is always in old space, we don't need to update
|
| + // remembered set. If incremental marking is off, there is nothing for us to
|
| + // do.
|
| + if (!FLAG_incremental_marking) return;
|
| +
|
| + DCHECK(js_function.is(a1));
|
| + DCHECK(code_entry.is(a4));
|
| + DCHECK(scratch.is(a5));
|
| + AssertNotSmi(js_function);
|
| +
|
| + if (emit_debug_code()) {
|
| + Daddu(scratch, js_function, Operand(offset - kHeapObjectTag));
|
| + ld(at, MemOperand(scratch));
|
| + Assert(eq, kWrongAddressOrValuePassedToRecordWrite, at,
|
| + Operand(code_entry));
|
| + }
|
| +
|
| + // First, check if a write barrier is even needed. The tests below
|
| + // catch stores of Smis and stores into young gen.
|
| + Label done;
|
| +
|
| + CheckPageFlag(code_entry, scratch,
|
| + MemoryChunk::kPointersToHereAreInterestingMask, eq, &done);
|
| + CheckPageFlag(js_function, scratch,
|
| + MemoryChunk::kPointersFromHereAreInterestingMask, eq, &done);
|
| +
|
| + const Register dst = scratch;
|
| + Daddu(dst, js_function, Operand(offset - kHeapObjectTag));
|
| +
|
| + // Save caller-saved registers. js_function and code_entry are in the
|
| + // caller-saved register list.
|
| + DCHECK(kJSCallerSaved & js_function.bit());
|
| + DCHECK(kJSCallerSaved & code_entry.bit());
|
| + MultiPush(kJSCallerSaved | ra.bit());
|
| +
|
| + int argument_count = 3;
|
| +
|
| + PrepareCallCFunction(argument_count, code_entry);
|
| +
|
| + Move(a0, js_function);
|
| + Move(a1, dst);
|
| + li(a2, Operand(ExternalReference::isolate_address(isolate())));
|
| +
|
| + {
|
| + AllowExternalCallThatCantCauseGC scope(this);
|
| + CallCFunction(
|
| + ExternalReference::incremental_marking_record_write_code_entry_function(
|
| + isolate()),
|
| + argument_count);
|
| + }
|
| +
|
| + // Restore caller-saved registers.
|
| + MultiPop(kJSCallerSaved | ra.bit());
|
| +
|
| + bind(&done);
|
| +}
|
|
|
| void MacroAssembler::RememberedSetHelper(Register object, // For debug tests.
|
| Register address,
|
|
|