1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm/lithium-codegen-arm.h" 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-osr.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h" 10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 { 12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal { 13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DEFINE_COMPILE(type) \ 15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void L##type::CompileToNative(LCodeGen* generator) { \ 16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org generator->Do##type(this); \ 17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DEFINE_COMPILE 20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG 2283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LInstruction::VerifyCall() { 23160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Call instructions can use only fixed registers as temporaries and 24160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // outputs because all registers are blocked by the calling convention. 25160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Inputs operands must use a fixed register or use-at-start policy or 26160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // a non-register policy. 27e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Output() == NULL || 2883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LUnallocated::cast(Output())->HasFixedPolicy() || 2983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org !LUnallocated::cast(Output())->HasRegisterPolicy()); 30e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (UseIterator it(this); !it.Done(); it.Advance()) { 31e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 32e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() || 33160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org operand->IsUsedAtStart()); 3483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 35e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (TempIterator it(this); !it.Done(); it.Advance()) { 36e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 37e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 3883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 3983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 4083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif 4183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 430a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) { 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("%s ", this->Mnemonic()); 4583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 4683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org PrintOutputOperandTo(stream); 470a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org PrintDataTo(stream); 49a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (HasEnvironment()) { 51a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" "); 52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org environment()->PrintTo(stream); 53a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 54a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 55a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (HasPointerMap()) { 56a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" "); 57a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pointer_map()->PrintTo(stream); 58a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6288d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) { 630a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org stream->Add("= "); 6488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org for (int i = 0; i < InputCount(); i++) { 656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (i > 0) stream->Add(" "); 664cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (InputAt(i) == NULL) { 674cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org stream->Add("NULL"); 684cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } else { 694cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org InputAt(i)->PrintTo(stream); 704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 716d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 720a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 7588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 7688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org if (HasResult()) result()->PrintTo(stream); 770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 780a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 790a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 800a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) { 81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LGap::PrintDataTo(stream); 82a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LLabel* rep = replacement(); 83a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (rep != NULL) { 84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" Dead block replaced with B%d", rep->block_id()); 85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 86a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 87a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 88a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 89a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool LGap::IsRedundant() const { 90a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < 4; i++) { 91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return false; 93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return true; 97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) { 101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < 4; i++) { 102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("("); 103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (parallel_moves_[i] != NULL) { 104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org parallel_moves_[i]->PrintDataTo(stream); 105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") "); 107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticD::Mnemonic() const { 112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org switch (op()) { 113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::ADD: return "add-d"; 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::SUB: return "sub-d"; 115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MUL: return "mul-d"; 116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::DIV: return "div-d"; 117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MOD: return "mod-d"; 118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org default: 119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticT::Mnemonic() const { 126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org switch (op()) { 127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::ADD: return "add-t"; 128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::SUB: return "sub-t"; 129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MUL: return "mul-t"; 130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MOD: return "mod-t"; 131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::DIV: return "div-t"; 13283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::BIT_AND: return "bit-and-t"; 13383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::BIT_OR: return "bit-or-t"; 13483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::BIT_XOR: return "bit-xor-t"; 135e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org case Token::ROR: return "ror-t"; 136496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org case Token::SHL: return "shl-t"; 137496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org case Token::SAR: return "sar-t"; 138496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org case Token::SHR: return "shr-t"; 139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org default: 140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 14632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const { 14732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return !gen->IsNextEmittedBlock(block_id()); 14832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 14932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 15032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 1510a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) { 152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("B%d", block_id()); 153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1560a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) { 157a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 15833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 162e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if "); 16433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org left()->PrintTo(stream); 165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" %s ", Token::String(op())); 16633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org right()->PrintTo(stream); 167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 1725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org stream->Add("if is_object("); 17333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 1745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 1765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1780ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1790ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add("if is_string("); 18033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 1810ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1820ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 1830ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 1840ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 1850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 186a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if is_smi("); 18733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 1937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stream->Add("if is_undetectable("); 19433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 1957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 1977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1990ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2000ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add("if string_compare("); 20133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org left()->PrintTo(stream); 20233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org right()->PrintTo(stream); 2030ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 2050ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 2060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 2070a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if has_instance_type("); 20933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2140a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if has_cached_array_index("); 21633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 217a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 218a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 219a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 220a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2210a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 222a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if class_of_test("); 22333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 224a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(", \"%o\") then B%d else B%d", 225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org *hydrogen()->class_name(), 226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org true_block_id(), 227a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org false_block_id()); 228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if typeof "); 23333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 234a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" == \"%s\" then B%d else B%d", 235afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org hydrogen()->type_literal()->ToCString().get(), 236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org true_block_id(), false_block_id()); 237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 238a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 239a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 240662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 241662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(" = "); 242662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org function()->PrintTo(stream); 243662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(".code_entry = "); 244662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org code_object()->PrintTo(stream); 245662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 246662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 247662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 2482bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 2492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org stream->Add(" = "); 2502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org base_object()->PrintTo(stream); 251ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org stream->Add(" + "); 252ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org offset()->PrintTo(stream); 2532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 2542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 2552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 25626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 25726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("= "); 25826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org function()->PrintTo(stream); 25926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("#%d / ", arity()); 26026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 26126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 26226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 26326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 26426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 0; i < InputCount(); i++) { 26526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org InputAt(i)->PrintTo(stream); 26626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add(" "); 26726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 268a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("#%d / ", arity()); 269a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 271a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 272c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 27333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org context()->PrintTo(stream); 27483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org stream->Add("[%d]", slot_index()); 27583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 27683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 27783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 27883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 27933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org context()->PrintTo(stream); 28083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org stream->Add("[%d] <- ", slot_index()); 28133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org value()->PrintTo(stream); 282c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 284c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 285160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 286160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add("= "); 28733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org function()->PrintTo(stream); 288160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add(" #%d / ", arity()); 289160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 290160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 291160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2920a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) { 2930a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org stream->Add("= "); 29433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org constructor()->PrintTo(stream); 295a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" #%d / ", arity()); 296a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 297a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 298a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) { 3004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add("= "); 3014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org constructor()->PrintTo(stream); 3024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" #%d / ", arity()); 3031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind = hydrogen()->elements_kind(); 3044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" (%s) ", ElementsKindToString(kind)); 3054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 3064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 3074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 3080a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 309a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org arguments()->PrintTo(stream); 310a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" length "); 311a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org length()->PrintTo(stream); 312a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" index "); 313a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org index()->PrintTo(stream); 314a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 3180a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org object()->PrintTo(stream); 319f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 320f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << hydrogen()->access() << " <- "; 321f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org stream->Add(os.c_str()); 3220a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org value()->PrintTo(stream); 3230a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 3240a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 3250a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 3263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 3273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object()->PrintTo(stream); 3283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add("."); 329afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org stream->Add(String::cast(*name())->ToCString().get()); 3303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add(" <- "); 3313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org value()->PrintTo(stream); 3323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 3333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3358e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 3368e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org elements()->PrintTo(stream); 3378e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("["); 3388e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org key()->PrintTo(stream); 3398e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 340fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d]", base_offset()); 3418e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("]"); 3438e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 3448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 3458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 3468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 347e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 348717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org elements()->PrintTo(stream); 349717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org stream->Add("["); 350717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org key()->PrintTo(stream); 3518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 352fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d] <-", base_offset()); 3538e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("] <- "); 3558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 356d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 357d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (value() == NULL) { 358e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hydrogen()->IsConstantHoleStore() && 359d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org hydrogen()->value()->representation().IsDouble()); 360d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org stream->Add("<the hole(nan)>"); 361d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } else { 362d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org value()->PrintTo(stream); 363d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } 364717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org} 365717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 366717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 3673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 3680a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org object()->PrintTo(stream); 3690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org stream->Add("["); 3700a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org key()->PrintTo(stream); 3710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org stream->Add("] <- "); 3720a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org value()->PrintTo(stream); 3730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 3740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 3750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 376394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 377394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com object()->PrintTo(stream); 378394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 379394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 380394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 381394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 382c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Skip a slot if for a double-width slot. 384c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) spill_slot_count_++; 385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return spill_slot_count_++; 386a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 387a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 388a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 389c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 390c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org int index = GetNextSpillIndex(kind); 391c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) { 3927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LDoubleStackSlot::Create(index, zone()); 393a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 394e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kind == GENERAL_REGISTERS); 3957028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LStackSlot::Create(index, zone()); 396a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 40028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() { 401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_unused()); 40228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org chunk_ = new(zone()) LPlatformChunk(info(), graph()); 4031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LPhase phase("L_Building chunk", chunk_); 404a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org status_ = BUILDING; 405c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 406c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // If compiling for OSR, reserve space for the unoptimized frame, 407c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which will be subsumed into this frame. 408c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (graph()->has_osr()) { 409c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 410c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 411c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 412c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 413c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 414a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 415a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < blocks->length(); i++) { 416a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBasicBlock* next = NULL; 417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (i < blocks->length() - 1) next = blocks->at(i + 1); 418a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DoBasicBlock(blocks->at(i), next); 419a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (is_aborted()) return NULL; 420a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 421a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org status_ = DONE; 422a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return chunk_; 423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 424a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 425a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 426a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 427812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 428812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Register::ToAllocationIndex(reg)); 429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 433812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 434812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DoubleRegister::ToAllocationIndex(reg)); 435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Use(value, ToUnallocated(fixed_register)); 440a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) { 444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Use(value, ToUnallocated(reg)); 445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) { 449812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 451a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Use(value, 455812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 456812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LUnallocated::USED_AT_START)); 457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 461812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) { 466812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) { 471812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 472812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LUnallocated::USED_AT_START)); 473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return value->IsConstant() 478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : Use(value); 480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return value->IsConstant() 485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : UseAtStart(value); 487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return value->IsConstant() 492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : UseRegister(value); 494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return value->IsConstant() 499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : UseRegisterAtStart(value); 501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 504f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) { 505f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return chunk_->DefineConstantOperand(HConstant::cast(value)); 506f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 507f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 508f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 5090511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comLOperand* LChunkBuilder::UseAny(HValue* value) { 5100511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return value->IsConstant() 5110511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com ? chunk_->DefineConstantOperand(HConstant::cast(value)) 512812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 5130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 5140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 5150511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 516a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (value->EmitAtUses()) { 518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* instr = HInstruction::cast(value); 519a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org VisitInstruction(instr); 520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 521994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org operand->set_virtual_register(value->id()); 522a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 523a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 52626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 5270a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org LUnallocated* result) { 528994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org result->set_virtual_register(current_instruction_->id()); 5290a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org instr->set_result(result); 5300a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org return instr; 5310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 5320a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 5330a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 5340a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister( 53526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 536812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 537812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5410a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled( 54226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, int index) { 543812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 544812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5480a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst( 54926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5550a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineFixed( 55626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, Register reg) { 557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Define(instr, ToUnallocated(reg)); 558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5610a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble( 56226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, DoubleRegister reg) { 563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Define(instr, ToUnallocated(reg)); 564a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 565a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 566a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 567a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 568a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* hydrogen_env = current_block_->last_environment(); 569c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int argument_index_accumulator = 0; 570594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ZoneList<HValue*> objects_to_materialize(0, zone()); 571c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com instr->set_environment(CreateEnvironment(hydrogen_env, 572594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org &argument_index_accumulator, 573594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org &objects_to_materialize)); 574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return instr; 575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* hinstr, 580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CanDeoptimize can_deoptimize) { 581a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsNonDeferredCalling(); 58283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG 58383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org instr->VerifyCall(); 58483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif 58583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org instr->MarkAsCall(); 586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org instr = AssignPointerMap(instr); 587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // If instruction does not have side-effects lazy deoptimization 589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // after the call will try to deoptimize to the point before the call. 590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Thus we still need to attach environment to this call even if 591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // call sequence can not deoptimize eagerly. 592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool needs_environment = 593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org !hinstr->HasObservableSideEffects(); 595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (needs_environment && !instr->HasEnvironment()) { 596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org instr = AssignEnvironment(instr); 5974edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // We can't really figure out if the environment is needed or not. 5984edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org instr->environment()->set_has_been_used(); 599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return instr; 602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 6050a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 606e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->HasPointerMap()); 60771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org instr->set_pointer_map(new(zone()) LPointerMap(zone())); 608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return instr; 609a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::TempRegister() { 613812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LUnallocated* operand = 614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 6152bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int vreg = allocator_->GetVirtualRegister(); 6162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (!allocator_->AllocationOk()) { 617594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 61857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org vreg = 0; 6192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 6202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org operand->set_virtual_register(vreg); 621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 625d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() { 626d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LUnallocated* operand = 627d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); 628d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org int vreg = allocator_->GetVirtualRegister(); 629d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (!allocator_->AllocationOk()) { 630d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 631d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org vreg = 0; 632d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 633d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org operand->set_virtual_register(vreg); 634d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return operand; 635d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org} 636d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 637d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 638a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) { 639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LUnallocated* operand = ToUnallocated(reg); 640e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 641a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 642a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 643a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 644a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 645a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 646a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LUnallocated* operand = ToUnallocated(reg); 647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 650a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 653812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LLabel(instr->block()); 654a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 65746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 65846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 65946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 66046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 66146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 662d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 663d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org UNREACHABLE(); 664d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return NULL; 665d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org} 666d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 667d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 669812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LDeoptimize); 670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 671a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op, 674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBitwiseBinaryOperation* instr) { 675528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 676e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 677e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 678528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 679a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 680528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HValue* right_value = instr->right(); 681528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = NULL; 682528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int constant_value = 0; 683528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool does_deopt = false; 684528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (right_value->IsConstant()) { 685528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HConstant* constant = HConstant::cast(right_value); 686528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = chunk_->DefineConstantOperand(constant); 68717aac87e074aee1bc2470cf0ed56556f4f2de420machenbach@chromium.org constant_value = constant->Integer32Value() & 0x1f; 688528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Left shifts can deoptimize if we shift by > 0 and the result cannot be 689528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // truncated to smi. 690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmi() && constant_value > 0) { 691528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 692528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 693528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 694528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = UseRegisterAtStart(right_value); 695a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 6962f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 697528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Shift operations can only deoptimize if we do a logical shift 698528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // by 0 and the result cannot be truncated to int32. 699528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::SHR && constant_value == 0) { 700528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (FLAG_opt_safe_uint32_operations) { 701528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckFlag(HInstruction::kUint32); 702528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 703528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 704528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 7052f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } 7062f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 707528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LInstruction* result = 708528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt)); 709528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return does_deopt ? AssignEnvironment(result) : result; 710528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 711528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(op, instr); 712528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 715a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HArithmeticBinaryOperation* instr) { 718e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 719e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 721528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::MOD) { 7229f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org LOperand* left = UseFixedDouble(instr->left(), d0); 7239f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org LOperand* right = UseFixedDouble(instr->right(), d1); 724528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 7259f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org return MarkAsCall(DefineFixedDouble(result, d0), instr); 726528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 727528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineAsRegister(result); 731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 732a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 733a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 734a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 735a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 736528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HBinaryOperation* instr) { 737a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HValue* left = instr->left(); 738a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HValue* right = instr->right(); 739e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(left->representation().IsTagged()); 740e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(right->representation().IsTagged()); 741c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 742a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* left_operand = UseFixed(left, r1); 743a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* right_operand = UseFixed(right, r0); 744812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LArithmeticT* result = 745c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LArithmeticT(op, context, left_operand, right_operand); 746a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 747a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 748a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 749378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org 750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 751e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_building()); 752a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_ = block; 753a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org next_block_ = next_block; 754a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (block->IsStartBlock()) { 755a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->UpdateEnvironment(graph_->start_environment()); 756a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org argument_count_ = 0; 757a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (block->predecessors()->length() == 1) { 758a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // We have a single predecessor => copy environment and outgoing 759a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // argument count from the predecessor. 760e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(block->phis()->length() == 0); 761a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* last_environment = pred->last_environment(); 763e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_environment != NULL); 764a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Only copy the environment, if it is later used again. 765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (pred->end()->SecondSuccessor() == NULL) { 766e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->end()->FirstSuccessor() == block); 767a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 768a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 769a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 770a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org last_environment = last_environment->Copy(); 771a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 772a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 773a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->UpdateEnvironment(last_environment); 774e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->argument_count() >= 0); 775a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org argument_count_ = pred->argument_count(); 776a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 777a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // We are at a state join => process phis. 778a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // No need to copy the environment, it cannot be used later. 780a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* last_environment = pred->last_environment(); 781a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < block->phis()->length(); ++i) { 782a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HPhi* phi = block->phis()->at(i); 783ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org if (phi->HasMergedIndex()) { 784b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org last_environment->SetValueAt(phi->merged_index(), phi); 785b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org } 786a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 787a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < block->deleted_phis()->length(); ++i) { 788b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org if (block->deleted_phis()->at(i) < last_environment->length()) { 789b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org last_environment->SetValueAt(block->deleted_phis()->at(i), 790b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org graph_->GetConstantUndefined()); 791b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org } 792a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 793a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->UpdateEnvironment(last_environment); 794a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Pick up the outgoing argument count of one of the predecessors. 795a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org argument_count_ = pred->argument_count(); 796a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 797a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* current = block->first(); 798a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int start = chunk_->instructions()->length(); 799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org while (current != NULL && !is_aborted()) { 800a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Code for constants in registers is generated lazily. 801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (!current->EmitAtUses()) { 802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org VisitInstruction(current); 803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 804a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current = current->next(); 805a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int end = chunk_->instructions()->length() - 1; 807a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (end >= start) { 808a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->set_first_instruction_index(start); 809a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->set_last_instruction_index(end); 810a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->set_argument_count(argument_count_); 812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org next_block_ = NULL; 813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_ = NULL; 814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* old_current = current_instruction_; 819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_instruction_ = current; 820d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 821d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* instr = NULL; 822d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org if (current->CanReplaceWithDummyUses()) { 823935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (current->OperandCount() == 0) { 824935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) LDummy()); 825935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } else { 826e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!current->OperandAt(0)->IsControlInstruction()); 827935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) 828935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LDummyUse(UseAny(current->OperandAt(0)))); 829935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } 830d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org for (int i = 1; i < current->OperandCount(); ++i) { 83109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org if (current->OperandAt(i)->IsControlInstruction()) continue; 832d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* dummy = 833d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 834d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org dummy->set_hydrogen_value(current); 835d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org chunk_->AddInstruction(dummy, current_block_); 836d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 837d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } else { 8388d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HBasicBlock* successor; 8398d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org if (current->IsControlInstruction() && 8408d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 8418d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org successor != NULL) { 8428d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = new(zone()) LGoto(successor); 8438d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } else { 8448d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = current->CompileToLithium(this); 8458d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } 846d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 847d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 848d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org argument_count_ += current->argument_delta(); 849e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ >= 0); 850a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 851a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (instr != NULL) { 852011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(instr, current); 853011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 854011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 855011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org current_instruction_ = old_current; 856011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org} 857011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 858011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 859011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr, 860011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HInstruction* hydrogen_val) { 861011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Associate the hydrogen instruction first, since we may need it for 862011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 863011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->set_hydrogen_value(hydrogen_val); 864fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org 865f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG 866011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Make sure that the lithium instruction has either no fixed register 867011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // constraints in temps or the result OR no uses that are only used at 868011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // start. If this invariant doesn't hold, the register allocator can decide 869011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // to insert a split of a range immediately before the instruction due to an 870011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // already allocated register needing to be used for the instruction's fixed 871011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // register constraint. In this case, The register allocator won't see an 872011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // interference between the split child and the use-at-start (it would if 873011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the it was just a plain use), so it is free to move the split child into 874011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the same register that is used for the use-at-start. 875011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // See https://code.google.com/p/chromium/issues/detail?id=201590 876011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (!(instr->ClobbersRegisters() && 877011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->ClobbersDoubleRegisters(isolate()))) { 878011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int fixed = 0; 879011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int used_at_start = 0; 880011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (UseIterator it(instr); !it.Done(); it.Advance()) { 881011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 882011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->IsUsedAtStart()) ++used_at_start; 883011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 884011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->Output() != NULL) { 885011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 886011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 887011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (TempIterator it(instr); !it.Done(); it.Advance()) { 888011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 889011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->HasFixedPolicy()) ++fixed; 890f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 891e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(fixed == 0 || used_at_start == 0); 892011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 893f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif 894f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 895011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 896011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignPointerMap(instr); 897011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 898011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_environments && !instr->HasEnvironment()) { 899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignEnvironment(instr); 900011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 901011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(instr, current_block_); 902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 903011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->IsCall()) { 904011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* instruction_needing_environment = NULL; 906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (hydrogen_val->HasObservableSideEffects()) { 907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment = instr; 909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org sim->ReplayEnvironment(current_block_->last_environment()); 910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org hydrogen_value_for_lazy_bailout = sim; 911a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 912011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 913011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 914011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(bailout, current_block_); 915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instruction_needing_environment != NULL) { 916011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Store the lazy deopt environment with the instruction if needed. 917011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Right now it is only used for LInstanceOfKnownGlobal. 918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment-> 919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 920486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 921a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 922a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 923a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 924a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 925a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 926d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org return new(zone()) LGoto(instr->FirstSuccessor()); 927a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 928a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 929a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 9304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 931d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org HValue* value = instr->value(); 932ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org Representation r = value->representation(); 933f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com HType type = value->type(); 9341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ToBooleanStub::Types expected = instr->expected_input_types(); 935ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 936ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 937ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 938ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 939ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 940ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!easy_case && 941ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 942ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !expected.IsGeneric())) { 943ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org branch = AssignEnvironment(branch); 944f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 945ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return branch; 946a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 947a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 948a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 9494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 9504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return new(zone()) LDebugBreak(); 9514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 9524e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 953ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org 9540a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 955e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 956a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 9575d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org LOperand* temp = TempRegister(); 958812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LCmpMapAndBranch(value, temp); 959a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 960a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 961a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 962812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) { 96377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 964812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegister(instr->value()); 965812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LArgumentsLength(value)); 966a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 97077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 971b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org return DefineAsRegister(new(zone()) LArgumentsElements); 972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 973a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 974a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 975a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 976c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 9770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org LInstanceOf* result = 978c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LInstanceOf(context, UseFixed(instr->left(), r0), 979c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org UseFixed(instr->right(), r1)); 980a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 981a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 982a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 983a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 984d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 985d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org HInstanceOfKnownGlobal* instr) { 9860a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org LInstanceOfKnownGlobal* result = 987c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LInstanceOfKnownGlobal( 988c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org UseFixed(instr->context(), cp), 989c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org UseFixed(instr->left(), r0), 990c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org FixedTemp(r4)); 9919ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 992d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org} 993d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 994d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 995154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 996154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* receiver = UseRegisterAtStart(instr->receiver()); 997154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 998154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 999ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1000154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org} 1001154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1002154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1003a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 1004a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* function = UseFixed(instr->function(), r1); 1005a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* receiver = UseFixed(instr->receiver(), r0); 1006496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* length = UseFixed(instr->length(), r2); 1007496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* elements = UseFixed(instr->elements(), r3); 1008812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LApplyArguments* result = new(zone()) LApplyArguments(function, 10090a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org receiver, 10100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org length, 10110a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org elements); 1012a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); 1013a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1014a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1015a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1016011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 1017011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int argc = instr->OperandCount(); 1018011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0; i < argc; ++i) { 1019011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LOperand* argument = Use(instr->argument(i)); 1020011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(new(zone()) LPushArgument(argument), instr); 1021011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 1022011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org return NULL; 1023a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1024a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1025a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1026662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry( 1027662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org HStoreCodeEntry* store_code_entry) { 1028662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* function = UseRegister(store_code_entry->function()); 1029662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 1030662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org return new(zone()) LStoreCodeEntry(function, code_object); 1031662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 1032662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 1033662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 10342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1035ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org HInnerAllocatedObject* instr) { 1036ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1037ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1038ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return DefineAsRegister( 1039ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org new(zone()) LInnerAllocatedObject(base_object, offset)); 10402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 10412bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 10422bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 1043d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 1044812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return instr->HasNoUses() 1045812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ? NULL 1046812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : DefineAsRegister(new(zone()) LThisFunction); 1047d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 1048d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1049d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 105083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1051c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (instr->HasNoUses()) return NULL; 1052c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1053c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (info()->IsStub()) { 1054c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return DefineFixed(new(zone()) LContext, cp); 10554cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 10564cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 1057c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return DefineAsRegister(new(zone()) LContext); 105883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 105983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 106083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 106156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1062c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1063c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 106456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org} 106556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 106656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 106726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction( 106826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallJSFunction* instr) { 106926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* function = UseFixed(instr->function(), r1); 107026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 107126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallJSFunction* result = new(zone()) LCallJSFunction(function); 107226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 107326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 107426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 107526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 107626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 107726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor( 107826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallWithDescriptor* instr) { 10799aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org CallInterfaceDescriptor descriptor = instr->descriptor(); 108026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 108126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 108226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 108326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(target, zone()); 108426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 1; i < instr->OperandCount(); i++) { 10859aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* op = 10869aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1)); 108726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(op, zone()); 108826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 108926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 109026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 109126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org descriptor, ops, zone()); 109226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 1093a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1094a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1095a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1096e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache( 1097e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org HTailCallThroughMegamorphicCache* instr) { 1098e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1099e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* receiver_register = 1100e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister()); 1101e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* name_register = 1102e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->name(), LoadDescriptor::NameRegister()); 1103e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org // Not marked as call. It can't deoptimize, and it never returns. 1104e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return new (zone()) LTailCallThroughMegamorphicCache( 1105e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org context, receiver_register, name_register); 1106e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 1107e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1108e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1109160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1110c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1111160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org LOperand* function = UseFixed(instr->function(), r1); 1112c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 1113160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org return MarkAsCall(DefineFixed(result, r0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1114160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 1115160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1116160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org switch (instr->op()) { 1119dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFloor: 1120dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFloor(instr); 1121dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathRound: 1122dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathRound(instr); 1123dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFround: 1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFround(instr); 1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathAbs: 1126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathAbs(instr); 1127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathLog: 1128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathLog(instr); 1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathExp: 1130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathExp(instr); 1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathSqrt: 1132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathSqrt(instr); 1133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathPowHalf: 1134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathPowHalf(instr); 1135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathClz32: 1136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathClz32(instr); 1137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org default: 1138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org UNREACHABLE(); 1139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return NULL; 1140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathFloor* result = new(zone()) LMathFloor(input); 1147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 1148e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1151e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1153d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp = TempDoubleRegister(); 1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathRound* result = new(zone()) LMathRound(input, temp); 1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1159dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1160dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1161dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LMathFround* result = new (zone()) LMathFround(input); 1162dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DefineAsRegister(result); 1163dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org} 1164dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1165dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1167c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org Representation r = instr->value()->representation(); 1168c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) 1169c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org ? NULL 1170c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org : UseFixed(instr->context(), cp); 1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1172ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1173ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LMathAbs(context, input)); 1174ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 1175ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!r.IsDouble()) result = AssignEnvironment(result); 1176ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1181e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 11834f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org LOperand* input = UseFixedDouble(instr->value(), d0); 11844f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), d0), instr); 1185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LMathClz32* result = new(zone()) LMathClz32(input); 1191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 1192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1194f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1196e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1197e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 11983d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp1 = TempRegister(); 1200e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp2 = TempRegister(); 1201d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* double_temp = TempDoubleRegister(); 1202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2); 1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineAsRegister(result); 1204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 12089f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathSqrt* result = new(zone()) LMathSqrt(input); 1210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineAsRegister(result); 1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 12159f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 12169f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org LMathPowHalf* result = new(zone()) LMathPowHalf(input); 12179f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org return DefineAsRegister(result); 1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1221a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 1222c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1223a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* constructor = UseFixed(instr->constructor(), r1); 1224c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LCallNew* result = new(zone()) LCallNew(context, constructor); 1225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 1226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1227a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 12294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1230c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 12314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LOperand* constructor = UseFixed(instr->constructor(), r1); 1232c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 12334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 12344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 12354a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 12364a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 1237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1238c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1239c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org LOperand* function = UseFixed(instr->function(), r1); 1240ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org LCallFunction* call = new(zone()) LCallFunction(context, function); 1241a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return MarkAsCall(DefineFixed(call, r0), instr); 1242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1243a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1244a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1246c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1247c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), r0), instr); 1248a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1251e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1252e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org return DoShift(Token::ROR, instr); 1253e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 1254e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1255e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1256a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoShift(Token::SHR, instr); 1258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1259a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1260a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1261a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1262a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoShift(Token::SAR, instr); 1263a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1264a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1266a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) { 1267a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoShift(Token::SHL, instr); 1268a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1269a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1271c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1272fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1273e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1274e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1275e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 1276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1277906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1278906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 1279812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LBitI(left, right)); 1280c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1281528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(instr->op(), instr); 1282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1283a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1284a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1286ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1287e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1288e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1289e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1290ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1291ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1292486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1293486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1294486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1295486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1296ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1297486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org divisor != 1 && divisor != -1)) { 1298486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1299486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1300486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1301ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1302ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1303ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1304bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1307e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1308bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1309bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1310486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( 1311486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1312486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || 1313486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1314486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1315486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1316486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1317486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1318bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1319bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1320bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1321ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1324e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1325ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1326ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1327d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp = 1328d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); 1329ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1330ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); 1331ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1332ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1333ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && 1334ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org (!CpuFeatures::IsSupported(SUDIV) || 1335ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) || 1336ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org (!instr->IsMathFloorOfDiv() && 1337ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { 1338ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1339ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1340ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1341ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1342ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1343ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1345528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1346bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1347bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByPowerOf2I(instr); 1348bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1349bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByConstI(instr); 1350bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1351bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivI(instr); 1352bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1353528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1354528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::DIV, instr); 1355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1356a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::DIV, instr); 1357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1358a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1359a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1361ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1362ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1363ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1364381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I( 1365381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org dividend, divisor)); 1366381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1367381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1368381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1369381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } 1370381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1371ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1372af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 1373ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1374ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1375e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1376e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1377e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1378a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org LOperand* dividend = UseRegister(instr->left()); 1379bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 13807010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org LOperand* temp = 13817010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 13827010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 13837010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org NULL : TempRegister(); 13847010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org LInstruction* result = DefineAsRegister( 13857010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org new(zone()) LFlooringDivByConstI(dividend, divisor, temp)); 13867010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org if (divisor == 0 || 13877010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 13887010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org result = AssignEnvironment(result); 13897010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } 13907010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return result; 1391ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1392ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1393ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1394ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1395e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1396e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1397e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1398ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1399ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1400d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp = 1401d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); 1402ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor, temp); 1403ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignEnvironment(DefineAsRegister(div)); 1404ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org} 1405ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 1406ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 1407ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1408ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1409ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoFlooringDivByPowerOf2I(instr); 14107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } else if (instr->right()->IsConstant()) { 14117010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return DoFlooringDivByConstI(instr); 1412ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } else { 1413ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DoFlooringDivI(instr); 1414ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } 1415ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1416ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1417ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1418ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1420e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1421e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1423ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1424486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1425486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1426e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1427e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1428486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1429486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1430486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1431ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1432ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1433ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1434bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1435e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1436e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1437e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1438bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1439bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1440486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( 1441486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1442486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1443486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1444486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1445486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1446bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1447bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1448bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1449ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1450e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1451e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1452e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1453486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOperand* dividend = UseRegister(instr->left()); 1454486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LOperand* divisor = UseRegister(instr->right()); 1455d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp = 1456d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); 1457d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp2 = 1458d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister(); 1459486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModI( 1460486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp, temp2)); 1461486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1462486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1463486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1464ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } 1465486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1466efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org} 1467efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 1468efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 1469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1470fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1471bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1472bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByPowerOf2I(instr); 1473bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1474bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByConstI(instr); 1475bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1476bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModI(instr); 1477bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1478528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1479528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::MOD, instr); 14802f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } else { 1481528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(Token::MOD, instr); 1482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1487fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1488e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1489e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1490639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org HValue* left = instr->BetterLeftOperand(); 1491639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org HValue* right = instr->BetterRightOperand(); 1492639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org LOperand* left_op; 1493639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org LOperand* right_op; 1494639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1495639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero); 1496639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 1497639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (right->IsConstant()) { 1498639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org HConstant* constant = HConstant::cast(right); 1499639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org int32_t constant_value = constant->Integer32Value(); 1500639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org // Constants -1, 0 and 1 can be optimized if the result can overflow. 1501639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org // For other constants, it can be optimized only without overflow. 1502639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) { 1503639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org left_op = UseRegisterAtStart(left); 1504639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org right_op = UseConstant(right); 1505639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } else { 1506639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (bailout_on_minus_zero) { 1507639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org left_op = UseRegister(left); 1508639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } else { 1509639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org left_op = UseRegisterAtStart(left); 1510639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 1511639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org right_op = UseRegister(right); 1512639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 15133cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org } else { 1514639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (bailout_on_minus_zero) { 1515639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org left_op = UseRegister(left); 1516639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } else { 1517639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org left_op = UseRegisterAtStart(left); 1518639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 1519639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org right_op = UseRegister(right); 1520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1521639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org LMulI* mul = new(zone()) LMulI(left_op, right_op); 1522639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (can_overflow || bailout_on_minus_zero) { 1523f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com AssignEnvironment(mul); 1524f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1525f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return DefineAsRegister(mul); 1526d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 1527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (instr->representation().IsDouble()) { 15284b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (instr->HasOneUse() && (instr->uses().value()->IsAdd() || 15294b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org instr->uses().value()->IsSub())) { 15308432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org HBinaryOperation* use = HBinaryOperation::cast(instr->uses().value()); 15318432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 15328432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org if (use->IsAdd() && instr == use->left()) { 15338432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org // This mul is the lhs of an add. The add and mul will be folded into a 15348432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org // multiply-add in DoAdd. 1535fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return NULL; 1536fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 15378432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org if (instr == use->right() && use->IsAdd() && !use->left()->IsMul()) { 1538fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org // This mul is the rhs of an add, where the lhs is not another mul. 15398432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org // The add and mul will be folded into a multiply-add in DoAdd. 15408432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org return NULL; 15418432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org } 15428432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org if (instr == use->right() && use->IsSub()) { 15438432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org // This mul is the rhs of a sub. The sub and mul will be folded into a 15448432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org // multiply-sub in DoSub. 1545fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return NULL; 1546fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 1547fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 1548d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com 1549fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return DoArithmeticD(Token::MUL, instr); 1550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::MUL, instr); 1552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1557fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1558e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1559e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 15608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 15618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (instr->left()->IsConstant()) { 15628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // If lhs is constant, do reverse subtraction instead. 15638e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return DoRSub(instr); 15648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 15658e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 15660ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 15670ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1568812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LSubI* sub = new(zone()) LSubI(left, right); 15693cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org LInstruction* result = DefineAsRegister(sub); 1570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1571a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = AssignEnvironment(result); 1572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return result; 1574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (instr->representation().IsDouble()) { 15754b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (instr->right()->IsMul() && instr->right()->HasOneUse()) { 15768432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org return DoMultiplySub(instr->left(), HMul::cast(instr->right())); 15778432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org } 15788432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 1579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticD(Token::SUB, instr); 1580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::SUB, instr); 1582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1583a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1584a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 15858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 15868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgLInstruction* LChunkBuilder::DoRSub(HSub* instr) { 1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1588e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1589e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 15908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 15918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // Note: The lhs of the subtraction becomes the rhs of the 15928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // reverse-subtraction. 15938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->right()); 15948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->left()); 15958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LRSubI* rsb = new(zone()) LRSubI(left, right); 15968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LInstruction* result = DefineAsRegister(rsb); 15978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 15988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org result = AssignEnvironment(result); 15998e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 16008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return result; 16018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 16028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 16038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 1604fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { 1605fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org LOperand* multiplier_op = UseRegisterAtStart(mul->left()); 1606fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); 1607fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org LOperand* addend_op = UseRegisterAtStart(addend); 1608fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, 1609fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org multiplicand_op)); 1610fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org} 1611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 16128432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 16138432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.orgLInstruction* LChunkBuilder::DoMultiplySub(HValue* minuend, HMul* mul) { 16148432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org LOperand* minuend_op = UseRegisterAtStart(minuend); 16158432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org LOperand* multiplier_op = UseRegisterAtStart(mul->left()); 16168432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); 16178432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 16188432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org return DefineSameAsFirst(new(zone()) LMultiplySubD(minuend_op, 16198432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org multiplier_op, 16208432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org multiplicand_op)); 16218432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org} 16228432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 16238432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 1624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1625fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1626e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1627e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1628906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1629906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 1630812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LAddI* add = new(zone()) LAddI(left, right); 16313cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org LInstruction* result = DefineAsRegister(add); 1632a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1633a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = AssignEnvironment(result); 1634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return result; 163637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org } else if (instr->representation().IsExternal()) { 1637e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsExternal()); 1638e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsInteger32()); 1639e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 164037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 164137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 164237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LAddI* add = new(zone()) LAddI(left, right); 164337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LInstruction* result = DefineAsRegister(add); 164437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return result; 1645a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (instr->representation().IsDouble()) { 16464b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (instr->left()->IsMul() && instr->left()->HasOneUse()) { 1647fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); 16488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org } 1649fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 16504b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (instr->right()->IsMul() && instr->right()->HasOneUse()) { 1651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->left()->IsMul() || !instr->left()->HasOneUse()); 1652fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); 1653fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 1654fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 1655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticD(Token::ADD, instr); 1656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1657a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::ADD, instr); 1658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1660a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1661a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1662471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1663471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* left = NULL; 1664471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* right = NULL; 1665fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1666e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1667e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1668906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 1669906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org right = UseOrConstantAtStart(instr->BetterRightOperand()); 1670471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } else { 1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1672e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1673e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1674471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org left = UseRegisterAtStart(instr->left()); 1675471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org right = UseRegisterAtStart(instr->right()); 1676471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 1677471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return DefineAsRegister(new(zone()) LMathMinMax(left, right)); 1678471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org} 1679471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1680471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 16815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1682e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 16833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // We call a C function for double power. It can't trigger a GC. 16843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // We need to use fixed result register for the call. 16853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org Representation exponent_type = instr->right()->representation(); 1686e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 16879f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org LOperand* left = UseFixedDouble(instr->left(), d0); 16886313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org LOperand* right = 16896313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org exponent_type.IsDouble() 16906313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org ? UseFixedDouble(instr->right(), d1) 16916313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 1692812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LPower* result = new(zone()) LPower(left, right); 16939f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org return MarkAsCall(DefineFixedDouble(result, d2), 16943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org instr, 16953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org CAN_DEOPTIMIZE_EAGERLY); 16965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 16975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 16985f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 16994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1700e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1701e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1702c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1703394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left = UseFixed(instr->left(), r1); 1704394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* right = UseFixed(instr->right(), r0); 1705c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LCmpT* result = new(zone()) LCmpT(context, left, right); 17064f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 17074f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org} 17084f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 17094f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 1710e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1711e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HCompareNumericAndBranch* instr) { 1712fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org Representation r = instr->representation(); 1713c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (r.IsSmiOrInteger32()) { 1714e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(r)); 1715e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(r)); 1716394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 1717394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1718e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 17194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } else { 1720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(r.IsDouble()); 1721e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1722e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1723a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1724a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 1725e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1726a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1727a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1728a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1729a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 17314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HCompareObjectEqAndBranch* instr) { 1732a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1733a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 1734812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LCmpObjectEqAndBranch(left, right); 17357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 17367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1738c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1739c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org HCompareHoleAndBranch* instr) { 1740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1741528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return new(zone()) LCmpHoleAndBranch(value); 1742c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org} 1743c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org 1744c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org 17450cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 17460cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org HCompareMinusZeroAndBranch* instr) { 17470cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* value = UseRegister(instr->value()); 17480cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* scratch = TempRegister(); 17490cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 17500cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 17510cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 17520cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 17534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1754e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1755812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 17564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org LOperand* temp = TempRegister(); 1757812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsObjectAndBranch(value, temp); 17585f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 17595f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 17605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 17610ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1762e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1763812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 17640ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* temp = TempRegister(); 1765812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsStringAndBranch(value, temp); 17660ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17670ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17680ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1770e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1771812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1772a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1773a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17754f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 17764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HIsUndetectableAndBranch* instr) { 1777e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1778812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1779812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsUndetectableAndBranch(value, TempRegister()); 17807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 17817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17830ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoStringCompareAndBranch( 17840ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry HStringCompareAndBranch* instr) { 1785e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1786e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1787c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 17880ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* left = UseFixed(instr->left(), r1); 17890ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* right = UseFixed(instr->right(), r0); 1790812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LStringCompareAndBranch* result = 1791c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LStringCompareAndBranch(context, left, right); 17920ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry return MarkAsCall(result, instr); 17930ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17940ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17964f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 17974f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HHasInstanceTypeAndBranch* instr) { 1798e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1799812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1800812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LHasInstanceTypeAndBranch(value); 1801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 180449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 180549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org HGetCachedArrayIndex* instr) { 1806e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 18078f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 180849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 1809812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 181049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org} 181149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 181249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 18134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 18144f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HHasCachedArrayIndexAndBranch* instr) { 1815e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1816812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LHasCachedArrayIndexAndBranch( 18174f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org UseRegisterAtStart(instr->value())); 1818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1820a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 18214f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 18224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HClassOfTestAndBranch* instr) { 1823e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1824812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegister(instr->value()); 1825812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LClassOfTestAndBranch(value, TempRegister()); 1826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1828a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1829355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 1830355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org LOperand* map = UseRegisterAtStart(instr->value()); 1831355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return DefineAsRegister(new(zone()) LMapEnumLength(map)); 1832355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org} 1833355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 1834355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 18354efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 18364efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org LOperand* object = UseFixed(instr->value(), r0); 18377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org LDateField* result = 18387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org new(zone()) LDateField(object, FixedTemp(r1), instr->index()); 1839de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); 18404efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org} 18414efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 18424efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 1843e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1844e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 1845e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1846e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 1847e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1848e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1849e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 185032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 18519af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 18529af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* index = FLAG_debug_code 18539af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ? UseRegisterAtStart(instr->index()) 18549af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org : UseRegisterOrConstantAtStart(instr->index()); 18559af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 18569af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL; 18579af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return new(zone()) LSeqStringSetChar(context, string, index, value); 185832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org} 185932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 186032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 1861a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1862a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code && instr->skip_check()) return NULL; 1863a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1864a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* length = !index->IsConstantOperand() 1865a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ? UseRegisterOrConstantAtStart(instr->length()) 1866a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org : UseRegisterAtStart(instr->length()); 1867a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LInstruction* result = new(zone()) LBoundsCheck(index, length); 1868a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code || !instr->skip_check()) { 1869a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org result = AssignEnvironment(result); 1870a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 1871a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return result; 1872a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1873a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1874a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1875876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 1876876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org HBoundsCheckBaseIndexInformation* instr) { 1877876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org UNREACHABLE(); 1878876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org return NULL; 1879876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org} 1880876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1881876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1882c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 1883c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // The control instruction marking the end of a block that completed 1884c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // abruptly (e.g., threw an exception). There is nothing specific to do. 1885c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return NULL; 1886c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org} 1887c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1888c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1889d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 1890d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org return NULL; 1891d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 1892a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1893a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1894c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1895c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // All HForceRepresentation instructions should be eliminated in the 1896c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // representation change phase of Hydrogen. 1897c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org UNREACHABLE(); 1898c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org return NULL; 1899c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 1900c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1901c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1902a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) { 1903a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Representation from = instr->from(); 1904a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Representation to = instr->to(); 1905ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org HValue* val = instr->value(); 1906a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (from.IsSmi()) { 1907a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (to.IsTagged()) { 1908ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1909a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1910a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1911a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org from = Representation::Tagged(); 1912a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1913a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (from.IsTagged()) { 1914a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (to.IsDouble()) { 1915ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1916ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 1917ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1918ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1919a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1920a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1921a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (val->type().IsSmi()) { 1922a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1923a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 192453ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 1925a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1926e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 1927662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (val->type().IsSmi() || val->representation().IsSmi()) { 1928ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1929ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 1930badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org } else { 1931ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1932badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org LOperand* temp1 = TempRegister(); 1933d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp2 = TempDoubleRegister(); 1934ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1935ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); 19364edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1937ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1938a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1939a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1940a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (from.IsDouble()) { 1941a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (to.IsTagged()) { 1942a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 1943ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 19445f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org LOperand* temp1 = TempRegister(); 19455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org LOperand* temp2 = TempRegister(); 1946a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LUnallocated* result_temp = TempRegister(); 1947812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 1948ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignPointerMap(Define(result, result_temp)); 1949a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1950ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 19511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return AssignEnvironment( 19521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org DefineAsRegister(new(zone()) LDoubleToSmi(value))); 1953a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1954e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 1955ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1956ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 1957ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 1958ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1959a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1960a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (from.IsInteger32()) { 1961a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 1962a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (to.IsTagged()) { 1963381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (!instr->CheckFlag(HValue::kCanOverflow)) { 1964ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1965381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiTag(value)); 1966381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } else if (val->CheckFlag(HInstruction::kUint32)) { 1967ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1968bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp1 = TempRegister(); 1969bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp2 = TempRegister(); 1970bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 1971ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 1972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1973ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1974bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp1 = TempRegister(); 1975bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp2 = TempRegister(); 1976bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 1977ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 1978a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1979a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1980a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1981381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1982381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1983381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1984a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1985381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1986a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1987e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsDouble()); 1988ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 1989ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 199046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } else { 1991ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val))); 199246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 1993a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1995a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 1996a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 1997a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1998a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1999a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 2001a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 20028f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org LInstruction* result = new(zone()) LCheckNonSmi(value); 2003eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org if (!instr->value()->type().IsHeapObject()) { 2004eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org result = AssignEnvironment(result); 2005eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 20068f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return result; 2007a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2008a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2009a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2010e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 2011e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2012e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckSmi(value)); 2013e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} 2014e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2015e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2016a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 2017a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2018812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = new(zone()) LCheckInstanceType(value); 2019a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return AssignEnvironment(result); 2020a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2021a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2022a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20231f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 2024a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 20251f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckValue(value)); 2026a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2027a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2028a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20291456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 2030af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 2031af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2032af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 2033af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->HasMigrationTarget()) { 2034af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org info()->MarkAsDeferredCalling(); 2035af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org result = AssignPointerMap(result); 2036594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 2037594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return result; 2038a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2039a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2040a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2041c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 2042c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org HValue* value = instr->value(); 2043c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org Representation input_rep = value->representation(); 2044c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org LOperand* reg = UseRegister(value); 2045c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org if (input_rep.IsDouble()) { 2046fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org return DefineAsRegister(new(zone()) LClampDToUint8(reg)); 2047c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } else if (input_rep.IsInteger32()) { 2048812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 2049c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } else { 2050e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(input_rep.IsSmiOrTagged()); 2051c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // Register allocator doesn't (yet) support allocation of double 2052c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // temps. Reserve d1 explicitly. 2053d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LClampTToUint8* result = 2054d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org new(zone()) LClampTToUint8(reg, TempDoubleRegister()); 2055c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org return AssignEnvironment(DefineAsRegister(result)); 2056c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } 2057c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 2058c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 2059c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 2060ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2061ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org HValue* value = instr->value(); 2062e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value->representation().IsDouble()); 2063ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2064ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2065ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2066ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2067ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2068ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* lo = UseRegister(instr->lo()); 2069ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* hi = UseRegister(instr->hi()); 2070ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2071ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2072ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2073ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2074a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2075c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = info()->IsStub() 2076c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org ? UseFixed(instr->context(), cp) 2077c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org : NULL; 20786e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2079c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return new(zone()) LReturn(UseFixed(instr->value(), r0), context, 20806e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org parameter_count); 2081a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2082a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2083a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2084a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 2085a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Representation r = instr->representation(); 2086b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (r.IsSmi()) { 2087b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org return DefineAsRegister(new(zone()) LConstantS); 2088b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsInteger32()) { 2089812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantI); 2090a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (r.IsDouble()) { 2091812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantD); 2092d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (r.IsExternal()) { 2093d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return DefineAsRegister(new(zone()) LConstantE); 2094b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsTagged()) { 2095812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantT); 2096a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 2097c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org UNREACHABLE(); 2098a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2099a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 2100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2103c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 2104812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 2105c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return instr->RequiresHoleCheck() 2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 2107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : DefineAsRegister(result); 2108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2111c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 2112c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2113fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* global_object = 21149aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 21159d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21169d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21179aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21189d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 2119c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LLoadGlobalGeneric* result = 21209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org new(zone()) LLoadGlobalGeneric(context, global_object, vector); 2121c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 2122c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 2123c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2124c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 212574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 2126e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org LOperand* value = UseRegister(instr->value()); 2127e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org // Use a temp to check the value in the cell in the case where we perform 2128e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org // a hole check. 2129e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org return instr->RequiresHoleCheck() 2130812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 2131812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : new(zone()) LStoreGlobalCell(value, NULL); 2132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2135c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 213683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* context = UseRegisterAtStart(instr->value()); 2137812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = 2138812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DefineAsRegister(new(zone()) LLoadContextSlot(context)); 2139ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2140ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 2141ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 2142ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 214383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 214483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 214583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 214683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 21473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* context; 214883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* value; 214983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org if (instr->NeedsWriteBarrier()) { 21503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org context = UseTempRegister(instr->context()); 215183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org value = UseTempRegister(instr->value()); 215283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } else { 21533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org context = UseRegister(instr->context()); 215483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org value = UseRegister(instr->value()); 215583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 2156812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = new(zone()) LStoreContextSlot(context, value); 2157ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2158ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 2159ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 2160ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 2161c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2162c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2163c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 2165f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org LOperand* obj = UseRegisterAtStart(instr->object()); 2166f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 2167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 2171c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2172fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 21739aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 21749d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21769aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21779d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 21789d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 2179c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LInstruction* result = 21809d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), r0); 2181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(result, instr); 2182a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 21859e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 21869e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org HLoadFunctionPrototype* instr) { 21879e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org return AssignEnvironment(DefineAsRegister( 2188812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 21899e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org} 21909e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 21919e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 2192528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2193528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineAsRegister(new(zone()) LLoadRoot); 2194528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 2195528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2196528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2197e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2198e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsSmiOrInteger32()); 2199e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org ElementsKind elements_kind = instr->elements_kind(); 2200717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 2201ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = NULL; 2202717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 22035c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2204e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org LOperand* obj = NULL; 2205e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org if (instr->representation().IsDouble()) { 2206fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org obj = UseRegister(instr->elements()); 2207e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } else { 2208e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrTagged()); 2209e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org obj = UseRegisterAtStart(instr->elements()); 2210e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 2211ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); 2212e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } else { 2213e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 2214e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org (instr->representation().IsInteger32() && 2215ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !IsDoubleOrFloatElementsKind(elements_kind)) || 2216e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org (instr->representation().IsDouble() && 2217ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org IsDoubleOrFloatElementsKind(elements_kind))); 22185c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 2219ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key)); 2220e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 2221717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 2222ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if ((instr->is_external() || instr->is_fixed_typed_array()) ? 2223ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org // see LCodeGen::DoLoadKeyedExternalArray 2224ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org ((elements_kind == EXTERNAL_UINT32_ELEMENTS || 2225ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org elements_kind == UINT32_ELEMENTS) && 2226ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !instr->CheckFlag(HInstruction::kUint32)) : 2227ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org // see LCodeGen::DoLoadKeyedFixedDoubleArray and 2228ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org // LCodeGen::DoLoadKeyedFixedArray 2229ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org instr->RequiresHoleCheck()) { 2230ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 2231ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 2232ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 2233496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org} 2234496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 2235496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 2236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 2237c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2238fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 22399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 22409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 22419d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 22429d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 22439aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 22449d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 2245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2246a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LInstruction* result = 22479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), 22489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org r0); 2249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(result, instr); 2250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2251a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2253e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 22545c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->elements()->representation().IsTagged()); 22568e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2257eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* object = NULL; 22588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* key = NULL; 22598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* val = NULL; 22608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 2261eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (instr->value()->representation().IsDouble()) { 2262eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org object = UseRegisterAtStart(instr->elements()); 2263528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org val = UseRegister(instr->value()); 22648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 2265eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } else { 2266e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsSmiOrTagged()); 2267528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (needs_write_barrier) { 2268528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org object = UseTempRegister(instr->elements()); 2269528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org val = UseTempRegister(instr->value()); 2270528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org key = UseTempRegister(instr->key()); 2271528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 2272528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org object = UseRegisterAtStart(instr->elements()); 2273528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org val = UseRegisterAtStart(instr->value()); 2274528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 2275528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 2276eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 2277eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 22788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return new(zone()) LStoreKeyed(object, key, val); 2279e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 2280e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 2281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 22828e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (instr->value()->representation().IsInteger32() && 22835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 22848e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (instr->value()->representation().IsDouble() && 22855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org IsDoubleOrFloatElementsKind(instr->elements_kind()))); 2286e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->is_fixed_typed_array() && 22875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsTagged()) || 22885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (instr->is_external() && 22895c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsExternal())); 2290528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* val = UseRegister(instr->value()); 22918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 22925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 22935c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return new(zone()) LStoreKeyed(backing_store, key, val); 22943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 22953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 22963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2297a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2298c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2299fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* obj = 23009aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 23019aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 23029aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2303a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2304e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->object()->representation().IsTagged()); 2305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsTagged()); 2306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 2307a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2308c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall( 2309c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr); 2310a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2311a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2312a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2313394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comLInstruction* LChunkBuilder::DoTransitionElementsKind( 2314394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com HTransitionElementsKind* instr) { 2315003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 23162f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseRegister(instr->object()); 2317394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* new_map_reg = TempRegister(); 2318394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LTransitionElementsKind* result = 2319c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); 2320f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return result; 2321c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org } else { 23222f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseFixed(instr->object(), r0); 2323c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2324c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org LTransitionElementsKind* result = 2325c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LTransitionElementsKind(object, context, NULL); 23262f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return MarkAsCall(result, instr); 2327394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 2328394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 2329394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 2330394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 233194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento( 233294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org HTrapAllocationMemento* instr) { 233394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* object = UseRegister(instr->object()); 233494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp = TempRegister(); 233594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LTrapAllocationMemento* result = 233694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org new(zone()) LTrapAllocationMemento(object, temp); 233794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return AssignEnvironment(result); 233894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org} 233994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 234094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 234253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org bool is_in_object = instr->access().IsInobject(); 2343d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2344594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool needs_write_barrier_for_map = instr->has_transition() && 234537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org instr->NeedsWriteBarrierForMap(); 234637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org 234737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org LOperand* obj; 234837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org if (needs_write_barrier) { 234953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org obj = is_in_object 235037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 235137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseTempRegister(instr->object()); 235237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } else { 235337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org obj = needs_write_barrier_for_map 235437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 235537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseRegisterAtStart(instr->object()); 235637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } 2357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 235857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org LOperand* val; 2359d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org if (needs_write_barrier) { 236057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseTempRegister(instr->value()); 2361bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org } else if (instr->field_representation().IsDouble()) { 236257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseRegisterAtStart(instr->value()); 236357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } else { 236457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseRegister(instr->value()); 236557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 2366a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 236737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org // We need a temporary register for write barrier of the map field. 236837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL; 236937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org 2370d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return new(zone()) LStoreNamedField(obj, val, temp); 2371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2375c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2376fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* obj = 23779aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 23789aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2379a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2380c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); 2381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(result, instr); 2382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2384a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2385160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2386c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2387bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* left = UseFixed(instr->left(), r1); 2388bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* right = UseFixed(instr->right(), r0); 2389c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall( 2390c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org DefineFixed(new(zone()) LStringAdd(context, left, right), r0), 2391c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org instr); 2392160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2393160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2394160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 23950a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 23964668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org LOperand* string = UseTempRegister(instr->string()); 23974668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org LOperand* index = UseTempRegister(instr->index()); 2398c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2399c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LStringCharCodeAt* result = 2400c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LStringCharCodeAt(context, string, index); 2401ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 24020a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 24030a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 24040a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 2405b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 2406b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org LOperand* char_code = UseRegister(instr->value()); 2407c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2408c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LStringCharFromCode* result = 2409c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org new(zone()) LStringCharFromCode(context, char_code); 2410b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2411b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 2412b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 2413b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 241494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 241594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org info()->MarkAsDeferredCalling(); 2416c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 241708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org LOperand* size = UseRegisterOrConstant(instr->size()); 241894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp1 = TempRegister(); 241994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp2 = TempRegister(); 2420c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); 242194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return AssignPointerMap(DefineAsRegister(result)); 242294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org} 242394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 242494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2425a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2426c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2427c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall( 2428c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org DefineFixed(new(zone()) LRegExpLiteral(context), r0), instr); 2429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 2433c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2434c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall( 2435c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org DefineFixed(new(zone()) LFunctionLiteral(context), r0), instr); 2436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2440e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ == 0); 2441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org allocator_->MarkAsOsrEntry(); 2442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_->last_environment()->set_ast_id(instr->ast_id()); 2443812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LOsrEntry); 2444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2448a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org LParameter* result = new(zone()) LParameter; 24492f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (instr->kind() == HParameter::STACK_PARAMETER) { 2450a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2451a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return DefineAsSpilled(result, spill_index); 2452a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } else { 2453e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->IsStub()); 2454e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallInterfaceDescriptor descriptor = 2455e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org info()->code_stub()->GetCallInterfaceDescriptor(); 2456ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org int index = static_cast<int>(instr->index()); 245742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org Register reg = descriptor.GetEnvironmentParameterRegister(index); 2458a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return DefineFixed(result, reg); 2459a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 2460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2464c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // Use an index that corresponds to the location in the unoptimized frame, 2465c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which the optimized frame will subsume. 2466c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int env_index = instr->index(); 2467c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int spill_index = 0; 2468c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (instr->environment()->is_parameter_index(env_index)) { 2469c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = chunk()->GetParameterStackSlot(env_index); 2470c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } else { 2471c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = env_index - instr->environment()->first_local_index(); 2472c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2473b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Retry(kTooManySpillSlotsNeededForOSR); 2474c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = 0; 2475c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 247604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 2477812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 2482c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2483c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), r0), instr); 2484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 24883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // There are no real uses of the arguments object. 24893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // arguments.length and element access are supported directly on 24903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // stack arguments, and any real arguments object use causes a bailout. 24913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // So this value is never used. 2492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2496594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2497662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 24981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2499594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // There are no real uses of a captured object. 2500594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return NULL; 2501594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 2502594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2503594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 250577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 2506c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org LOperand* args = UseRegister(instr->arguments()); 25077ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org LOperand* length = UseRegisterOrConstantAtStart(instr->length()); 25087ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 2509c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 2510a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2511a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2512a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 2514ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOperand* object = UseFixed(instr->value(), r0); 2515812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LToFastProperties* result = new(zone()) LToFastProperties(object); 2516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 2517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2521c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2522c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), r0)); 2523a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, r0), instr); 2524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 25274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 252837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return new(zone()) LTypeofIsAndBranch(UseRegister(instr->value())); 2529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2531d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 25324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 25334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HIsConstructCallAndBranch* instr) { 2534812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsConstructCallAndBranch(TempRegister()); 2535d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com} 2536d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2537d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2539662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 2540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 254504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org if (instr->is_function_entry()) { 2546c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2547c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return MarkAsCall(new(zone()) LStackCheck(context), instr); 254804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } else { 2549e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->is_backwards_branch()); 2550c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2551c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return AssignEnvironment( 2552c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org AssignPointerMap(new(zone()) LStackCheck(context))); 255304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 2554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 2558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* outer = current_block_->last_environment(); 2559f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org outer->set_ast_id(instr->ReturnId()); 2560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HConstant* undefined = graph()->GetConstantUndefined(); 2561a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* inner = outer->CopyForInlining(instr->closure(), 2562659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org instr->arguments_count(), 2563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org instr->function(), 256440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org undefined, 2565e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org instr->inlining_kind()); 2566b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org // Only replay binding of arguments object if it wasn't removed from graph. 2567b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2568b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org inner->Bind(instr->arguments_var(), instr->arguments_object()); 25698c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org } 2570ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org inner->BindContext(instr->closure_context()); 257156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org inner->set_entry(instr); 2572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_->UpdateEnvironment(inner); 2573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org chunk_->AddInlinedClosure(instr->closure()); 2574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 257928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org LInstruction* pop = NULL; 258028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 258128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org HEnvironment* env = current_block_->last_environment(); 258228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 258333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (env->entry()->arguments_pushed()) { 258428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int argument_count = env->arguments_environment()->parameter_count(); 258528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org pop = new(zone()) LDrop(argument_count); 2586e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->argument_delta() == -argument_count); 258728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 258828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 2589659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org HEnvironment* outer = current_block_->last_environment()-> 2590659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org DiscardInlined(false); 2591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_->UpdateEnvironment(outer); 259228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 259328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return pop; 2594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2597be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2598c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2599be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* object = UseFixed(instr->enumerable(), r0); 2600c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 2601be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY); 2602be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2603be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2604be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2605be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 2606be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* map = UseRegister(instr->map()); 260789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); 2608be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2609be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2610be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2611be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 2612be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2613be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* map = UseRegisterAtStart(instr->map()); 2614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 2615be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2616be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2617be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2618be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2619be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* object = UseRegister(instr->object()); 2620a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org LOperand* index = UseTempRegister(instr->index()); 262163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 262263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LInstruction* result = DefineSameAsFirst(load); 262363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org return AssignPointerMap(result); 2624be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2625be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 26261e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 26281e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->context()); 26291e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return new(zone()) LStoreFrameContext(context); 26301e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 26311e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26321e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26331e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext( 26341e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org HAllocateBlockContext* instr) { 26351e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 26361e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 26371e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LAllocateBlockContext* result = 26381e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org new(zone()) LAllocateBlockContext(context, function); 26391e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return MarkAsCall(DefineFixed(result, cp), instr); 26401e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 26411e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 2642a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} } // namespace v8::internal 2643