blob: 19806f568a82faf27b5d6e60f12b195d1bed5208 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_GAP_RESOLVER_H_
6#define V8_COMPILER_GAP_RESOLVER_H_
7
8#include "src/compiler/instruction.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014class GapResolver final {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015 public:
16 // Interface used by the gap resolver to emit moves and swaps.
17 class Assembler {
18 public:
19 virtual ~Assembler() {}
20
21 // Assemble move.
22 virtual void AssembleMove(InstructionOperand* source,
23 InstructionOperand* destination) = 0;
24 // Assemble swap.
25 virtual void AssembleSwap(InstructionOperand* source,
26 InstructionOperand* destination) = 0;
27 };
28
29 explicit GapResolver(Assembler* assembler) : assembler_(assembler) {}
30
31 // Resolve a set of parallel moves, emitting assembler instructions.
32 void Resolve(ParallelMove* parallel_move) const;
33
34 private:
35 // Perform the given move, possibly requiring other moves to satisfy
36 // dependencies.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037 void PerformMove(ParallelMove* moves, MoveOperands* move) const;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000038
39 // Assembler used to emit moves and save registers.
40 Assembler* const assembler_;
41};
Emily Bernierd0a1eb72015-03-24 16:35:39 -040042
43} // namespace compiler
44} // namespace internal
45} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +000046
47#endif // V8_COMPILER_GAP_RESOLVER_H_