112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// found in the LICENSE file. 412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/v8.h" 612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if V8_TARGET_ARCH_MIPS64 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/hydrogen-osr.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h" 1112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/lithium-codegen-mips64.h" 1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace v8 { 1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace internal { 1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define DEFINE_COMPILE(type) \ 1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void L##type::CompileToNative(LCodeGen* generator) { \ 1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org generator->Do##type(this); \ 1912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 2012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 2112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#undef DEFINE_COMPILE 2212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef DEBUG 2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::VerifyCall() { 2512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Call instructions can use only fixed registers as temporaries and 2612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // outputs because all registers are blocked by the calling convention. 2712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Inputs operands must use a fixed register or use-at-start policy or 2812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // a non-register policy. 29e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Output() == NULL || 3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated::cast(Output())->HasFixedPolicy() || 3112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !LUnallocated::cast(Output())->HasRegisterPolicy()); 3212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (UseIterator it(this); !it.Done(); it.Advance()) { 3312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 34e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() || 3512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org operand->IsUsedAtStart()); 3612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 3712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (TempIterator it(this); !it.Done(); it.Advance()) { 3812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 39e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 4012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 4112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 4212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif 4312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) { 4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("%s ", this->Mnemonic()); 4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintOutputOperandTo(stream); 4912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 5012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintDataTo(stream); 5112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 5212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (HasEnvironment()) { 5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" "); 5412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org environment()->PrintTo(stream); 5512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 5612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 5712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (HasPointerMap()) { 5812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" "); 5912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org pointer_map()->PrintTo(stream); 6012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 6112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 6212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 6312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 6412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) { 6512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("= "); 6612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < InputCount(); i++) { 6712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (i > 0) stream->Add(" "); 6812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (InputAt(i) == NULL) { 6912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("NULL"); 7012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 7112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org InputAt(i)->PrintTo(stream); 7212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 7312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 7412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 7512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 7612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 7712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 7812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (HasResult()) result()->PrintTo(stream); 7912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 8012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 8112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 8212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) { 8312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LGap::PrintDataTo(stream); 8412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LLabel* rep = replacement(); 8512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (rep != NULL) { 8612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" Dead block replaced with B%d", rep->block_id()); 8712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 8812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 8912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 9012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 9112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgbool LGap::IsRedundant() const { 9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < 4; i++) { 9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return false; 9512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 9612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 9712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 9812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return true; 9912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) { 10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < 4; i++) { 10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("("); 10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (parallel_moves_[i] != NULL) { 10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org parallel_moves_[i]->PrintDataTo(stream); 10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") "); 10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* LArithmeticD::Mnemonic() const { 11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (op()) { 11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::ADD: return "add-d"; 11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::SUB: return "sub-d"; 11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::MUL: return "mul-d"; 11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::DIV: return "div-d"; 11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::MOD: return "mod-d"; 12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* LArithmeticT::Mnemonic() const { 12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (op()) { 12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::ADD: return "add-t"; 13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::SUB: return "sub-t"; 13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::MUL: return "mul-t"; 13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::MOD: return "mod-t"; 13312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::DIV: return "div-t"; 13412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::BIT_AND: return "bit-and-t"; 13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::BIT_OR: return "bit-or-t"; 13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::BIT_XOR: return "bit-xor-t"; 13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::ROR: return "ror-t"; 13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::SHL: return "sll-t"; 13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::SAR: return "sra-t"; 14012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Token::SHR: return "srl-t"; 14112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const { 14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return !gen->IsNextEmittedBlock(block_id()); 15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) { 15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("B%d", block_id()); 15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) { 15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 16512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LDebugBreak(); 16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if "); 17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left()->PrintTo(stream); 17212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" %s ", Token::String(op())); 17312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right()->PrintTo(stream); 17412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 17512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 17612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 17712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 17912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if is_object("); 18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if is_string("); 18712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 18812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 18912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 19012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 19312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if is_smi("); 19412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 19512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 19612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 19712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 20012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if is_undetectable("); 20112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 20212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 20312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 20412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 20512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 20612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 20712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if string_compare("); 20812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left()->PrintTo(stream); 20912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right()->PrintTo(stream); 21012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 21112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 21212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 21312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 21412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 21512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if has_instance_type("); 21612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 21712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 21812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 21912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 22212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if has_cached_array_index("); 22312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 22412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 22512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 22612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 22912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if class_of_test("); 23012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 23112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(", \"%o\") then B%d else B%d", 23212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org *hydrogen()->class_name(), 23312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org true_block_id(), 23412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org false_block_id()); 23512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 23612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 23712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 23812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 23912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("if typeof "); 24012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 24112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" == \"%s\" then B%d else B%d", 24212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org hydrogen()->type_literal()->ToCString().get(), 24312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org true_block_id(), false_block_id()); 24412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 24512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 24612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 24712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 24812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" = "); 24912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org function()->PrintTo(stream); 25012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(".code_entry = "); 25112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org code_object()->PrintTo(stream); 25212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 25312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 25412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 25512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 25612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" = "); 25712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org base_object()->PrintTo(stream); 25812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" + "); 25912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org offset()->PrintTo(stream); 26012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 26112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 26212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 26312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 26412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("= "); 26512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org function()->PrintTo(stream); 26612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("#%d / ", arity()); 26712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 26812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 26912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 27012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 27112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < InputCount(); i++) { 27212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org InputAt(i)->PrintTo(stream); 27312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" "); 27412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 27512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("#%d / ", arity()); 27612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 27712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 27812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 27912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 28012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org context()->PrintTo(stream); 28112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("[%d]", slot_index()); 28212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 28312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 28412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 28512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 28612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org context()->PrintTo(stream); 28712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("[%d] <- ", slot_index()); 28812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 28912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 29012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 29312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("= "); 29412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org function()->PrintTo(stream); 29512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" #%d / ", arity()); 29612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 29712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) { 30012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("= "); 30112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org constructor()->PrintTo(stream); 30212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" #%d / ", arity()); 30312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 30412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 30512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 30612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) { 30712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("= "); 30812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org constructor()->PrintTo(stream); 30912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" #%d / ", arity()); 31012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ElementsKind kind = hydrogen()->elements_kind(); 31112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" (%s) ", ElementsKindToString(kind)); 31212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 31312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 31412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 31512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 31612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org arguments()->PrintTo(stream); 31712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" length "); 31812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org length()->PrintTo(stream); 31912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" index "); 32012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org index()->PrintTo(stream); 32112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 32212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 32312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 32412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 32512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object()->PrintTo(stream); 32612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org OStringStream os; 32712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org os << hydrogen()->access() << " <- "; 32812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(os.c_str()); 32912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 33012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 33112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 33212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 33312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 33412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object()->PrintTo(stream); 33512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("."); 33612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(String::cast(*name())->ToCString().get()); 33712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" <- "); 33812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 33912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 34012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 34112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 34212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 34312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org elements()->PrintTo(stream); 34412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("["); 34512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org key()->PrintTo(stream); 34612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (hydrogen()->IsDehoisted()) { 34712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" + %d]", base_offset()); 34812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 34912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("]"); 35012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 35112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 35212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 35312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 35412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 35512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org elements()->PrintTo(stream); 35612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("["); 35712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org key()->PrintTo(stream); 35812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (hydrogen()->IsDehoisted()) { 35912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" + %d] <-", base_offset()); 36012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 36112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("] <- "); 36212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 36312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 36412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value() == NULL) { 365e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hydrogen()->IsConstantHoleStore() && 36612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org hydrogen()->value()->representation().IsDouble()); 36712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("<the hole(nan)>"); 36812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 36912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 37012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 37112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 37212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 37312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 37412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 37512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object()->PrintTo(stream); 37612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("["); 37712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org key()->PrintTo(stream); 37812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add("] <- "); 37912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value()->PrintTo(stream); 38012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 38112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 38212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 38312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 38412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object()->PrintTo(stream); 38512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 38612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 38712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 38812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 38912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 39012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Skip a slot if for a double-width slot. 39112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kind == DOUBLE_REGISTERS) spill_slot_count_++; 39212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return spill_slot_count_++; 39312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 39412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 39512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 39612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 39712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int index = GetNextSpillIndex(kind); 39812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kind == DOUBLE_REGISTERS) { 39912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return LDoubleStackSlot::Create(index, zone()); 40012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kind == GENERAL_REGISTERS); 40212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return LStackSlot::Create(index, zone()); 40312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 40412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 40512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 40612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 40712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLPlatformChunk* LChunkBuilder::Build() { 408e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_unused()); 40912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org chunk_ = new(zone()) LPlatformChunk(info(), graph()); 41012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LPhase phase("L_Building chunk", chunk_); 41112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org status_ = BUILDING; 41212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 41312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // If compiling for OSR, reserve space for the unoptimized frame, 41412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // which will be subsumed into this frame. 41512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (graph()->has_osr()) { 41612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 41712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 41812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 41912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 42012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 42112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 42212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < blocks->length(); i++) { 42312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBasicBlock* next = NULL; 42412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (i < blocks->length() - 1) next = blocks->at(i + 1); 42512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DoBasicBlock(blocks->at(i), next); 42612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (is_aborted()) return NULL; 42712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 42812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org status_ = DONE; 42912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return chunk_; 43012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 43112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 43212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 43312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 43412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 43512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Register::ToAllocationIndex(reg)); 43612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 43712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 43812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 43912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 44012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 44112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DoubleRegister::ToAllocationIndex(reg)); 44212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 44312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 44412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 44512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 44612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, ToUnallocated(fixed_register)); 44712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 44812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 44912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) { 45112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, ToUnallocated(reg)); 45212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 45312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) { 45612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 45712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 45812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 46012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 46112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, 46212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 46312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated::USED_AT_START)); 46412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 46512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 46612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 46712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 46812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 46912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 47012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) { 47312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 47412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 47512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) { 47812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 47912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated::USED_AT_START)); 48012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 48112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 48212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 48312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 48412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return value->IsConstant() 48512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 48612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : Use(value); 48712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 48812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 48912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 49012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 49112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return value->IsConstant() 49212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 49312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseAtStart(value); 49412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 49512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 49612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 49712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 49812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return value->IsConstant() 49912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 50012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseRegister(value); 50112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 50212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 50312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 50412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 50512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return value->IsConstant() 50612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 50712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseRegisterAtStart(value); 50812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 50912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 51012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 51112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) { 51212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return chunk_->DefineConstantOperand(HConstant::cast(value)); 51312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 51412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 51512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 51612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseAny(HValue* value) { 51712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return value->IsConstant() 51812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 51912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 52012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 52112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 52212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 52312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 52412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (value->EmitAtUses()) { 52512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInstruction* instr = HInstruction::cast(value); 52612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org VisitInstruction(instr); 52712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 52812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org operand->set_virtual_register(value->id()); 52912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return operand; 53012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 53112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 53212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 53312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 53412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* result) { 53512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result->set_virtual_register(current_instruction_->id()); 53612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->set_result(result); 53712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr; 53812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 53912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 54012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 54112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister( 54212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTemplateResultInstruction<1>* instr) { 54312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Define(instr, 54412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 54512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 54612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 54712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 54812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled( 54912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTemplateResultInstruction<1>* instr, int index) { 55012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Define(instr, 55112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 55212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 55312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 55412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 55512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst( 55612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTemplateResultInstruction<1>* instr) { 55712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Define(instr, 55812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 55912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 56012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 56112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 56212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixed( 56312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTemplateResultInstruction<1>* instr, Register reg) { 56412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Define(instr, ToUnallocated(reg)); 56512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 56612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 56712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 56812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble( 56912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTemplateResultInstruction<1>* instr, DoubleRegister reg) { 57012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Define(instr, ToUnallocated(reg)); 57112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 57212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 57312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 57412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 57512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* hydrogen_env = current_block_->last_environment(); 57612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int argument_index_accumulator = 0; 57712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ZoneList<HValue*> objects_to_materialize(0, zone()); 57812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->set_environment(CreateEnvironment(hydrogen_env, 57912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org &argument_index_accumulator, 58012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org &objects_to_materialize)); 58112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr; 58212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 58312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 58412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 58512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 58612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInstruction* hinstr, 58712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org CanDeoptimize can_deoptimize) { 58812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsNonDeferredCalling(); 58912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef DEBUG 59012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->VerifyCall(); 59112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif 59212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->MarkAsCall(); 59312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = AssignPointerMap(instr); 59412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 59512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // If instruction does not have side-effects lazy deoptimization 59612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // after the call will try to deoptimize to the point before the call. 59712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Thus we still need to attach environment to this call even if 59812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // call sequence can not deoptimize eagerly. 59912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool needs_environment = 60012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 60112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !hinstr->HasObservableSideEffects(); 60212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (needs_environment && !instr->HasEnvironment()) { 60312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = AssignEnvironment(instr); 60412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We can't really figure out if the environment is needed or not. 60512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->environment()->set_has_been_used(); 60612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 60712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 60812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr; 60912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 61012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 61112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 61212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 613e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->HasPointerMap()); 61412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->set_pointer_map(new(zone()) LPointerMap(zone())); 61512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr; 61612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 61712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 61812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 61912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::TempRegister() { 62012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = 62112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 62212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int vreg = allocator_->GetVirtualRegister(); 62312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!allocator_->AllocationOk()) { 62412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 62512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org vreg = 0; 62612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 62712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org operand->set_virtual_register(vreg); 62812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return operand; 62912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 63012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 63112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 63212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() { 63312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = 63412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); 63512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int vreg = allocator_->GetVirtualRegister(); 63612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!allocator_->AllocationOk()) { 63712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 63812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org vreg = 0; 63912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 64012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org operand->set_virtual_register(vreg); 64112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return operand; 64212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 64312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 64412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 64512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) { 64612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = ToUnallocated(reg); 647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 64812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return operand; 64912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 65012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 65312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = ToUnallocated(reg); 654e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 65512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return operand; 65612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 65712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 65912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 66012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LLabel(instr->block()); 66112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 66212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 66312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 66412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 66512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 66612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 66712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 66812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 66912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 67012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 67112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 67212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 67312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 67412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 67512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 67612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(new(zone()) LDeoptimize); 67712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 67812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 67912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 68012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op, 68112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBitwiseBinaryOperation* instr) { 68212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 683e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 684e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 68512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 68612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 68712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* right_value = instr->right(); 68812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = NULL; 68912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int constant_value = 0; 69012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool does_deopt = false; 69112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (right_value->IsConstant()) { 69212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HConstant* constant = HConstant::cast(right_value); 69312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right = chunk_->DefineConstantOperand(constant); 69412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org constant_value = constant->Integer32Value() & 0x1f; 69512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Left shifts can deoptimize if we shift by > 0 and the result cannot be 69612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // truncated to smi. 69712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmi() && constant_value > 0) { 69812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 69912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 70012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 70112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right = UseRegisterAtStart(right_value); 70212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 70312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 70412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Shift operations can only deoptimize if we do a logical shift 70512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // by 0 and the result cannot be truncated to int32. 70612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (op == Token::SHR && constant_value == 0) { 70712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (FLAG_opt_safe_uint32_operations) { 70812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org does_deopt = !instr->CheckFlag(HInstruction::kUint32); 70912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 71012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 71112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 71212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 71312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 71412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 71512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt)); 71612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return does_deopt ? AssignEnvironment(result) : result; 71712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 71812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(op, instr); 71912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 72012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 72112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 72212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 72312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 72412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HArithmeticBinaryOperation* instr) { 725e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 727e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 72812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (op == Token::MOD) { 72912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseFixedDouble(instr->left(), f2); 73012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseFixedDouble(instr->right(), f4); 73112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 73212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We call a C function for double modulo. It can't trigger a GC. We need 73312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // to use fixed result register for the call. 73412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // TODO(fschneider): Allow any register as input registers. 73512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixedDouble(result, f2), instr); 73612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 73712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 73812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 73912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 74012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(result); 74112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 74212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 74312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 74412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 74512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 74612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBinaryOperation* instr) { 74712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* left = instr->left(); 74812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* right = instr->right(); 749e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(left->representation().IsTagged()); 750e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(right->representation().IsTagged()); 75112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 75212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left_operand = UseFixed(left, a1); 75312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right_operand = UseFixed(right, a0); 75412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LArithmeticT* result = 75512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LArithmeticT(op, context, left_operand, right_operand); 75612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 75712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 75812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 75912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 76012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 761e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_building()); 76212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_block_ = block; 76312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org next_block_ = next_block; 76412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (block->IsStartBlock()) { 76512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org block->UpdateEnvironment(graph_->start_environment()); 76612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org argument_count_ = 0; 76712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (block->predecessors()->length() == 1) { 76812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We have a single predecessor => copy environment and outgoing 76912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // argument count from the predecessor. 770e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(block->phis()->length() == 0); 77112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 77212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* last_environment = pred->last_environment(); 773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_environment != NULL); 77412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Only copy the environment, if it is later used again. 77512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (pred->end()->SecondSuccessor() == NULL) { 776e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->end()->FirstSuccessor() == block); 77712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 77812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 77912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 78012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org last_environment = last_environment->Copy(); 78112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 78212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 78312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org block->UpdateEnvironment(last_environment); 784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->argument_count() >= 0); 78512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org argument_count_ = pred->argument_count(); 78612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 78712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We are at a state join => process phis. 78812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 78912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // No need to copy the environment, it cannot be used later. 79012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* last_environment = pred->last_environment(); 79112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < block->phis()->length(); ++i) { 79212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HPhi* phi = block->phis()->at(i); 79312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (phi->HasMergedIndex()) { 79412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org last_environment->SetValueAt(phi->merged_index(), phi); 79512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 79612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 79712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < block->deleted_phis()->length(); ++i) { 79812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (block->deleted_phis()->at(i) < last_environment->length()) { 79912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org last_environment->SetValueAt(block->deleted_phis()->at(i), 80012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org graph_->GetConstantUndefined()); 80112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 80212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 80312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org block->UpdateEnvironment(last_environment); 80412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Pick up the outgoing argument count of one of the predecessors. 80512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org argument_count_ = pred->argument_count(); 80612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 80712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInstruction* current = block->first(); 80812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int start = chunk_->instructions()->length(); 80912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org while (current != NULL && !is_aborted()) { 81012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Code for constants in registers is generated lazily. 81112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!current->EmitAtUses()) { 81212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org VisitInstruction(current); 81312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 81412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current = current->next(); 81512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 81612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int end = chunk_->instructions()->length() - 1; 81712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (end >= start) { 81812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org block->set_first_instruction_index(start); 81912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org block->set_last_instruction_index(end); 82012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 82112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org block->set_argument_count(argument_count_); 82212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org next_block_ = NULL; 82312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_block_ = NULL; 82412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 82512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 82612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 82712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 82812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInstruction* old_current = current_instruction_; 82912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_instruction_ = current; 83012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 83112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* instr = NULL; 83212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (current->CanReplaceWithDummyUses()) { 83312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (current->OperandCount() == 0) { 83412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = DefineAsRegister(new(zone()) LDummy()); 83512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 836e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!current->OperandAt(0)->IsControlInstruction()); 83712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = DefineAsRegister(new(zone()) 83812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LDummyUse(UseAny(current->OperandAt(0)))); 83912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 84012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 1; i < current->OperandCount(); ++i) { 84112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (current->OperandAt(i)->IsControlInstruction()) continue; 84212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* dummy = 84312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 84412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dummy->set_hydrogen_value(current); 84512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org chunk_->AddInstruction(dummy, current_block_); 84612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 84712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 84812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBasicBlock* successor; 84912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (current->IsControlInstruction() && 85012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 85112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org successor != NULL) { 85212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = new(zone()) LGoto(successor); 85312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 85412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = current->CompileToLithium(this); 85512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 85612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 85712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 85812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org argument_count_ += current->argument_delta(); 859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ >= 0); 86012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 86112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr != NULL) { 86212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org AddInstruction(instr, current); 86312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 86412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 86512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_instruction_ = old_current; 86612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 86712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 86812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 86912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr, 87012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInstruction* hydrogen_val) { 87112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Associate the hydrogen instruction first, since we may need it for 87212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 87312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->set_hydrogen_value(hydrogen_val); 87412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 87512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#if DEBUG 87612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Make sure that the lithium instruction has either no fixed register 87712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // constraints in temps or the result OR no uses that are only used at 87812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // start. If this invariant doesn't hold, the register allocator can decide 87912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // to insert a split of a range immediately before the instruction due to an 88012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // already allocated register needing to be used for the instruction's fixed 88112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // register constraint. In this case, The register allocator won't see an 88212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // interference between the split child and the use-at-start (it would if 88312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // the it was just a plain use), so it is free to move the split child into 88412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // the same register that is used for the use-at-start. 88512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // See https://code.google.com/p/chromium/issues/detail?id=201590 88612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!(instr->ClobbersRegisters() && 88712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->ClobbersDoubleRegisters(isolate()))) { 88812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int fixed = 0; 88912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int used_at_start = 0; 89012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (UseIterator it(instr); !it.Done(); it.Advance()) { 89112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 89212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (operand->IsUsedAtStart()) ++used_at_start; 89312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 89412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->Output() != NULL) { 89512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 89612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 89712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (TempIterator it(instr); !it.Done(); it.Advance()) { 89812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 89912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (operand->HasFixedPolicy()) ++fixed; 90012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 901e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(fixed == 0 || used_at_start == 0); 90212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 90312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif 90412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 90512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 90612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = AssignPointerMap(instr); 90712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 90812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (FLAG_stress_environments && !instr->HasEnvironment()) { 90912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr = AssignEnvironment(instr); 91012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 91112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org chunk_->AddInstruction(instr, current_block_); 91212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 91312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->IsCall()) { 91412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 91512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* instruction_needing_environment = NULL; 91612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (hydrogen_val->HasObservableSideEffects()) { 91712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 91812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instruction_needing_environment = instr; 91912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org sim->ReplayEnvironment(current_block_->last_environment()); 92012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org hydrogen_value_for_lazy_bailout = sim; 92112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 92212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 92312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 92412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org chunk_->AddInstruction(bailout, current_block_); 92512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instruction_needing_environment != NULL) { 92612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Store the lazy deopt environment with the instruction if needed. 92712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Right now it is only used for LInstanceOfKnownGlobal. 92812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instruction_needing_environment-> 92912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 93012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 93112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 93212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 93312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 93412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 93512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 93612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LGoto(instr->FirstSuccessor()); 93712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 93812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 93912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 94012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 94112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* value = instr->value(); 94212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation r = value->representation(); 94312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HType type = value->type(); 94412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ToBooleanStub::Types expected = instr->expected_input_types(); 94512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 94612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 94712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 94812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 94912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 95012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!easy_case && 95112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 95212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !expected.IsGeneric())) { 95312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org branch = AssignEnvironment(branch); 95412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 95512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return branch; 95612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 95712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 95812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 95912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 960e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 96112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 96212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempRegister(); 96312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LCmpMapAndBranch(value, temp); 96412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 96512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 96612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 96712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 96812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsRequiresFrame(); 96912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister( 97012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LArgumentsLength(UseRegister(length->value()))); 97112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 97212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 97312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 97412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 97512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsRequiresFrame(); 97612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LArgumentsElements); 97712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 97812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 97912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 98012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 98112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 98212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstanceOf* result = 98312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LInstanceOf(context, UseFixed(instr->left(), a0), 98412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UseFixed(instr->right(), a1)); 98512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 98612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 98712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 98812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 98912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 99012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInstanceOfKnownGlobal* instr) { 99112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstanceOfKnownGlobal* result = 99212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LInstanceOfKnownGlobal( 99312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UseFixed(instr->context(), cp), 99412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UseFixed(instr->left(), a0), 99512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org FixedTemp(a4)); 99612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 99712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 99812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 99912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 100012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 100112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* receiver = UseRegisterAtStart(instr->receiver()); 100212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 100312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 100412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineAsRegister(result)); 100512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 100612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 100712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 100812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 100912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseFixed(instr->function(), a1); 101012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* receiver = UseFixed(instr->receiver(), a0); 101112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* length = UseFixed(instr->length(), a2); 101212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* elements = UseFixed(instr->elements(), a3); 101312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LApplyArguments* result = new(zone()) LApplyArguments(function, 101412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org receiver, 101512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org length, 101612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org elements); 101712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 101812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 101912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 102012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 102112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 102212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int argc = instr->OperandCount(); 102312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 0; i < argc; ++i) { 102412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* argument = Use(instr->argument(i)); 102512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org AddInstruction(new(zone()) LPushArgument(argument), instr); 102612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 102712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 102812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 102912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 103012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 103112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry( 103212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HStoreCodeEntry* store_code_entry) { 103312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseRegister(store_code_entry->function()); 103412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 103512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LStoreCodeEntry(function, code_object); 103612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 103712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 103812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 103912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject( 104012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HInnerAllocatedObject* instr) { 104112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* base_object = UseRegisterAtStart(instr->base_object()); 104212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 104312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister( 104412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LInnerAllocatedObject(base_object, offset)); 104512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 104612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 104712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 104812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 104912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr->HasNoUses() 105012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? NULL 105112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : DefineAsRegister(new(zone()) LThisFunction); 105212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 105312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 105412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 105512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) { 105612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->HasNoUses()) return NULL; 105712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 105812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (info()->IsStub()) { 105912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineFixed(new(zone()) LContext, cp); 106012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 106112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 106212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LContext); 106312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 106412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 106512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 106612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 106712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 106812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 106912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 107012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 107112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 107212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction( 107312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HCallJSFunction* instr) { 107412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseFixed(instr->function(), a1); 107512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 107612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LCallJSFunction* result = new(zone()) LCallJSFunction(function); 107712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 107812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 107912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 108012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 108112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 108212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor( 108312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HCallWithDescriptor* instr) { 10849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org CallInterfaceDescriptor descriptor = instr->descriptor(); 108512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 108612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 108712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 108812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ops.Add(target, zone()); 108912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (int i = 1; i < instr->OperandCount(); i++) { 10909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* op = 10919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1)); 10929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org ops.Add(op, zone()); 109312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 109412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 109512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 109612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org descriptor, ops, zone()); 109712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 109812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 109912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 110012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 1101e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache( 1102e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org HTailCallThroughMegamorphicCache* instr) { 1103e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1104e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* receiver_register = 1105e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister()); 1106e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* name_register = 1107e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->name(), LoadDescriptor::NameRegister()); 1108e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org // Not marked as call. It can't deoptimize, and it never returns. 1109e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return new (zone()) LTailCallThroughMegamorphicCache( 1110e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org context, receiver_register, name_register); 1111e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 1112e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1113e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 111412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 111512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 111612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseFixed(instr->function(), a1); 111712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 111812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 111912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 112012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 112112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 112212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 112312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->op()) { 1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFloor: 1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFloor(instr); 1126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathRound: 1127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathRound(instr); 1128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFround: 1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFround(instr); 1130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathAbs: 1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathAbs(instr); 1132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathLog: 1133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathLog(instr); 1134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathExp: 1135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathExp(instr); 1136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathSqrt: 1137dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathSqrt(instr); 1138dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathPowHalf: 1139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathPowHalf(instr); 1140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathClz32: 1141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathClz32(instr); 114212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 114312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 114412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 114512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 114612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 114712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 114812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 114912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1150e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1151e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 115212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseFixedDouble(instr->value(), f4); 115312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr); 115412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 115512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 115612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 115712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 115812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 115912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMathClz32* result = new(zone()) LMathClz32(input); 116012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(result); 116112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 116212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 116312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 116412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1165e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 116712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 116812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp1 = TempRegister(); 116912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp2 = TempRegister(); 117012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* double_temp = TempDoubleRegister(); 117112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2); 117212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(result); 117312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 117412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 117512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 117612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 117712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf. 117812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseFixedDouble(instr->value(), f8); 117912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempDoubleRegister(); 118012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); 118112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineFixedDouble(result, f4); 118212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 118312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 118412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 1185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1186dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1187dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LMathFround* result = new (zone()) LMathFround(input); 1188dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DefineAsRegister(result); 1189dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org} 1190dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1191dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 119212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 119312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation r = instr->value()->representation(); 119412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) 119512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? NULL 119612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseFixed(instr->context(), cp); 119712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 119812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 119912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineAsRegister(new(zone()) LMathAbs(context, input)); 120012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 120112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!r.IsDouble()) result = AssignEnvironment(result); 120212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 120312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 120412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 120512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 120612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 120712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 120812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempRegister(); 120912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMathFloor* result = new(zone()) LMathFloor(input, temp); 121012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 121112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 121212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 121312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 121412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 121512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 121612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMathSqrt* result = new(zone()) LMathSqrt(input); 121712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(result); 121812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 121912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 122012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 122112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 122212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 122312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempDoubleRegister(); 122412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMathRound* result = new(zone()) LMathRound(input, temp); 122512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineAsRegister(result)); 122612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 122712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 122812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 122912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 123012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 123112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* constructor = UseFixed(instr->constructor(), a1); 123212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LCallNew* result = new(zone()) LCallNew(context, constructor); 123312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 123412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 123512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 123612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 123712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 123812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 123912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* constructor = UseFixed(instr->constructor(), a1); 124012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 124112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 124212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 124312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 124412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 124512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 124612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 124712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseFixed(instr->function(), a1); 124812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LCallFunction* call = new(zone()) LCallFunction(context, function); 124912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(call, v0), instr); 125012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 125112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 125212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 125312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 125412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 125512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr); 125612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 125712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 125812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 125912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) { 126012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoShift(Token::ROR, instr); 126112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 126212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 126312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 126412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) { 126512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoShift(Token::SHR, instr); 126612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 126712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 126812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 126912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) { 127012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoShift(Token::SAR, instr); 127112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 127212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 127312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 127412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) { 127512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoShift(Token::SHL, instr); 127612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 127712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 127812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 127912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 128012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 128412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 128512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 128612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 128712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LBitI(left, right)); 128812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 128912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(instr->op(), instr); 129012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 129112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 129212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 129312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 129412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1295e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1296e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1297e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 129812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 129912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 130012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 130112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dividend, divisor)); 130212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 130312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 130412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 130512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org divisor != 1 && divisor != -1)) { 130612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 130712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 130812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 130912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 131012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 131112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 131212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1313e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1314e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1315e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 131612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 131712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 131812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( 131912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dividend, divisor)); 132012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (divisor == 0 || 132112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 132212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 132312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 132412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 132512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 132612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 132712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 132812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 132912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1330e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1331e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1332e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 133312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 133412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1335dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) 1336dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org ? NULL : TempRegister(); 133712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 1338dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); 133912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 134012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 134112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && 134212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) || 134312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (!instr->IsMathFloorOfDiv() && 134412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { 134512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 134612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 134712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 134812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 134912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 135012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 135112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 135212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 135312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->RightIsPowerOf2()) { 135412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoDivByPowerOf2I(instr); 135512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->right()->IsConstant()) { 135612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoDivByConstI(instr); 135712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 135812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoDivI(instr); 135912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 136012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->representation().IsDouble()) { 136112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticD(Token::DIV, instr); 136212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 136312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(Token::DIV, instr); 136412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 136512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 136612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 136712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 136812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 136912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 137012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 137112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I( 137212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dividend, divisor)); 137312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 137412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 137512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 137612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 137712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 137812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 137912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 138012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 138112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 138512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 138612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 138712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = 138812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 138912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 139012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org NULL : TempRegister(); 139112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister( 139212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LFlooringDivByConstI(dividend, divisor, temp)); 139312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (divisor == 0 || 139412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 139512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 139612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 139712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 139812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 139912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 140012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 140112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1403e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1404e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 140512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 140612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 140712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor); 140812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineAsRegister(div)); 140912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 141012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 141112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 141212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 141312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->RightIsPowerOf2()) { 141412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoFlooringDivByPowerOf2I(instr); 141512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->right()->IsConstant()) { 141612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoFlooringDivByConstI(instr); 141712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 141812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoFlooringDivI(instr); 141912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 142012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 142112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1424e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1426e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 142712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 142812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 142912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 143012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dividend, divisor)); 1431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1432e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 143312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 143412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 143512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 143612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 143712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 143812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 143912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1440e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1441e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1442e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 144312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 144412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 144512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( 144612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dividend, divisor)); 144712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 144812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 144912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 145012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 145112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 145212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 145312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 145412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1455e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1456e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1457e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 145812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 145912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 146012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModI( 146112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org dividend, divisor)); 146212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 146312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 146412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 146512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 146612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 146712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 146812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 146912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 147012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) { 147112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 147212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr); 147312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->representation().IsDouble()) { 147412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticD(Token::MOD, instr); 147512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 147612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(Token::MOD, instr); 147712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 147812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 147912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 148012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 148112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) { 148212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1483e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1484e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 148512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* left = instr->BetterLeftOperand(); 148612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* right = instr->BetterRightOperand(); 148712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left_op; 148812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right_op; 148912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 149012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero); 149112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 149212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (right->IsConstant()) { 149312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HConstant* constant = HConstant::cast(right); 149412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t constant_value = constant->Integer32Value(); 149512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Constants -1, 0 and 1 can be optimized if the result can overflow. 149612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // For other constants, it can be optimized only without overflow. 149712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) { 149812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left_op = UseRegisterAtStart(left); 149912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right_op = UseConstant(right); 150012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 150112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (bailout_on_minus_zero) { 150212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left_op = UseRegister(left); 150312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 150412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left_op = UseRegisterAtStart(left); 150512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 150612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right_op = UseRegister(right); 150712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 150812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 150912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (bailout_on_minus_zero) { 151012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left_op = UseRegister(left); 151112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 151212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left_op = UseRegisterAtStart(left); 151312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 151412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right_op = UseRegister(right); 151512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 151612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LMulI* mul = new(zone()) LMulI(left_op, right_op); 151712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (can_overflow || bailout_on_minus_zero) { 151812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org AssignEnvironment(mul); 151912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 152012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(mul); 152112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 152212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->representation().IsDouble()) { 152312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kArchVariant == kMips64r2) { 152412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->HasOneUse() && instr->uses().value()->IsAdd()) { 152512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HAdd* add = HAdd::cast(instr->uses().value()); 152612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr == add->left()) { 152712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // This mul is the lhs of an add. The add and mul will be folded 152812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // into a multiply-add. 152912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 153012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 153112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr == add->right() && !add->left()->IsMul()) { 153212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // This mul is the rhs of an add, where the lhs is not another mul. 153312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // The add and mul will be folded into a multiply-add. 153412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 153512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 153612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 153712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 153812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticD(Token::MUL, instr); 153912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 154012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(Token::MUL, instr); 154112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 154212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 154312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 154412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 154512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) { 154612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1547e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1548e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 154912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 155012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 155112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LSubI* sub = new(zone()) LSubI(left, right); 155212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(sub); 155312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 155412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 155512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 155612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 155712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->representation().IsDouble()) { 155812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticD(Token::SUB, instr); 155912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 156012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(Token::SUB, instr); 156112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 156212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 156312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 156412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 156512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { 156612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* multiplier_op = UseRegisterAtStart(mul->left()); 156712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); 156812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* addend_op = UseRegisterAtStart(addend); 156912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, 157012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org multiplicand_op)); 157112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 157212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 157312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 157412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 157512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1576e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1577e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 157812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 157912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 158012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LAddI* add = new(zone()) LAddI(left, right); 158112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(add); 158212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 158312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 158412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 158512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 158612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->representation().IsExternal()) { 1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsExternal()); 1588e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsInteger32()); 1589e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 159012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 159112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 159212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LAddI* add = new(zone()) LAddI(left, right); 159312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(add); 159412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 159512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->representation().IsDouble()) { 159612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kArchVariant == kMips64r2) { 159712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->left()->IsMul()) 159812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); 159912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 160012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->right()->IsMul()) { 1601e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->left()->IsMul()); 160212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); 160312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 160412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 160512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticD(Token::ADD, instr); 160612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 160712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DoArithmeticT(Token::ADD, instr); 160812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 160912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 161012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 161112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 161212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 161312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = NULL; 161412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = NULL; 161512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1617e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 161812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 161912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right = UseOrConstantAtStart(instr->BetterRightOperand()); 162012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 1621e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1622e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1623e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 162412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org left = UseRegisterAtStart(instr->left()); 162512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org right = UseRegisterAtStart(instr->right()); 162612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 162712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LMathMinMax(left, right)); 162812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 162912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 163012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 163112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1632e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 163312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We call a C function for double power. It can't trigger a GC. 163412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We need to use fixed result register for the call. 163512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation exponent_type = instr->right()->representation(); 1636e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 163712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseFixedDouble(instr->left(), f2); 16386313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org LOperand* right = 16396313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org exponent_type.IsDouble() 16406313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org ? UseFixedDouble(instr->right(), f4) 16416313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 164212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LPower* result = new(zone()) LPower(left, right); 164312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixedDouble(result, f0), 164412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr, 164512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org CAN_DEOPTIMIZE_EAGERLY); 164612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 164712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 164812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 164912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1650e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 165212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 165312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseFixed(instr->left(), a1); 165412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseFixed(instr->right(), a0); 165512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LCmpT* result = new(zone()) LCmpT(context, left, right); 165612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 165712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 165812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 165912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 166012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 166112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HCompareNumericAndBranch* instr) { 166212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation r = instr->representation(); 166312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (r.IsSmiOrInteger32()) { 1664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(r)); 1665e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(r)); 166612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 166712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 166812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 166912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 1670e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(r.IsDouble()); 1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1672e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 167312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 167412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 167512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 167612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 167712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 167812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 167912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 168012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 168112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HCompareObjectEqAndBranch* instr) { 168212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 168312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 168412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LCmpObjectEqAndBranch(left, right); 168512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 168612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 168712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 168812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 168912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HCompareHoleAndBranch* instr) { 169012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 169112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LCmpHoleAndBranch(value); 169212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 169312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 169412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 169512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 169612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HCompareMinusZeroAndBranch* instr) { 169712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(instr->value()); 169812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* scratch = TempRegister(); 169912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 170012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 170112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 170212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 170312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1704e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 170512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempRegister(); 170612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()), 170712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org temp); 170812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 170912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 171012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 171112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1712e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 171312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempRegister(); 171412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()), 171512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org temp); 171612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 171712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 171812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 171912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 172112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LIsSmiAndBranch(Use(instr->value())); 172212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 172312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 172412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 172512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 172612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HIsUndetectableAndBranch* instr) { 1727e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 172812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LIsUndetectableAndBranch( 172912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UseRegisterAtStart(instr->value()), TempRegister()); 173012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 173112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 173212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 173312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringCompareAndBranch( 173412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HStringCompareAndBranch* instr) { 1735e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1736e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 173712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 173812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseFixed(instr->left(), a1); 173912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseFixed(instr->right(), a0); 174012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LStringCompareAndBranch* result = 174112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LStringCompareAndBranch(context, left, right); 174212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(result, instr); 174312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 174412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 174512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 174612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 174712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HHasInstanceTypeAndBranch* instr) { 1748e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 174912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 175012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LHasInstanceTypeAndBranch(value); 175112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 175212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 175312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 175412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 175512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HGetCachedArrayIndex* instr) { 1756e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 175712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 175812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 175912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 176012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 176112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 176212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 176312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 176412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HHasCachedArrayIndexAndBranch* instr) { 1765e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 176612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LHasCachedArrayIndexAndBranch( 176712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UseRegisterAtStart(instr->value())); 176812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 176912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 177012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 177112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 177212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HClassOfTestAndBranch* instr) { 1773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 177412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()), 177512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TempRegister()); 177612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 177712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 177812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 177912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 178012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* map = UseRegisterAtStart(instr->value()); 178112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LMapEnumLength(map)); 178212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 178312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 178412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 178512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 178612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseFixed(instr->value(), a0); 178712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LDateField* result = 178812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LDateField(object, FixedTemp(a1), instr->index()); 178912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 179012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 179112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 179212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 179312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 179412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 179512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 179612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 179712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 179812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 179912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 180012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 180112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 180212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* index = FLAG_debug_code 180312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? UseRegisterAtStart(instr->index()) 180412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseRegisterOrConstantAtStart(instr->index()); 180512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 180612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL; 180712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LSeqStringSetChar(context, string, index, value); 180812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 180912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 181012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 181112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 181212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!FLAG_debug_code && instr->skip_check()) return NULL; 181312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 181412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* length = !index->IsConstantOperand() 181512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? UseRegisterOrConstantAtStart(instr->length()) 181612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseRegisterAtStart(instr->length()); 181712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = new(zone()) LBoundsCheck(index, length); 181812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!FLAG_debug_code || !instr->skip_check()) { 181912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 182012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 182112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgreturn result; 182212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 182312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 182412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 182512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 182612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HBoundsCheckBaseIndexInformation* instr) { 182712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 182812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 182912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 183012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 183112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 183212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 183312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // The control instruction marking the end of a block that completed 183412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // abruptly (e.g., threw an exception). There is nothing specific to do. 183512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 183612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 183712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 183812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 183912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 184012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 184112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 184212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 184312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 184412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 184512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // All HForceRepresentation instructions should be eliminated in the 184612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // representation change phase of Hydrogen. 184712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 184812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 184912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 185012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 185112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 185212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) { 185312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation from = instr->from(); 185412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation to = instr->to(); 185512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* val = instr->value(); 185612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (from.IsSmi()) { 185712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (to.IsTagged()) { 185812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 185912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 186012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 186112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org from = Representation::Tagged(); 186212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 186312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (from.IsTagged()) { 186412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (to.IsDouble()) { 186512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 186612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 186712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 186812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 186912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (to.IsSmi()) { 187012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 187112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val->type().IsSmi()) { 187212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 187312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 187412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 187512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 1876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 187712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val->type().IsSmi() || val->representation().IsSmi()) { 187812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 187912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 188012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 188112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 188212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp1 = TempRegister(); 188312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp2 = TempDoubleRegister(); 188412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 188512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); 188612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 188712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 188812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 188912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 189012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (from.IsDouble()) { 189112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (to.IsTagged()) { 189212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsDeferredCalling(); 189312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 189412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp1 = TempRegister(); 189512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp2 = TempRegister(); 189612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 189712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LUnallocated* result_temp = TempRegister(); 189812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 189912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignPointerMap(Define(result, result_temp)); 190012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (to.IsSmi()) { 190112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 190212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment( 190312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineAsRegister(new(zone()) LDoubleToSmi(value))); 190412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 1905e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 190612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 190712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 190812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 190912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 191012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 191112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (from.IsInteger32()) { 191212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsDeferredCalling(); 191312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (to.IsTagged()) { 191412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 191512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 191612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp1 = TempRegister(); 191712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp2 = TempRegister(); 191812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 191912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 192012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 192112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org STATIC_ASSERT((kMinInt == Smi::kMinValue) && 192212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (kMaxInt == Smi::kMaxValue)); 192312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 192412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiTag(value)); 192512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 192612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (to.IsSmi()) { 192712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(val); 192812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 192912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 193012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 193112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 193212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 193312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 1934e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsDouble()); 193512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 193612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 193712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 193812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val))); 193912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 194012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 194112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 194212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 194312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 194412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 194512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 194612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 194712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 194812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 194912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = new(zone()) LCheckNonSmi(value); 195012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!instr->value()->type().IsHeapObject()) { 195112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 195212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 195312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 195412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 195512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 195612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 195712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 195812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 195912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(new(zone()) LCheckSmi(value)); 196012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 196112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 196212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 196312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 196412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 196512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = new(zone()) LCheckInstanceType(value); 196612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(result); 196712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 196812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 196912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 197012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 197112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 197212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(new(zone()) LCheckValue(value)); 197312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 197412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 197512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 197612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 197712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 197812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 197912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 198012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->HasMigrationTarget()) { 198112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsDeferredCalling(); 198212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignPointerMap(result); 198312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 198412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 198512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 198612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 198712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 198812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 198912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* value = instr->value(); 199012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation input_rep = value->representation(); 199112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* reg = UseRegister(value); 199212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (input_rep.IsDouble()) { 199312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Revisit this decision, here and 8 lines below. 199412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LClampDToUint8(reg, 199512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org TempDoubleRegister())); 199612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (input_rep.IsInteger32()) { 199712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 199812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 1999e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(input_rep.IsSmiOrTagged()); 200012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LClampTToUint8* result = 200112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LClampTToUint8(reg, TempDoubleRegister()); 200212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineAsRegister(result)); 200312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 200412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 200512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 200612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 200712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 200812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HValue* value = instr->value(); 2009e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value->representation().IsDouble()); 201012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 201112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 201212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 201312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 201412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 201512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* lo = UseRegister(instr->lo()); 201612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* hi = UseRegister(instr->hi()); 201712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 201812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 201912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 202012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 202112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 202212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = info()->IsStub() 202312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? UseFixed(instr->context(), cp) 202412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : NULL; 202512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 202612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LReturn(UseFixed(instr->value(), v0), context, 202712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org parameter_count); 202812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 202912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 203012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 203112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 203212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Representation r = instr->representation(); 203312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (r.IsSmi()) { 203412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LConstantS); 203512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (r.IsInteger32()) { 203612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LConstantI); 203712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (r.IsDouble()) { 203812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LConstantD); 203912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (r.IsExternal()) { 204012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LConstantE); 204112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (r.IsTagged()) { 204212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LConstantT); 204312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 204412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 204512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 204612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 204712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 204812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 204912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 205012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 205112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 205212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr->RequiresHoleCheck() 205312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 205412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : DefineAsRegister(result); 205512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 205612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 205712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 205812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 205912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2060fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* global_object = 20619aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 20629d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 20639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 20649aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 20659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 206612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LLoadGlobalGeneric* result = 20679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org new(zone()) LLoadGlobalGeneric(context, global_object, vector); 206812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 206912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 207012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 207112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 207212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 207312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegister(instr->value()); 207412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Use a temp to check the value in the cell in the case where we perform 207512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // a hole check. 207612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return instr->RequiresHoleCheck() 207712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 207812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : new(zone()) LStoreGlobalCell(value, NULL); 207912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 208012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 208112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 208212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 208312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->value()); 208412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 208512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineAsRegister(new(zone()) LLoadContextSlot(context)); 208612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 208712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 208812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 208912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 209012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 209112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 209212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 209312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 209412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context; 209512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value; 209612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->NeedsWriteBarrier()) { 209712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org context = UseTempRegister(instr->context()); 209812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value = UseTempRegister(instr->value()); 209912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 210012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org context = UseRegister(instr->context()); 210112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org value = UseRegister(instr->value()); 210212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 210312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = new(zone()) LStoreContextSlot(context, value); 210412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 210512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 210612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 210712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 210812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 210912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 211012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 211112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 211212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* obj = UseRegisterAtStart(instr->object()); 211312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 211412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 211512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 211612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 211712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 211812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2119fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 21209aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 21219d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21229d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21239aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 21259d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 212612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 21279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), v0); 212812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(result, instr); 212912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 213012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 213112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 213212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 213312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HLoadFunctionPrototype* instr) { 213412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineAsRegister( 213512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 213612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 213712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 213812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 213912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 214012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LLoadRoot); 214112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 214212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 214312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 214412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2145e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsSmiOrInteger32()); 214612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ElementsKind elements_kind = instr->elements_kind(); 214712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 214812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = NULL; 214912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 215012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!instr->is_typed_elements()) { 215112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* obj = NULL; 215212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->representation().IsDouble()) { 215312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org obj = UseRegister(instr->elements()); 215412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 2155e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrTagged() || 215612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->representation().IsInteger32()); 215712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org obj = UseRegisterAtStart(instr->elements()); 215812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 215912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); 216012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 2161e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 216212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->representation().IsInteger32() && 216312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !IsDoubleOrFloatElementsKind(elements_kind)) || 216412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->representation().IsDouble() && 216512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org IsDoubleOrFloatElementsKind(elements_kind))); 216612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 216712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key)); 216812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 216912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 217012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if ((instr->is_external() || instr->is_fixed_typed_array()) ? 217112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // see LCodeGen::DoLoadKeyedExternalArray 217212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ((elements_kind == EXTERNAL_UINT32_ELEMENTS || 217312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org elements_kind == UINT32_ELEMENTS) && 217412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !instr->CheckFlag(HInstruction::kUint32)) : 217512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // see LCodeGen::DoLoadKeyedFixedDoubleArray and 217612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // LCodeGen::DoLoadKeyedFixedArray 217712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->RequiresHoleCheck()) { 217812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org result = AssignEnvironment(result); 217912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 218012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 218112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 218212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 218312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 218412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 218512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2186fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 21879aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 21889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 21899d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21929d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 219312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 219412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = 21959d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), 21969d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org v0); 219712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(result, instr); 219812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 219912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 220012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 220112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 220212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (!instr->is_typed_elements()) { 2203e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->elements()->representation().IsTagged()); 220412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 220512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = NULL; 220612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* val = NULL; 220712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* key = NULL; 220812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 220912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->value()->representation().IsDouble()) { 221012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object = UseRegisterAtStart(instr->elements()); 221112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 221212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = UseRegister(instr->value()); 221312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 2214e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsSmiOrTagged() || 221512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->value()->representation().IsInteger32()); 221612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (needs_write_barrier) { 221712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object = UseTempRegister(instr->elements()); 221812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = UseTempRegister(instr->value()); 221912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org key = UseTempRegister(instr->key()); 222012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 222112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org object = UseRegisterAtStart(instr->elements()); 222212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = UseRegisterAtStart(instr->value()); 222312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 222412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 222512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 222612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 222712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LStoreKeyed(object, key, val); 222812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 222912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 2230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 223112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->value()->representation().IsInteger32() && 223212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 223312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->value()->representation().IsDouble() && 223412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org IsDoubleOrFloatElementsKind(instr->elements_kind()))); 2235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->is_fixed_typed_array() && 223612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->elements()->representation().IsTagged()) || 223712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (instr->is_external() && 223812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->elements()->representation().IsExternal())); 223912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* val = UseRegister(instr->value()); 224012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 224112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 224212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LStoreKeyed(backing_store, key, val); 224312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 224412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 224512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 224612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 224712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2248fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* obj = 22499aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 22509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 22519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 225212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 2253e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->object()->representation().IsTagged()); 2254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsTagged()); 2255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 225612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 225712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall( 225812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr); 225912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 226012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 226112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 226212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTransitionElementsKind( 226312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HTransitionElementsKind* instr) { 226412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 226512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseRegister(instr->object()); 226612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* new_map_reg = TempRegister(); 226712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTransitionElementsKind* result = 226812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); 226912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return result; 227012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 227112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseFixed(instr->object(), a0); 227212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 227312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTransitionElementsKind* result = 227412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LTransitionElementsKind(object, context, NULL); 227512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(result, instr); 227612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 227712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 227812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 227912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 228012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento( 228112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HTrapAllocationMemento* instr) { 228212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseRegister(instr->object()); 228312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = TempRegister(); 228412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTrapAllocationMemento* result = 228512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LTrapAllocationMemento(object, temp); 228612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(result); 228712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 228812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 228912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 229012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 229112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool is_in_object = instr->access().IsInobject(); 229212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 229312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org bool needs_write_barrier_for_map = instr->has_transition() && 229412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->NeedsWriteBarrierForMap(); 229512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 229612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* obj; 229712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (needs_write_barrier) { 229812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org obj = is_in_object 229912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? UseRegister(instr->object()) 230012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseTempRegister(instr->object()); 230112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 230212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org obj = needs_write_barrier_for_map 230312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ? UseRegister(instr->object()) 230412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : UseRegisterAtStart(instr->object()); 230512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 230612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 230712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* val; 2308d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org if (needs_write_barrier) { 230912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = UseTempRegister(instr->value()); 231012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (instr->field_representation().IsDouble()) { 231112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = UseRegisterAtStart(instr->value()); 231212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 231312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org val = UseRegister(instr->value()); 231412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 231512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 231612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // We need a temporary register for write barrier of the map field. 231712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL; 231812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 231912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LStoreNamedField(obj, val, temp); 232012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 232112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 232212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 232312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 232412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2325fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* obj = 23269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 23279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 232812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 232912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); 233012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(result, instr); 233112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 233212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 233312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 233412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 233512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 233612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* left = UseFixed(instr->left(), a1); 233712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* right = UseFixed(instr->right(), a0); 233812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall( 233912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineFixed(new(zone()) LStringAdd(context, left, right), v0), 234012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr); 234112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 234212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 234312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 234412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 234512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* string = UseTempRegister(instr->string()); 234612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* index = UseTempRegister(instr->index()); 234712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseAny(instr->context()); 234812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LStringCharCodeAt* result = 234912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LStringCharCodeAt(context, string, index); 235012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 235112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 235212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 235312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 235412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 235512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* char_code = UseRegister(instr->value()); 235612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseAny(instr->context()); 235712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LStringCharFromCode* result = 235812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LStringCharFromCode(context, char_code); 235912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 236012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 236112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 236212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 236312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 236412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsDeferredCalling(); 236512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseAny(instr->context()); 236612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* size = UseRegisterOrConstant(instr->size()); 236712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp1 = TempRegister(); 236812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* temp2 = TempRegister(); 236912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); 237012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 237112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 237212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 237312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 237412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 237512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 237612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall( 237712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineFixed(new(zone()) LRegExpLiteral(context), v0), instr); 237812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 237912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 238012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 238112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 238212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 238312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall( 238412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DefineFixed(new(zone()) LFunctionLiteral(context), v0), instr); 238512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 238612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 238712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 238812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2389e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ == 0); 239012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org allocator_->MarkAsOsrEntry(); 239112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_block_->last_environment()->set_ast_id(instr->ast_id()); 239212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(new(zone()) LOsrEntry); 239312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 239412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 239512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 239612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 239712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LParameter* result = new(zone()) LParameter; 239812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->kind() == HParameter::STACK_PARAMETER) { 239912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int spill_index = chunk()->GetParameterStackSlot(instr->index()); 240012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsSpilled(result, spill_index); 240112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 2402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->IsStub()); 2403e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallInterfaceDescriptor descriptor = 2404e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org info()->code_stub()->GetCallInterfaceDescriptor(); 240512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int index = static_cast<int>(instr->index()); 240642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org Register reg = descriptor.GetEnvironmentParameterRegister(index); 240712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineFixed(result, reg); 240812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 240912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 241012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 241112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 241212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 241312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Use an index that corresponds to the location in the unoptimized frame, 241412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // which the optimized frame will subsume. 241512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int env_index = instr->index(); 241612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int spill_index = 0; 241712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->environment()->is_parameter_index(env_index)) { 241812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org spill_index = chunk()->GetParameterStackSlot(env_index); 241912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 242012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org spill_index = env_index - instr->environment()->first_local_index(); 242112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2422b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Retry(kTooManySpillSlotsNeededForOSR); 242312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org spill_index = 0; 242412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 242512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 242612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 242712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 242812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 242912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 243012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 243112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 243212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), v0), instr); 243312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 243412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 243512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 243612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 243712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // There are no real uses of the arguments object. 243812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // arguments.length and element access are supported directly on 243912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // stack arguments, and any real arguments object use causes a bailout. 244012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // So this value is never used. 244112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 244212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 244312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 244412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 244512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 244612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 244712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 244812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // There are no real uses of a captured object. 244912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 245012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 245112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 245212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 245312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 245412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org info()->MarkAsRequiresFrame(); 245512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* args = UseRegister(instr->arguments()); 245612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* length = UseRegisterOrConstantAtStart(instr->length()); 245712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 245812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 245912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 246012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 246112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 246212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 246312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseFixed(instr->value(), a0); 246412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LToFastProperties* result = new(zone()) LToFastProperties(object); 246512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 246612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 246712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 246812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 246912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 247012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 247112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0)); 247212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 247312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 247412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 247512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 247612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 247712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 247812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 247912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 248012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 248112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 248212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HIsConstructCallAndBranch* instr) { 248312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LIsConstructCallAndBranch(TempRegister()); 248412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 248512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 248612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 248712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 248812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 248912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 249012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 249112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 249212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 249312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 249412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->is_function_entry()) { 249512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 249612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(new(zone()) LStackCheck(context), instr); 249712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 2498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->is_backwards_branch()); 249912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseAny(instr->context()); 250012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment( 250112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org AssignPointerMap(new(zone()) LStackCheck(context))); 250212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 250312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 250412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 250512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 250612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 250712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* outer = current_block_->last_environment(); 250812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org outer->set_ast_id(instr->ReturnId()); 250912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HConstant* undefined = graph()->GetConstantUndefined(); 251012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* inner = outer->CopyForInlining(instr->closure(), 251112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->arguments_count(), 251212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->function(), 251312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org undefined, 251412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->inlining_kind()); 251512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Only replay binding of arguments object if it wasn't removed from graph. 251612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 251712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inner->Bind(instr->arguments_var(), instr->arguments_object()); 251812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 2519ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org inner->BindContext(instr->closure_context()); 252012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org inner->set_entry(instr); 252112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_block_->UpdateEnvironment(inner); 252212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org chunk_->AddInlinedClosure(instr->closure()); 252312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NULL; 252412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 252512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 252612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 252712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 252812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* pop = NULL; 252912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 253012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* env = current_block_->last_environment(); 253112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 253212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (env->entry()->arguments_pushed()) { 253312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int argument_count = env->arguments_environment()->parameter_count(); 253412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org pop = new(zone()) LDrop(argument_count); 2535e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->argument_delta() == -argument_count); 253612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 253712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 253812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HEnvironment* outer = current_block_->last_environment()-> 253912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DiscardInlined(false); 254012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org current_block_->UpdateEnvironment(outer); 254112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 254212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return pop; 254312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 254412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 254512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 254612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 254712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 254812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseFixed(instr->enumerable(), a0); 254912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 255012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 255112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 255212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 255312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 255412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 255512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* map = UseRegister(instr->map()); 255612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); 255712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 255812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 255912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 256012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 256112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 256212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* map = UseRegisterAtStart(instr->map()); 256312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 256412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 256512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 256612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 256712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 256812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* object = UseRegister(instr->object()); 256912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* index = UseTempRegister(instr->index()); 257012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 257112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LInstruction* result = DefineSameAsFirst(load); 257212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return AssignPointerMap(result); 257312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 257412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 257512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 257612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 257712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->context()); 257812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return new(zone()) LStoreFrameContext(context); 257912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 258012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 258112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 258212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext( 258312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org HAllocateBlockContext* instr) { 258412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 258512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 258612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org LAllocateBlockContext* result = 258712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org new(zone()) LAllocateBlockContext(context, function); 258812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return MarkAsCall(DefineFixed(result, cp), instr); 258912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 259012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 259112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 259212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} } // namespace v8::internal 25937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 25947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif // V8_TARGET_ARCH_MIPS64 2595