13a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
23a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// Redistribution and use in source and binary forms, with or without
33a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// modification, are permitted provided that the following conditions are
43a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// met:
53a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//
63a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//     * Redistributions of source code must retain the above copyright
73a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//       notice, this list of conditions and the following disclaimer.
83a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//     * Redistributions in binary form must reproduce the above
93a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//       copyright notice, this list of conditions and the following
103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//       disclaimer in the documentation and/or other materials provided
113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//       with the distribution.
123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//     * Neither the name of Google Inc. nor the names of its
133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//       contributors may be used to endorse or promote products derived
143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//       from this software without specific prior written permission.
153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org//
163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#ifndef V8_ARM_LITHIUM_GAP_RESOLVER_ARM_H_
293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#define V8_ARM_LITHIUM_GAP_RESOLVER_ARM_H_
303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#include "v8.h"
323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#include "lithium.h"
343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgnamespace v8 {
363a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgnamespace internal {
373a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
383a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass LCodeGen;
393a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass LGapResolver;
403a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
413a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgclass LGapResolver BASE_EMBEDDED {
423a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org public:
433a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  explicit LGapResolver(LCodeGen* owner);
443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
453a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Resolve a set of parallel moves, emitting assembler instructions.
463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void Resolve(LParallelMove* parallel_move);
473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
483a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org private:
493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Build the initial list of moves.
503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void BuildInitialMoveList(LParallelMove* parallel_move);
513a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Perform the move at the moves_ index in question (possibly requiring
533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // other moves to satisfy dependencies).
543a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void PerformMove(int index);
553a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // If a cycle is found in the series of moves, save the blocking value to
573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // a scratch register.  The cycle must be found by hitting the root of the
583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // depth-first search.
593a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void BreakCycle(int index);
603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // After a cycle has been resolved, restore the value from the scratch
623a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // register to its proper destination.
633a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void RestoreValue();
643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Emit a move and remove it from the move graph.
663a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void EmitMove(int index);
673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
683a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Verify the move list before performing moves.
693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  void Verify();
703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  LCodeGen* cgen_;
723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // List of moves not yet resolved.
743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  ZoneList<LMoveOperands> moves_;
753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  int root_index_;
773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  bool in_cycle_;
783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  LOperand* saved_destination_;
793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org};
803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} }  // namespace v8::internal
823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#endif  // V8_ARM_LITHIUM_GAP_RESOLVER_ARM_H_
84