| Index: src/x64/code-stubs-x64.cc
|
| ===================================================================
|
| --- src/x64/code-stubs-x64.cc (revision 8207)
|
| +++ src/x64/code-stubs-x64.cc (working copy)
|
| @@ -2427,16 +2427,18 @@
|
| // Store last subject and last input.
|
| __ movq(rax, Operand(rsp, kSubjectOffset));
|
| __ movq(FieldOperand(rbx, RegExpImpl::kLastSubjectOffset), rax);
|
| - __ movq(rcx, rbx);
|
| - __ RecordWrite(rcx,
|
| - RegExpImpl::kLastSubjectOffset,
|
| - rax,
|
| - rdi,
|
| - kDontSaveFPRegs);
|
| + __ RecordWriteField(rbx,
|
| + RegExpImpl::kLastSubjectOffset,
|
| + rax,
|
| + rdi,
|
| + kDontSaveFPRegs);
|
| __ movq(rax, Operand(rsp, kSubjectOffset));
|
| __ movq(FieldOperand(rbx, RegExpImpl::kLastInputOffset), rax);
|
| - __ movq(rcx, rbx);
|
| - __ RecordWrite(rcx, RegExpImpl::kLastInputOffset, rax, rdi, kDontSaveFPRegs);
|
| + __ RecordWriteField(rbx,
|
| + RegExpImpl::kLastInputOffset,
|
| + rax,
|
| + rdi,
|
| + kDontSaveFPRegs);
|
|
|
| // Get the static offsets vector filled by the native regexp code.
|
| __ LoadAddress(rcx,
|
| @@ -5178,6 +5180,36 @@
|
| }
|
|
|
|
|
| +// Takes the input in 3 registers: address_ value_ and object_. A pointer to
|
| +// the value has just been written into the object, now this stub makes sure
|
| +// we keep the GC informed. The word in the object where the value has been
|
| +// written is in the address register.
|
| +void RecordWriteStub::Generate(MacroAssembler* masm) {
|
| + Label skip_non_incremental_part;
|
| +
|
| + // The first instruction is generated as a label so as to get the offset
|
| + // fixed up correctly by the bind(Label*) call. We patch it back and forth
|
| + // between a 2-byte compare instruction (a nop in this position) and the real
|
| + // branch when we start and stop incremental heap marking.
|
| + __ jmp(&skip_non_incremental_part, Label::kNear);
|
| + if (!masm->isolate()->heap()->incremental_marking()->IsMarking()) {
|
| + ASSERT(masm->byte_at(masm->pc_offset() - 2) ==
|
| + kSkipNonIncrementalPartInstruction);
|
| + masm->set_byte_at(masm->pc_offset() - 2, kTwoByteNopInstruction);
|
| + }
|
| +
|
| + if (remembered_set_action_ == EMIT_REMEMBERED_SET) {
|
| + __ RememberedSetHelper(
|
| + address_, value_, save_fp_regs_mode_, MacroAssembler::kReturnAtEnd);
|
| + } else {
|
| + __ ret(0);
|
| + }
|
| +
|
| + __ bind(&skip_non_incremental_part);
|
| + __ int3();
|
| +}
|
| +
|
| +
|
| #undef __
|
|
|
| } } // namespace v8::internal
|
|
|