| 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.
|
|
|