1c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
5c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifndef V8_MIPS_LITHIUM_GAP_RESOLVER_MIPS_H_
6c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define V8_MIPS_LITHIUM_GAP_RESOLVER_MIPS_H_
7c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
9c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium.h"
11c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
12c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgnamespace v8 {
13c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgnamespace internal {
14c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
15c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgclass LCodeGen;
16c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgclass LGapResolver;
17c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
18ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LGapResolver FINAL BASE_EMBEDDED {
19c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
20c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LGapResolver(LCodeGen* owner);
21c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
22c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Resolve a set of parallel moves, emitting assembler instructions.
23c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void Resolve(LParallelMove* parallel_move);
24c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
25c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
26c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Build the initial list of moves.
27c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void BuildInitialMoveList(LParallelMove* parallel_move);
28c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
29c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Perform the move at the moves_ index in question (possibly requiring
30c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // other moves to satisfy dependencies).
31c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void PerformMove(int index);
32c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
33c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // If a cycle is found in the series of moves, save the blocking value to
34c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // a scratch register.  The cycle must be found by hitting the root of the
35c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // depth-first search.
36c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void BreakCycle(int index);
37c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
38c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // After a cycle has been resolved, restore the value from the scratch
39c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // register to its proper destination.
40c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void RestoreValue();
41c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
42c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Emit a move and remove it from the move graph.
43c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void EmitMove(int index);
44c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
45c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Verify the move list before performing moves.
46c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void Verify();
47c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
48c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCodeGen* cgen_;
49c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
50c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // List of moves not yet resolved.
51c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  ZoneList<LMoveOperands> moves_;
52c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
53c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int root_index_;
54c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool in_cycle_;
55c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* saved_destination_;
56c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
57c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
58c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} }  // namespace v8::internal
59c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
60c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif  // V8_MIPS_LITHIUM_GAP_RESOLVER_MIPS_H_
61