| Index: src/compiler/arm/code-generator-arm.cc
|
| diff --git a/src/compiler/arm/code-generator-arm.cc b/src/compiler/arm/code-generator-arm.cc
|
| index ff1548272e11e10de896b02cf39de4f53bb6f4fc..2a32d12578944ae74accf3c0c17160ad8ad338ad 100644
|
| --- a/src/compiler/arm/code-generator-arm.cc
|
| +++ b/src/compiler/arm/code-generator-arm.cc
|
| @@ -206,6 +206,19 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
|
| : OutOfLineCode(gen),
|
| object_(object),
|
| index_(index),
|
| + index_immediate_(0),
|
| + value_(value),
|
| + scratch0_(scratch0),
|
| + scratch1_(scratch1),
|
| + mode_(mode) {}
|
| +
|
| + OutOfLineRecordWrite(CodeGenerator* gen, Register object, int32_t index,
|
| + Register value, Register scratch0, Register scratch1,
|
| + RecordWriteMode mode)
|
| + : OutOfLineCode(gen),
|
| + object_(object),
|
| + index_(no_reg),
|
| + index_immediate_(index),
|
| value_(value),
|
| scratch0_(scratch0),
|
| scratch1_(scratch1),
|
| @@ -226,13 +239,19 @@ class OutOfLineRecordWrite final : public OutOfLineCode {
|
| // and restore lr properly here if the frame was elided.
|
| RecordWriteStub stub(isolate(), object_, scratch0_, scratch1_,
|
| EMIT_REMEMBERED_SET, save_fp_mode);
|
| - __ add(scratch1_, object_, index_);
|
| + if (index_.is(no_reg)) {
|
| + __ add(scratch1_, object_, Operand(index_immediate_));
|
| + } else {
|
| + DCHECK_EQ(0, index_immediate_);
|
| + __ add(scratch1_, object_, Operand(index_));
|
| + }
|
| __ CallStub(&stub);
|
| }
|
|
|
| private:
|
| Register const object_;
|
| Register const index_;
|
| + int32_t const index_immediate_; // Valid if index_.is(no_reg).
|
| Register const value_;
|
| Register const scratch0_;
|
| Register const scratch1_;
|
| @@ -522,13 +541,25 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| RecordWriteMode mode =
|
| static_cast<RecordWriteMode>(MiscField::decode(instr->opcode()));
|
| Register object = i.InputRegister(0);
|
| - Register index = i.InputRegister(1);
|
| Register value = i.InputRegister(2);
|
| Register scratch0 = i.TempRegister(0);
|
| Register scratch1 = i.TempRegister(1);
|
| - auto ool = new (zone()) OutOfLineRecordWrite(this, object, index, value,
|
| - scratch0, scratch1, mode);
|
| - __ str(value, MemOperand(object, index));
|
| + OutOfLineRecordWrite* ool;
|
| +
|
| + AddressingMode addressing_mode =
|
| + AddressingModeField::decode(instr->opcode());
|
| + if (addressing_mode == kMode_Offset_RI) {
|
| + int32_t index = i.InputInt32(1);
|
| + ool = new (zone()) OutOfLineRecordWrite(this, object, index, value,
|
| + scratch0, scratch1, mode);
|
| + __ str(value, MemOperand(object, index));
|
| + } else {
|
| + DCHECK_EQ(kMode_Offset_RR, addressing_mode);
|
| + Register index(i.InputRegister(1));
|
| + ool = new (zone()) OutOfLineRecordWrite(this, object, index, value,
|
| + scratch0, scratch1, mode);
|
| + __ str(value, MemOperand(object, index));
|
| + }
|
| __ CheckPageFlag(object, scratch0,
|
| MemoryChunk::kPointersFromHereAreInterestingMask, ne,
|
| ool->entry());
|
|
|