1e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// Redistribution and use in source and binary forms, with or without 3e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// modification, are permitted provided that the following conditions are 4e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// met: 5e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// 6e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// * Redistributions of source code must retain the above copyright 7e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// notice, this list of conditions and the following disclaimer. 8e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// * Redistributions in binary form must reproduce the above 9e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// copyright notice, this list of conditions and the following 10e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// disclaimer in the documentation and/or other materials provided 11e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// with the distribution. 12e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// * Neither the name of Google Inc. nor the names of its 13e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// contributors may be used to endorse or promote products derived 14e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// from this software without specific prior written permission. 15e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// 16e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 28e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#ifndef V8_ARM_LITHIUM_GAP_RESOLVER_ARM_H_ 29e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#define V8_ARM_LITHIUM_GAP_RESOLVER_ARM_H_ 30e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 31e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#include "v8.h" 32e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 33e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#include "lithium.h" 34e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 35e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochnamespace v8 { 36e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochnamespace internal { 37e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 38e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LCodeGen; 39e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LGapResolver; 40e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 41e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LGapResolver BASE_EMBEDDED { 42e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 43e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit LGapResolver(LCodeGen* owner); 44e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 45e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Resolve a set of parallel moves, emitting assembler instructions. 46e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Resolve(LParallelMove* parallel_move); 47e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 48e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 49e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Build the initial list of moves. 50e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void BuildInitialMoveList(LParallelMove* parallel_move); 51e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 52e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Perform the move at the moves_ index in question (possibly requiring 53e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // other moves to satisfy dependencies). 54e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void PerformMove(int index); 55e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 56e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // If a cycle is found in the series of moves, save the blocking value to 57e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // a scratch register. The cycle must be found by hitting the root of the 58e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // depth-first search. 59e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void BreakCycle(int index); 60e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 61e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // After a cycle has been resolved, restore the value from the scratch 62e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // register to its proper destination. 63e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void RestoreValue(); 64e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 65e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Emit a move and remove it from the move graph. 66e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void EmitMove(int index); 67e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 68e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Verify the move list before performing moves. 69e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Verify(); 70e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 71e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LCodeGen* cgen_; 72e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 73e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // List of moves not yet resolved. 74e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ZoneList<LMoveOperands> moves_; 75e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 76e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int root_index_; 77e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool in_cycle_; 78e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* saved_destination_; 79e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 80e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 81e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} } // namespace v8::internal 82e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 83e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif // V8_ARM_LITHIUM_GAP_RESOLVER_ARM_H_ 84