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