Chromium Code Reviews| 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..7276bc8590a1add81e090089dd6eb4aab9ca07e8 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(index_immediate_ == 0); |
|
Benedikt Meurer
2016/02/12 17:57:24
Nit: DCHECK_EQ(0, index_immediate_)
jbramley
2016/02/15 13:31:28
Done.
|
| + __ 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(addressing_mode == kMode_Offset_RR); |
|
Benedikt Meurer
2016/02/12 17:57:24
Nit: DCHECK_EQ(kMode_Offset_RR, addressing_mode)
jbramley
2016/02/15 13:31:28
Done.
|
| + 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()); |