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