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()); |