lithium-gap-resolver-x87.h 2.57 KB
Newer Older
danno@chromium.org's avatar
danno@chromium.org committed
1 2 3 4 5 6 7
// Copyright 2011 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_X87_LITHIUM_GAP_RESOLVER_X87_H_
#define V8_X87_LITHIUM_GAP_RESOLVER_X87_H_

8
#include "src/v8.h"
danno@chromium.org's avatar
danno@chromium.org committed
9

10
#include "src/lithium.h"
danno@chromium.org's avatar
danno@chromium.org committed
11 12 13 14 15 16 17

namespace v8 {
namespace internal {

class LCodeGen;
class LGapResolver;

18
class LGapResolver FINAL BASE_EMBEDDED {
danno@chromium.org's avatar
danno@chromium.org committed
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
 public:
  explicit LGapResolver(LCodeGen* owner);

  // Resolve a set of parallel moves, emitting assembler instructions.
  void Resolve(LParallelMove* parallel_move);

 private:
  // Build the initial list of moves.
  void BuildInitialMoveList(LParallelMove* parallel_move);

  // Perform the move at the moves_ index in question (possibly requiring
  // other moves to satisfy dependencies).
  void PerformMove(int index);

  // Emit any code necessary at the end of a gap move.
  void Finish();

  // Add or delete a move from the move graph without emitting any code.
  // Used to build up the graph and remove trivial moves.
  void AddMove(LMoveOperands move);
  void RemoveMove(int index);

  // Report the count of uses of operand as a source in a not-yet-performed
  // move.  Used to rebuild use counts.
  int CountSourceUses(LOperand* operand);

  // Emit a move and remove it from the move graph.
  void EmitMove(int index);

  // Execute a move by emitting a swap of two operands.  The move from
  // source to destination is removed from the move graph.
  void EmitSwap(int index);

  // Ensure that the given operand is not spilled.
  void EnsureRestored(LOperand* operand);

  // Return a register that can be used as a temp register, spilling
  // something if necessary.
  Register EnsureTempRegister();

  // Return a known free register different from the given one (which could
  // be no_reg---returning any free register), or no_reg if there is no such
  // register.
  Register GetFreeRegisterNot(Register reg);

  // Verify that the state is the initial one, ready to resolve a single
  // parallel move.
  bool HasBeenReset();

  // Verify the move list before performing moves.
  void Verify();

  LCodeGen* cgen_;

  // List of moves not yet resolved.
  ZoneList<LMoveOperands> moves_;

  // Source and destination use counts for the general purpose registers.
  int source_uses_[Register::kMaxNumAllocatableRegisters];
  int destination_uses_[Register::kMaxNumAllocatableRegisters];

  // If we had to spill on demand, the currently spilled register's
  // allocation index.
  int spilled_register_;
};

} }  // namespace v8::internal

#endif  // V8_X87_LITHIUM_GAP_RESOLVER_X87_H_