| Index: runtime/vm/stub_code_x64.cc
|
| ===================================================================
|
| --- runtime/vm/stub_code_x64.cc (revision 22083)
|
| +++ runtime/vm/stub_code_x64.cc (working copy)
|
| @@ -948,6 +948,22 @@
|
| __ pushq(RDX);
|
| __ pushq(RCX);
|
|
|
| + Label add_to_buffer;
|
| + // Check whether this object has already been remembered. Skip adding to the
|
| + // store buffer if the object is in the store buffer already.
|
| + // Spilled: EDX, ECX
|
| + // EAX: Address being stored
|
| + __ movq(RCX, FieldAddress(RAX, Object::tags_offset()));
|
| + __ testq(RCX, Immediate(1 << RawObject::kRememberedBit));
|
| + __ j(EQUAL, &add_to_buffer, Assembler::kNearJump);
|
| + __ popq(RCX);
|
| + __ popq(RDX);
|
| + __ ret();
|
| +
|
| + __ Bind(&add_to_buffer);
|
| + __ orq(RCX, Immediate(1 << RawObject::kRememberedBit));
|
| + __ movq(FieldAddress(RAX, Object::tags_offset()), RCX);
|
| +
|
| // Load the isolate out of the context.
|
| // RAX: Address being stored
|
| __ movq(RDX, FieldAddress(CTX, Context::isolate_offset()));
|
|
|