| Index: runtime/vm/stub_code_mips.cc
|
| ===================================================================
|
| --- runtime/vm/stub_code_mips.cc (revision 22392)
|
| +++ runtime/vm/stub_code_mips.cc (working copy)
|
| @@ -984,26 +984,44 @@
|
| __ sw(T2, Address(SP, 1 * kWordSize));
|
| __ sw(T1, Address(SP, 0 * kWordSize));
|
|
|
| + 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: T1, T2, T3.
|
| + // T0: Address being stored.
|
| + __ lw(T2, FieldAddress(T0, Object::tags_offset()));
|
| + __ andi(T1, T2, Immediate(1 << RawObject::kRememberedBit));
|
| + __ beq(T1, ZR, &add_to_buffer);
|
| + __ lw(T1, Address(SP, 0 * kWordSize));
|
| + __ lw(T2, Address(SP, 1 * kWordSize));
|
| + __ lw(T3, Address(SP, 2 * kWordSize));
|
| + __ addiu(SP, SP, Immediate(3 * kWordSize));
|
| + __ Ret();
|
| +
|
| + __ Bind(&add_to_buffer);
|
| + __ ori(T2, T2, Immediate(1 << RawObject::kRememberedBit));
|
| + __ sw(T2, FieldAddress(T0, Object::tags_offset()));
|
| +
|
| // Load the isolate out of the context.
|
| // Spilled: T1, T2, T3.
|
| // T0: Address being stored.
|
| __ lw(T1, FieldAddress(CTX, Context::isolate_offset()));
|
|
|
| - // Load top_ out of the StoreBufferBlock and add the address to the pointers_.
|
| + // Load the StoreBuffer block out of the isolate. Then load top_ out of the
|
| + // StoreBufferBlock and add the address to the pointers_.
|
| // T1: Isolate.
|
| - intptr_t store_buffer_offset = Isolate::store_buffer_block_offset();
|
| - __ lw(T2, Address(T1, store_buffer_offset + StoreBufferBlock::top_offset()));
|
| + __ lw(T1, Address(T1, Isolate::store_buffer_offset()));
|
| + __ lw(T2, Address(T1, StoreBufferBlock::top_offset()));
|
| __ sll(T3, T2, 2);
|
| __ addu(T3, T1, T3);
|
| - __ sw(T0,
|
| - Address(T3, store_buffer_offset + StoreBufferBlock::pointers_offset()));
|
| + __ sw(T0, Address(T3, StoreBufferBlock::pointers_offset()));
|
|
|
| // Increment top_ and check for overflow.
|
| // T2: top_
|
| - // T1: Isolate
|
| + // T1: StoreBufferBlock
|
| Label L;
|
| __ AddImmediate(T2, 1);
|
| - __ sw(T2, Address(T1, store_buffer_offset + StoreBufferBlock::top_offset()));
|
| + __ sw(T2, Address(T1, StoreBufferBlock::top_offset()));
|
| __ addiu(CMPRES, T2, Immediate(-StoreBufferBlock::kSize));
|
| // Restore values.
|
| __ lw(T1, Address(SP, 0 * kWordSize));
|
|
|