| Index: src/compiler/x64/code-generator-x64.cc
 | 
| diff --git a/src/compiler/x64/code-generator-x64.cc b/src/compiler/x64/code-generator-x64.cc
 | 
| index 897e96c1d3b99b798904c77af1f5b649b5228a5b..99b20cb821d052bba1577c939a662ae1ce1f4a2f 100644
 | 
| --- a/src/compiler/x64/code-generator-x64.cc
 | 
| +++ b/src/compiler/x64/code-generator-x64.cc
 | 
| @@ -191,6 +191,46 @@ class OutOfLineTruncateDoubleToI final : public OutOfLineCode {
 | 
|    XMMRegister const input_;
 | 
|  };
 | 
|  
 | 
| +
 | 
| +class OutOfLineRecordWrite final : public OutOfLineCode {
 | 
| + public:
 | 
| +  OutOfLineRecordWrite(CodeGenerator* gen, Register object, Operand operand,
 | 
| +                       Register value, Register scratch0, Register scratch1,
 | 
| +                       RecordWriteMode mode)
 | 
| +      : OutOfLineCode(gen),
 | 
| +        object_(object),
 | 
| +        operand_(operand),
 | 
| +        value_(value),
 | 
| +        scratch0_(scratch0),
 | 
| +        scratch1_(scratch1),
 | 
| +        mode_(mode) {}
 | 
| +
 | 
| +  void Generate() final {
 | 
| +    if (mode_ > RecordWriteMode::kValueIsPointer) {
 | 
| +      __ JumpIfSmi(value_, exit());
 | 
| +    }
 | 
| +    if (mode_ > RecordWriteMode::kValueIsMap) {
 | 
| +      __ CheckPageFlag(value_, scratch0_,
 | 
| +                       MemoryChunk::kPointersToHereAreInterestingMask, zero,
 | 
| +                       exit());
 | 
| +    }
 | 
| +    SaveFPRegsMode const save_fp_mode =
 | 
| +        frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
 | 
| +    RecordWriteStub stub(isolate(), object_, scratch0_, scratch1_,
 | 
| +                         EMIT_REMEMBERED_SET, save_fp_mode);
 | 
| +    __ leap(scratch1_, operand_);
 | 
| +    __ CallStub(&stub);
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  Register const object_;
 | 
| +  Operand const operand_;
 | 
| +  Register const value_;
 | 
| +  Register const scratch0_;
 | 
| +  Register const scratch1_;
 | 
| +  RecordWriteMode const mode_;
 | 
| +};
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  
 | 
| @@ -654,6 +694,25 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
 | 
|        __ bind(ool->exit());
 | 
|        break;
 | 
|      }
 | 
| +    case kArchRecordWrite: {
 | 
| +      RecordWriteMode mode =
 | 
| +          static_cast<RecordWriteMode>(MiscField::decode(instr->opcode()));
 | 
| +      Register object = i.InputRegister(0);
 | 
| +      size_t index = 0;
 | 
| +      Operand operand = i.MemoryOperand(&index);
 | 
| +      Register value = (mode > RecordWriteMode::kValueIsMap)
 | 
| +                           ? i.InputRegister(index)
 | 
| +                           : no_reg;
 | 
| +      Register scratch0 = i.TempRegister(0);
 | 
| +      Register scratch1 = i.TempRegister(1);
 | 
| +      auto ool = new (zone()) OutOfLineRecordWrite(this, object, operand, value,
 | 
| +                                                   scratch0, scratch1, mode);
 | 
| +      __ CheckPageFlag(object, scratch0,
 | 
| +                       MemoryChunk::kPointersFromHereAreInterestingMask,
 | 
| +                       not_zero, ool->entry());
 | 
| +      __ bind(ool->exit());
 | 
| +      break;
 | 
| +    }
 | 
|      case kX64Add32:
 | 
|        ASSEMBLE_BINOP(addl);
 | 
|        break;
 | 
| @@ -1299,24 +1358,6 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
 | 
|        }
 | 
|        break;
 | 
|      }
 | 
| -    case kX64StoreWriteBarrier: {
 | 
| -      Register object = i.InputRegister(0);
 | 
| -      Register value = i.InputRegister(2);
 | 
| -      SaveFPRegsMode mode =
 | 
| -          frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
 | 
| -      if (HasImmediateInput(instr, 1)) {
 | 
| -        int index = i.InputInt32(1);
 | 
| -        Register scratch = i.TempRegister(1);
 | 
| -        __ movq(Operand(object, index), value);
 | 
| -        __ RecordWriteContextSlot(object, index, value, scratch, mode);
 | 
| -      } else {
 | 
| -        Register index = i.InputRegister(1);
 | 
| -        __ movq(Operand(object, index, times_1, 0), value);
 | 
| -        __ leaq(index, Operand(object, index, times_1, 0));
 | 
| -        __ RecordWrite(object, index, value, mode);
 | 
| -      }
 | 
| -      break;
 | 
| -    }
 | 
|      case kCheckedLoadInt8:
 | 
|        ASSEMBLE_CHECKED_LOAD_INTEGER(movsxbl);
 | 
|        break;
 | 
| 
 |