| Index: src/arm64/code-stubs-arm64.h
|
| diff --git a/src/arm64/code-stubs-arm64.h b/src/arm64/code-stubs-arm64.h
|
| index 7e09ffa57c1817f61f53a8216bb7b37a883a950a..f290a088ce03d07f29f087973d54b9f7047cf4d1 100644
|
| --- a/src/arm64/code-stubs-arm64.h
|
| +++ b/src/arm64/code-stubs-arm64.h
|
| @@ -210,9 +210,15 @@ class RecordWriteStub: public PlatformCodeStub {
|
| : object_(object),
|
| address_(address),
|
| scratch0_(scratch),
|
| - saved_regs_(kCallerSaved) {
|
| + saved_regs_(kCallerSaved),
|
| + saved_fp_regs_(kCallerSavedFP) {
|
| ASSERT(!AreAliased(scratch, object, address));
|
|
|
| + // The SaveCallerSaveRegisters method needs to save caller-saved
|
| + // registers, but we don't bother saving MacroAssembler scratch registers.
|
| + saved_regs_.Remove(MacroAssembler::DefaultTmpList());
|
| + saved_fp_regs_.Remove(MacroAssembler::DefaultFPTmpList());
|
| +
|
| // We would like to require more scratch registers for this stub,
|
| // but the number of registers comes down to the ones used in
|
| // FullCodeGen::SetVar(), which is architecture independent.
|
| @@ -223,12 +229,6 @@ class RecordWriteStub: public PlatformCodeStub {
|
| scratch1_ = Register(pool_available.PopLowestIndex());
|
| scratch2_ = Register(pool_available.PopLowestIndex());
|
|
|
| - // SaveCallerRegisters method needs to save caller saved register, however
|
| - // we don't bother saving ip0 and ip1 because they are used as scratch
|
| - // registers by the MacroAssembler.
|
| - saved_regs_.Remove(ip0);
|
| - saved_regs_.Remove(ip1);
|
| -
|
| // The scratch registers will be restored by other means so we don't need
|
| // to save them with the other caller saved registers.
|
| saved_regs_.Remove(scratch0_);
|
| @@ -253,7 +253,7 @@ class RecordWriteStub: public PlatformCodeStub {
|
| // register will need to be preserved. Can we improve this?
|
| masm->PushCPURegList(saved_regs_);
|
| if (mode == kSaveFPRegs) {
|
| - masm->PushCPURegList(kCallerSavedFP);
|
| + masm->PushCPURegList(saved_fp_regs_);
|
| }
|
| }
|
|
|
| @@ -261,7 +261,7 @@ class RecordWriteStub: public PlatformCodeStub {
|
| // TODO(all): This can be very expensive, and it is likely that not every
|
| // register will need to be preserved. Can we improve this?
|
| if (mode == kSaveFPRegs) {
|
| - masm->PopCPURegList(kCallerSavedFP);
|
| + masm->PopCPURegList(saved_fp_regs_);
|
| }
|
| masm->PopCPURegList(saved_regs_);
|
| }
|
| @@ -279,6 +279,7 @@ class RecordWriteStub: public PlatformCodeStub {
|
| Register scratch1_;
|
| Register scratch2_;
|
| CPURegList saved_regs_;
|
| + CPURegList saved_fp_regs_;
|
|
|
| // TODO(all): We should consider moving this somewhere else.
|
| static CPURegList GetValidRegistersForAllocation() {
|
| @@ -296,10 +297,7 @@ class RecordWriteStub: public PlatformCodeStub {
|
| CPURegList list(CPURegister::kRegister, kXRegSizeInBits, 0, 25);
|
|
|
| // We also remove MacroAssembler's scratch registers.
|
| - list.Remove(ip0);
|
| - list.Remove(ip1);
|
| - list.Remove(x8);
|
| - list.Remove(x9);
|
| + list.Remove(MacroAssembler::DefaultTmpList());
|
|
|
| return list;
|
| }
|
|
|