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())); |