10511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// Copyright 2011 the V8 project authors. All rights reserved.
20511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// Redistribution and use in source and binary forms, with or without
30511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// modification, are permitted provided that the following conditions are
40511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// met:
50511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//
60511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//     * Redistributions of source code must retain the above copyright
70511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//       notice, this list of conditions and the following disclaimer.
80511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//     * Redistributions in binary form must reproduce the above
90511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//       copyright notice, this list of conditions and the following
100511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//       disclaimer in the documentation and/or other materials provided
110511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//       with the distribution.
120511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//     * Neither the name of Google Inc. nor the names of its
130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//       contributors may be used to endorse or promote products derived
140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//       from this software without specific prior written permission.
150511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com//
160511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
170511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
180511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
190511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
200511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
210511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
220511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
230511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
240511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
250511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
260511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
270511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
280511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#ifndef V8_IA32_LITHIUM_GAP_RESOLVER_IA32_H_
290511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#define V8_IA32_LITHIUM_GAP_RESOLVER_IA32_H_
300511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
310511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#include "v8.h"
320511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
330a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org#include "lithium.h"
340511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
350511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comnamespace v8 {
360511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comnamespace internal {
370511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
380511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comclass LCodeGen;
390511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comclass LGapResolver;
400511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
410511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comclass LGapResolver BASE_EMBEDDED {
420511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com public:
430511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LGapResolver(LCodeGen* owner);
440511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
450511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Resolve a set of parallel moves, emitting assembler instructions.
460511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void Resolve(LParallelMove* parallel_move);
470511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
480511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com private:
490511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Build the initial list of moves.
500511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void BuildInitialMoveList(LParallelMove* parallel_move);
510511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
520511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Perform the move at the moves_ index in question (possibly requiring
530511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // other moves to satisfy dependencies).
540511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void PerformMove(int index);
550511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
560511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Emit any code necessary at the end of a gap move.
570511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void Finish();
580511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
590511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Add or delete a move from the move graph without emitting any code.
600511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Used to build up the graph and remove trivial moves.
610511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void AddMove(LMoveOperands move);
620511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void RemoveMove(int index);
630511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
640511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Report the count of uses of operand as a source in a not-yet-performed
650511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // move.  Used to rebuild use counts.
660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  int CountSourceUses(LOperand* operand);
670511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
680511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Emit a move and remove it from the move graph.
690511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void EmitMove(int index);
700511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Execute a move by emitting a swap of two operands.  The move from
720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // source to destination is removed from the move graph.
730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void EmitSwap(int index);
740511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
750511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Ensure that the given operand is not spilled.
760511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void EnsureRestored(LOperand* operand);
770511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
780511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Return a register that can be used as a temp register, spilling
790511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // something if necessary.
800511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  Register EnsureTempRegister();
810511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
820511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Return a known free register different from the given one (which could
830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // be no_reg---returning any free register), or no_reg if there is no such
840511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // register.
850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  Register GetFreeRegisterNot(Register reg);
860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Verify that the state is the initial one, ready to resolve a single
880511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // parallel move.
890511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  bool HasBeenReset();
900511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
910511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Verify the move list before performing moves.
920511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void Verify();
930511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
940511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LCodeGen* cgen_;
950511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
960511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // List of moves not yet resolved.
970511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  ZoneList<LMoveOperands> moves_;
980511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
990511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Source and destination use counts for the general purpose registers.
100a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  int source_uses_[Register::kMaxNumAllocatableRegisters];
101a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  int destination_uses_[Register::kMaxNumAllocatableRegisters];
1020511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
1030511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // If we had to spill on demand, the currently spilled register's
1040511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // allocation index.
1050511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  int spilled_register_;
1060511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com};
1070511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
1080511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} }  // namespace v8::internal
1090511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
1100511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com#endif  // V8_IA32_LITHIUM_GAP_RESOLVER_IA32_H_
111