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