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