Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index 3ef4599ef0b6a3c57860c8868d9c354a8d790531..1d1da3d38371e65e9e9c92a3ca741598cf9c7fd4 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -4021,12 +4021,33 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
} |
} else if (representation.IsDouble()) { |
ASSERT(access.IsInobject()); |
+ ASSERT(!hinstr->has_transition()); |
ASSERT(!hinstr->NeedsWriteBarrier()); |
XMMRegister value = ToDoubleRegister(instr->value()); |
__ movsd(FieldOperand(object, offset), value); |
return; |
} |
+ if (hinstr->has_transition()) { |
+ Handle<Map> transition = hinstr->transition_map(); |
+ AddDeprecationDependency(transition); |
+ if (!hinstr->NeedsWriteBarrierForMap()) { |
+ __ Move(FieldOperand(object, HeapObject::kMapOffset), transition); |
+ } else { |
+ Register temp = ToRegister(instr->temp()); |
+ __ Move(kScratchRegister, transition); |
+ __ movp(FieldOperand(object, HeapObject::kMapOffset), kScratchRegister); |
+ // Update the write barrier for the map field. |
+ __ RecordWriteField(object, |
+ HeapObject::kMapOffset, |
+ kScratchRegister, |
+ temp, |
+ kSaveFPRegs, |
+ OMIT_REMEMBERED_SET, |
+ OMIT_SMI_CHECK); |
+ } |
+ } |
+ |
// Do the store. |
Register write_register = object; |
if (!access.IsInobject()) { |