Index: runtime/vm/stub_code_arm64.cc |
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc |
index 71ebe70d2f6f10ebe3a6d1fc45b8b4e645f5d0cb..1a38e96ba8607101d405a7b5e03664955a23184a 100644 |
--- a/runtime/vm/stub_code_arm64.cc |
+++ b/runtime/vm/stub_code_arm64.cc |
@@ -1089,7 +1089,7 @@ void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { |
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. |
- __ LoadFieldFromOffset(TMP, R0, Object::tags_offset()); |
+ __ LoadFieldFromOffset(TMP, R0, Object::tags_offset(), kWord); |
__ tsti(TMP, Immediate(1 << RawObject::kRememberedBit)); |
__ b(&add_to_buffer, EQ); |
__ ret(); |
@@ -1104,11 +1104,13 @@ void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { |
ASSERT(Object::tags_offset() == 0); |
__ sub(R3, R0, Operand(kHeapObjectTag)); |
// R3: Untagged address of header word (ldxr/stxr do not support offsets). |
+ // Note that we use 32 bit operations here to match the size of the |
+ // background sweeper which is also manipulating this 32 bit word. |
Label retry; |
__ Bind(&retry); |
- __ ldxr(R2, R3); |
+ __ ldxr(R2, R3, kWord); |
__ orri(R2, R2, Immediate(1 << RawObject::kRememberedBit)); |
- __ stxr(R1, R2, R3); |
+ __ stxr(R1, R2, R3, kWord); |
__ cmp(R1, Operand(1)); |
__ b(&retry, EQ); |
@@ -1195,11 +1197,12 @@ void StubCode::GenerateAllocationStubForClass(Assembler* assembler, |
// R3: next object start. |
// R1: new object type arguments (if is_cls_parameterized). |
// Set the tags. |
- uword tags = 0; |
+ uint32_t tags = 0; |
tags = RawObject::SizeTag::update(instance_size, tags); |
ASSERT(cls.id() != kIllegalCid); |
tags = RawObject::ClassIdTag::update(cls.id(), tags); |
__ LoadImmediate(R0, tags); |
+ // 64 bit store also zeros the hash_field. |
__ StoreToOffset(R0, R2, Instance::tags_offset()); |
// Initialize the remaining words of the object. |