diff options
Diffstat (limited to 'compiler/optimizing/parallel_move_resolver.h')
-rw-r--r-- | compiler/optimizing/parallel_move_resolver.h | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/compiler/optimizing/parallel_move_resolver.h b/compiler/optimizing/parallel_move_resolver.h index ff20cb0bc6..e1189d8520 100644 --- a/compiler/optimizing/parallel_move_resolver.h +++ b/compiler/optimizing/parallel_move_resolver.h @@ -23,6 +23,7 @@ namespace art { class HParallelMove; +class Location; class MoveOperands; /** @@ -39,15 +40,37 @@ class ParallelMoveResolver : public ValueObject { void EmitNativeCode(HParallelMove* parallel_move); protected: + class ScratchRegisterScope : public ValueObject { + public: + ScratchRegisterScope(ParallelMoveResolver* resolver, int blocked, int number_of_registers); + ~ScratchRegisterScope(); + + int GetRegister() const { return reg_; } + bool IsSpilled() const { return spilled_; } + + private: + ParallelMoveResolver* resolver_; + int reg_; + bool spilled_; + }; + + bool IsScratchLocation(Location loc); + int AllocateScratchRegister(int blocked, int register_count, bool* spilled); + // Emit a move. virtual void EmitMove(size_t index) = 0; // Execute a move by emitting a swap of two operands. virtual void EmitSwap(size_t index) = 0; + virtual void SpillScratch(int reg) = 0; + virtual void RestoreScratch(int reg) = 0; + // List of moves not yet resolved. GrowableArray<MoveOperands*> moves_; + static constexpr int kNoRegister = -1; + private: // Build the initial list of moves. void BuildInitialMoveList(HParallelMove* parallel_move); |