Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index f1c631bc5fd4ae905431c923c91bf4ee20c55614..7f778f83748c2f8d37b6cfa8fca9bac4f0db04a7 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -3318,7 +3318,23 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
int offset = instr->offset(); |
if (!instr->transition().is_null()) { |
- __ Move(FieldOperand(object, HeapObject::kMapOffset), instr->transition()); |
+ if (!instr->hydrogen()->NeedsWriteBarrierForMap()) { |
+ __ Move(FieldOperand(object, HeapObject::kMapOffset), |
+ instr->transition()); |
+ } else { |
+ Register temp = ToRegister(instr->TempAt(0)); |
+ Register temp_map = ToRegister(instr->TempAt(1)); |
+ __ Move(temp_map, instr->transition()); |
+ __ movq(FieldOperand(object, HeapObject::kMapOffset), temp_map); |
+ // Update the write barrier for the map field. |
+ __ RecordWriteField(object, |
+ HeapObject::kMapOffset, |
+ temp_map, |
+ temp, |
+ kSaveFPRegs, |
+ OMIT_REMEMBERED_SET, |
+ OMIT_SMI_CHECK); |
+ } |
} |
// Do the store. |