Index: src/arm64/lithium-codegen-arm64.cc |
diff --git a/src/arm64/lithium-codegen-arm64.cc b/src/arm64/lithium-codegen-arm64.cc |
index a285e7bcc1529419639093e5f204e3ee17abda1e..827c0089c97c6bb8c6307ed43bf1102bbaece51e 100644 |
--- a/src/arm64/lithium-codegen-arm64.cc |
+++ b/src/arm64/lithium-codegen-arm64.cc |
@@ -3665,6 +3665,7 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { |
} |
if (instr->hydrogen()->representation().IsDouble()) { |
+ DCHECK(access.IsInobject()); |
FPRegister result = ToDoubleRegister(instr->result()); |
__ Ldr(result, FieldMemOperand(object, offset)); |
return; |
@@ -5354,7 +5355,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
__ AssertNotSmi(object); |
- if (representation.IsDouble()) { |
+ if (!FLAG_unbox_double_fields && representation.IsDouble()) { |
DCHECK(access.IsInobject()); |
DCHECK(!instr->hydrogen()->has_transition()); |
DCHECK(!instr->hydrogen()->NeedsWriteBarrier()); |
@@ -5363,8 +5364,6 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
return; |
} |
- Register value = ToRegister(instr->value()); |
- |
DCHECK(!representation.IsSmi() || |
!instr->value()->IsConstantOperand() || |
IsInteger32Constant(LConstantOperand::cast(instr->value()))); |
@@ -5396,8 +5395,12 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
destination = temp0; |
} |
- if (representation.IsSmi() && |
- instr->hydrogen()->value()->representation().IsInteger32()) { |
+ if (FLAG_unbox_double_fields && representation.IsDouble()) { |
+ DCHECK(access.IsInobject()); |
+ FPRegister value = ToDoubleRegister(instr->value()); |
+ __ Str(value, FieldMemOperand(object, offset)); |
+ } else if (representation.IsSmi() && |
+ instr->hydrogen()->value()->representation().IsInteger32()) { |
DCHECK(instr->hydrogen()->store_mode() == STORE_TO_INITIALIZED_ENTRY); |
#ifdef DEBUG |
Register temp0 = ToRegister(instr->temp0()); |
@@ -5412,12 +5415,15 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { |
#endif |
STATIC_ASSERT(static_cast<unsigned>(kSmiValueSize) == kWRegSizeInBits); |
STATIC_ASSERT(kSmiTag == 0); |
+ Register value = ToRegister(instr->value()); |
__ Store(value, UntagSmiFieldMemOperand(destination, offset), |
Representation::Integer32()); |
} else { |
+ Register value = ToRegister(instr->value()); |
__ Store(value, FieldMemOperand(destination, offset), representation); |
} |
if (instr->hydrogen()->NeedsWriteBarrier()) { |
+ Register value = ToRegister(instr->value()); |
__ RecordWriteField(destination, |
offset, |
value, // Clobbered. |