10ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
20ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// Redistribution and use in source and binary forms, with or without
30ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// modification, are permitted provided that the following conditions are
40ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// met:
50ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//
60ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//     * Redistributions of source code must retain the above copyright
70ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//       notice, this list of conditions and the following disclaimer.
80ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//     * Redistributions in binary form must reproduce the above
90ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//       copyright notice, this list of conditions and the following
100ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//       disclaimer in the documentation and/or other materials provided
110ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//       with the distribution.
120ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//     * Neither the name of Google Inc. nor the names of its
130ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//       contributors may be used to endorse or promote products derived
140ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//       from this software without specific prior written permission.
150ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org//
160ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
170ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
180ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
190ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
200ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
210ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
220ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
230ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
240ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
250ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
260ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
270ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
280ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org#ifndef V8_X64_LITHIUM_GAP_RESOLVER_X64_H_
290ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org#define V8_X64_LITHIUM_GAP_RESOLVER_X64_H_
300ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
310ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org#include "v8.h"
320ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
330ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org#include "lithium.h"
340ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
350ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgnamespace v8 {
360ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgnamespace internal {
370ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
380ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgclass LCodeGen;
390ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgclass LGapResolver;
400ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
410ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.orgclass LGapResolver BASE_EMBEDDED {
420ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org public:
430ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  explicit LGapResolver(LCodeGen* owner);
440ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
450ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Resolve a set of parallel moves, emitting assembler instructions.
460ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void Resolve(LParallelMove* parallel_move);
470ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
480ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org private:
490ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Build the initial list of moves.
500ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void BuildInitialMoveList(LParallelMove* parallel_move);
510ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
520ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Perform the move at the moves_ index in question (possibly requiring
530ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // other moves to satisfy dependencies).
540ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void PerformMove(int index);
550ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
560ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Emit a move and remove it from the move graph.
570ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void EmitMove(int index);
580ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
590ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Execute a move by emitting a swap of two operands.  The move from
600ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // source to destination is removed from the move graph.
610ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void EmitSwap(int index);
620ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
630ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // Verify the move list before performing moves.
640ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  void Verify();
650ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
660ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  LCodeGen* cgen_;
670ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
680ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  // List of moves not yet resolved.
690ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  ZoneList<LMoveOperands> moves_;
700ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org};
710ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
720ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org} }  // namespace v8::internal
730ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
740ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org#endif  // V8_X64_LITHIUM_GAP_RESOLVER_X64_H_
75