1// 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_BACKEND_GAP_RESOLVER_H_
6#define V8_COMPILER_BACKEND_GAP_RESOLVER_H_
7
8#include "src/compiler/backend/instruction.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
14class GapResolver final {
15 public:
16 // Interface used by the gap resolver to emit moves and swaps.
17 class Assembler {
18 public:
19 virtual ~Assembler() = default;
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)
30 : assembler_(assembler), split_rep_(MachineRepresentation::kSimd128) {}
31
32 // Resolve a set of parallel moves, emitting assembler instructions.
33 V8_EXPORT_PRIVATE void Resolve(ParallelMove* parallel_move);
34
35 private:
36 // Performs the given move, possibly performing other moves to unblock the
37 // destination operand.
38 void PerformMove(ParallelMove* moves, MoveOperands* move);
39
40 // Assembler used to emit moves and save registers.
41 Assembler* const assembler_;
42
43 // While resolving moves, the largest FP representation that can be moved.
44 // Any larger moves must be split into an equivalent series of moves of this
45 // representation.
46 MachineRepresentation split_rep_;
47};
48
49} // namespace compiler
50} // namespace internal
51} // namespace v8
52
53#endif // V8_COMPILER_BACKEND_GAP_RESOLVER_H_
54