| Index: src/a64/lithium-codegen-a64.cc
|
| diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc
|
| index ad8d742abac2cc894d292e026d7005b67933e834..d7dd832a8593385765f39f2107deb17f77b3e94a 100644
|
| --- a/src/a64/lithium-codegen-a64.cc
|
| +++ b/src/a64/lithium-codegen-a64.cc
|
| @@ -5059,7 +5059,7 @@ void LCodeGen::DoStoreKeyedExternal(LStoreKeyedExternal* instr) {
|
| void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
| Register elements = ToRegister(instr->elements());
|
| DoubleRegister value = ToDoubleRegister(instr->value());
|
| - Register store_base = ToRegister(instr->temp());
|
| + Register store_base = no_reg;
|
| int offset = 0;
|
|
|
| if (instr->key()->IsConstantOperand()) {
|
| @@ -5071,6 +5071,7 @@ void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
| instr->additional_index());
|
| store_base = elements;
|
| } else {
|
| + store_base = ToRegister(instr->temp());
|
| Register key = ToRegister(instr->key());
|
| bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi();
|
| CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged,
|
| @@ -5093,17 +5094,23 @@ void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
| void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) {
|
| Register value = ToRegister(instr->value());
|
| Register elements = ToRegister(instr->elements());
|
| - Register store_base = ToRegister(instr->temp());
|
| + Register scratch = no_reg;
|
| + Register store_base = no_reg;
|
| Register key = no_reg;
|
| int offset = 0;
|
|
|
| + if (!instr->key()->IsConstantOperand() ||
|
| + instr->hydrogen()->NeedsWriteBarrier()) {
|
| + scratch = ToRegister(instr->temp());
|
| + }
|
| +
|
| if (instr->key()->IsConstantOperand()) {
|
| - ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
| LConstantOperand* const_operand = LConstantOperand::cast(instr->key());
|
| offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) +
|
| instr->additional_index());
|
| store_base = elements;
|
| } else {
|
| + store_base = scratch;
|
| key = ToRegister(instr->key());
|
| bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi();
|
| CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged,
|
| @@ -5122,13 +5129,16 @@ void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) {
|
| }
|
|
|
| if (instr->hydrogen()->NeedsWriteBarrier()) {
|
| + ASSERT(representation.IsTagged());
|
| + // This assignment may cause element_addr to alias store_base.
|
| + Register element_addr = scratch;
|
| SmiCheck check_needed =
|
| instr->hydrogen()->value()->IsHeapObject()
|
| ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
| // Compute address of modified element and store it into key register.
|
| - __ Add(key, store_base, offset - kHeapObjectTag);
|
| - __ RecordWrite(elements, key, value, GetLinkRegisterState(), kSaveFPRegs,
|
| - EMIT_REMEMBERED_SET, check_needed);
|
| + __ Add(element_addr, store_base, offset - kHeapObjectTag);
|
| + __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(),
|
| + kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed);
|
| }
|
| }
|
|
|
|
|