1 // Copyright 2011 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_MIPS_LITHIUM_GAP_RESOLVER_MIPS_H_ 6 #define V8_CRANKSHAFT_MIPS_LITHIUM_GAP_RESOLVER_MIPS_H_ 7 8 #include "src/crankshaft/lithium.h" 9 10 namespace v8 { 11 namespace internal { 12 13 class LCodeGen; 14 class LGapResolver; 15 16 class 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 56 } // namespace internal 57 } // namespace v8 58 59 #endif // V8_CRANKSHAFT_MIPS_LITHIUM_GAP_RESOLVER_MIPS_H_ 60