13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
21e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Redistribution and use in source and binary forms, with or without
31e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// modification, are permitted provided that the following conditions are
41e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// met:
51e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//
61e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//     * Redistributions of source code must retain the above copyright
71e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       notice, this list of conditions and the following disclaimer.
81e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//     * Redistributions in binary form must reproduce the above
91e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       copyright notice, this list of conditions and the following
101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       disclaimer in the documentation and/or other materials provided
111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       with the distribution.
121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//     * Neither the name of Google Inc. nor the names of its
131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       contributors may be used to endorse or promote products derived
141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//       from this software without specific prior written permission.
151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block//
161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifndef V8_LITHIUM_ALLOCATOR_INL_H_
291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#define V8_LITHIUM_ALLOCATOR_INL_H_
301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "lithium-allocator.h"
321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#if V8_TARGET_ARCH_IA32
341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "ia32/lithium-ia32.h"
351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#elif V8_TARGET_ARCH_X64
361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "x64/lithium-x64.h"
371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#elif V8_TARGET_ARCH_ARM
381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "arm/lithium-arm.h"
3944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#elif V8_TARGET_ARCH_MIPS
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "mips/lithium-mips.h"
411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#else
421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#error "Unknown architecture."
431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blocknamespace v8 {
461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blocknamespace internal {
471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockbool LAllocator::IsGapAt(int index) { return chunk_->IsGapAt(index); }
491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
511e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LAllocator::InstructionAt(int index) {
521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return chunk_->instructions()->at(index);
531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
561e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLGap* LAllocator::GapAt(int index) {
571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return chunk_->GetGapAt(index);
581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
611e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockTempIterator::TempIterator(LInstruction* instr)
621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    : instr_(instr),
631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      limit_(instr->TempCount()),
641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      current_(0) {
653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  SkipUninteresting();
661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool TempIterator::Done() { return current_ >= limit_; }
701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
723fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLOperand* TempIterator::Current() {
733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(!Done());
741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return instr_->TempAt(current_);
751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid TempIterator::SkipUninteresting() {
793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  while (current_ < limit_ && instr_->TempAt(current_) == NULL) ++current_;
801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid TempIterator::Advance() {
843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ++current_;
853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  SkipUninteresting();
861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
891e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockInputIterator::InputIterator(LInstruction* instr)
901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    : instr_(instr),
911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      limit_(instr->InputCount()),
921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      current_(0) {
933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  SkipUninteresting();
941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool InputIterator::Done() { return current_ >= limit_; }
981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1003fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLOperand* InputIterator::Current() {
1013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(!Done());
1021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return instr_->InputAt(current_);
1031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
1041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid InputIterator::Advance() {
1073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ++current_;
1083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  SkipUninteresting();
1091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
1101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid InputIterator::SkipUninteresting() {
1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  while (current_ < limit_ && instr_->InputAt(current_)->IsConstantOperand()) {
1143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ++current_;
1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
1161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
1171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1191e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockUseIterator::UseIterator(LInstruction* instr)
1201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    : input_iterator_(instr), env_iterator_(instr->environment()) { }
1211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool UseIterator::Done() {
1243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return input_iterator_.Done() && env_iterator_.Done();
1251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
1261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1283fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLOperand* UseIterator::Current() {
1293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(!Done());
1303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return input_iterator_.Done()
1313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? env_iterator_.Current()
1323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : input_iterator_.Current();
1331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
1341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid UseIterator::Advance() {
1373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  input_iterator_.Done()
1383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? env_iterator_.Advance()
1393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : input_iterator_.Advance();
1401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
1411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} }  // namespace v8::internal
1431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif  // V8_LITHIUM_ALLOCATOR_INL_H_
145