| Index: src/arm64/lithium-gap-resolver-arm64.h
|
| diff --git a/src/arm64/lithium-gap-resolver-arm64.h b/src/arm64/lithium-gap-resolver-arm64.h
|
| index 55d4ecbf9d210865d074abd64d7e315bd3643937..7d00485bf478f9c687832d97153ba5d4d3080ea3 100644
|
| --- a/src/arm64/lithium-gap-resolver-arm64.h
|
| +++ b/src/arm64/lithium-gap-resolver-arm64.h
|
| @@ -8,6 +8,7 @@
|
| #include "src/v8.h"
|
|
|
| #include "src/lithium.h"
|
| +#include "src/arm64/delayed-masm-arm64.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -15,6 +16,21 @@ namespace internal {
|
| class LCodeGen;
|
| class LGapResolver;
|
|
|
| +class DelayedGapMasm : public DelayedMasm {
|
| + public:
|
| + DelayedGapMasm(LCodeGen* owner, MacroAssembler* masm)
|
| + : DelayedMasm(owner, masm, root) {
|
| + // We use the root register as an extra scratch register.
|
| + // The root register has two advantages:
|
| + // - It is not in crankshaft allocatable registers list, so it can't
|
| + // interfere with the allocatable registers.
|
| + // - We don't need to push it on the stack, as we can reload it with its
|
| + // value once we have finish.
|
| + }
|
| + void EndDelayedUse();
|
| +};
|
| +
|
| +
|
| class LGapResolver BASE_EMBEDDED {
|
| public:
|
| explicit LGapResolver(LCodeGen* owner);
|
| @@ -43,12 +59,32 @@ class LGapResolver BASE_EMBEDDED {
|
| void EmitMove(int index);
|
|
|
| // Emit a move from one stack slot to another.
|
| - void EmitStackSlotMove(int index);
|
| + void EmitStackSlotMove(int index) {
|
| + masm_.StackSlotMove(moves_[index].source(), moves_[index].destination());
|
| + }
|
|
|
| // Verify the move list before performing moves.
|
| void Verify();
|
|
|
| + // Registers used to solve cycles.
|
| + const Register& SavedValueRegister() {
|
| + ASSERT(!masm_.ScratchRegister().IsAllocatable());
|
| + return masm_.ScratchRegister();
|
| + }
|
| + // The scratch register is used to break cycles and to store constant.
|
| + // These two methods switch from one mode to the other.
|
| + void AcquireSavedValueRegister() { masm_.AcquireScratchRegister(); }
|
| + void ReleaseSavedValueRegister() { masm_.ReleaseScratchRegister(); }
|
| + const FPRegister& SavedFPValueRegister() {
|
| + // We use the Crankshaft floating-point scratch register to break a cycle
|
| + // involving double values as the MacroAssembler will not need it for the
|
| + // operations performed by the gap resolver.
|
| + ASSERT(!crankshaft_fp_scratch.IsAllocatable());
|
| + return crankshaft_fp_scratch;
|
| + }
|
| +
|
| LCodeGen* cgen_;
|
| + DelayedGapMasm masm_;
|
|
|
| // List of moves not yet resolved.
|
| ZoneList<LMoveOperands> moves_;
|
| @@ -56,10 +92,6 @@ class LGapResolver BASE_EMBEDDED {
|
| int root_index_;
|
| bool in_cycle_;
|
| LOperand* saved_destination_;
|
| -
|
| - // We use the root register as a scratch in a few places. When that happens,
|
| - // this flag is set to indicate that it needs to be restored.
|
| - bool need_to_restore_root_;
|
| };
|
|
|
| } } // namespace v8::internal
|
|
|