Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index f510c85c2c39bd52dad1d0d7f2d558c3ab9b6337..623a9dca452d8195ab26de7d5060f1a905978282 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -4097,12 +4097,32 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
} |
} else if (representation.IsDouble()) { |
ASSERT(access.IsInobject()); |
+ ASSERT(!instr->hydrogen()->has_transition()); |
ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); |
DwVfpRegister value = ToDoubleRegister(instr->value()); |
__ vstr(value, FieldMemOperand(object, offset)); |
return; |
} |
+ if (instr->hydrogen()->has_transition()) { |
+ Handle<Map> transition = instr->hydrogen()->transition_map(); |
+ AddDeprecationDependency(transition); |
+ __ mov(scratch, Operand(transition)); |
+ __ str(scratch, FieldMemOperand(object, HeapObject::kMapOffset)); |
+ if (instr->hydrogen()->NeedsWriteBarrierForMap()) { |
+ Register temp = ToRegister(instr->temp()); |
+ // Update the write barrier for the map field. |
+ __ RecordWriteField(object, |
+ HeapObject::kMapOffset, |
+ scratch, |
+ temp, |
+ GetLinkRegisterState(), |
+ kSaveFPRegs, |
+ OMIT_REMEMBERED_SET, |
+ OMIT_SMI_CHECK); |
+ } |
+ } |
+ |
// Do the store. |
Register value = ToRegister(instr->value()); |
if (access.IsInobject()) { |