Index: runtime/vm/stub_code_arm.cc |
=================================================================== |
--- runtime/vm/stub_code_arm.cc (revision 22083) |
+++ runtime/vm/stub_code_arm.cc (working copy) |
@@ -876,6 +876,21 @@ |
// Save values being destroyed. |
__ PushList((1 << R1) | (1 << R2) | (1 << R3)); |
+ 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 |
+ __ ldr(R2, FieldAddress(R0, Object::tags_offset())); |
+ __ tst(R2, ShifterOperand(1 << RawObject::kRememberedBit)); |
+ __ b(&add_to_buffer, EQ); |
+ __ PopList((1 << R1) | (1 << R2) | (1 << R3)); |
+ __ Ret(); |
+ |
+ __ Bind(&add_to_buffer); |
+ __ orr(R2, R2, ShifterOperand(1 << RawObject::kRememberedBit)); |
+ __ str(R2, FieldAddress(R0, Object::tags_offset())); |
+ |
// Load the isolate out of the context. |
// Spilled: R1, R2, R3. |
// R0: address being stored. |