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. 4c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if V8_TARGET_ARCH_MIPS 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 94b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/hydrogen-osr.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/mips/lithium-codegen-mips.h" 12c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 13c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgnamespace v8 { 14c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgnamespace internal { 15c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 16c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DEFINE_COMPILE(type) \ 17c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org void L##type::CompileToNative(LCodeGen* generator) { \ 18c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org generator->Do##type(this); \ 19c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 20c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 21c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DEFINE_COMPILE 22c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 23c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG 24c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::VerifyCall() { 25c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Call instructions can use only fixed registers as temporaries and 26c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // outputs because all registers are blocked by the calling convention. 27c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Inputs operands must use a fixed register or use-at-start policy or 28c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // a non-register policy. 29e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Output() == NULL || 30c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated::cast(Output())->HasFixedPolicy() || 31c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org !LUnallocated::cast(Output())->HasRegisterPolicy()); 32c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (UseIterator it(this); !it.Done(); it.Advance()) { 33c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 34e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() || 35c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org operand->IsUsedAtStart()); 36c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 37c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (TempIterator it(this); !it.Done(); it.Advance()) { 38c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 39e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 40c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 41c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 42c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif 43c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 44c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 45c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) { 46c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("%s ", this->Mnemonic()); 47c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 48c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org PrintOutputOperandTo(stream); 49c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 50c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org PrintDataTo(stream); 51c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 52c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (HasEnvironment()) { 53c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" "); 54c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org environment()->PrintTo(stream); 55c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 56c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 57c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (HasPointerMap()) { 58c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" "); 59c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org pointer_map()->PrintTo(stream); 60c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 61c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 62c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 63c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 6488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) { 65c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("= "); 6688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org for (int i = 0; i < InputCount(); i++) { 67c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (i > 0) stream->Add(" "); 684cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (InputAt(i) == NULL) { 694cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org stream->Add("NULL"); 704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } else { 714cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org InputAt(i)->PrintTo(stream); 724cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 73c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 74c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 75c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 76c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 7788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 7888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org if (HasResult()) result()->PrintTo(stream); 79c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 80c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 81c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 82c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) { 83c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LGap::PrintDataTo(stream); 84c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LLabel* rep = replacement(); 85c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (rep != NULL) { 86c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" Dead block replaced with B%d", rep->block_id()); 87c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 88c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 89c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 90c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 91c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgbool LGap::IsRedundant() const { 92c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (int i = 0; i < 4; i++) { 93c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 94c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return false; 95c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 96c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 97c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 98c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return true; 99c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 101c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 102c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) { 103c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (int i = 0; i < 4; i++) { 104c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("("); 105c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (parallel_moves_[i] != NULL) { 106c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org parallel_moves_[i]->PrintDataTo(stream); 107c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 108c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(") "); 109c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 110c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 111c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 112c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 113c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgconst char* LArithmeticD::Mnemonic() const { 114c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org switch (op()) { 115c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::ADD: return "add-d"; 116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::SUB: return "sub-d"; 117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::MUL: return "mul-d"; 118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::DIV: return "div-d"; 119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::MOD: return "mod-d"; 120c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org default: 121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UNREACHABLE(); 122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 123c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 124c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 125c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 126c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 127c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgconst char* LArithmeticT::Mnemonic() const { 128c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org switch (op()) { 129c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::ADD: return "add-t"; 130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::SUB: return "sub-t"; 131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::MUL: return "mul-t"; 132c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::MOD: return "mod-t"; 133c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::DIV: return "div-t"; 134c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::BIT_AND: return "bit-and-t"; 135c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::BIT_OR: return "bit-or-t"; 136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::BIT_XOR: return "bit-xor-t"; 137fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org case Token::ROR: return "ror-t"; 138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::SHL: return "sll-t"; 139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::SAR: return "sra-t"; 140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org case Token::SHR: return "srl-t"; 141c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org default: 142c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UNREACHABLE(); 143c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 144c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 146c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 14832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const { 14932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return !gen->IsNextEmittedBlock(block_id()); 15032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 15132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 15232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 153c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) { 154c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("B%d", block_id()); 155c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 156c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 158c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) { 159c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 160c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 161c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 162c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 163c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1644e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 1654e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return new(zone()) LDebugBreak(); 1664e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 1674e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 168e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 169e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if "); 171c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org left()->PrintTo(stream); 172c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" %s ", Token::String(op())); 173c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org right()->PrintTo(stream); 174c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 175c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 176c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 177c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 178c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 179c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if is_object("); 180c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 181c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 182c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 183c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 184c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 185f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 186f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org stream->Add("if is_string("); 187c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 188f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 189f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org} 190f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 191f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 192c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 193c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if is_smi("); 194c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 196c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 197c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 198c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 199c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 200c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if is_undetectable("); 201c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 202c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 203c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 204c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 205c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 206f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 207f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org stream->Add("if string_compare("); 208c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org left()->PrintTo(stream); 209c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org right()->PrintTo(stream); 210f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 211f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org} 212f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 213f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 214c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 215c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if has_instance_type("); 216c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 217c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 218c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 219c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 220c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 221c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 222c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if has_cached_array_index("); 223c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 224c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 225c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 226c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 227c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 228c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 229c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if class_of_test("); 230c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(", \"%o\") then B%d else B%d", 232c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org *hydrogen()->class_name(), 233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org true_block_id(), 234c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org false_block_id()); 235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 237c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 238c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("if typeof "); 240c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 241c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" == \"%s\" then B%d else B%d", 242afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org hydrogen()->type_literal()->ToCString().get(), 243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org true_block_id(), false_block_id()); 244c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 246c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 247662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 248662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(" = "); 249662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org function()->PrintTo(stream); 250662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(".code_entry = "); 251662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org code_object()->PrintTo(stream); 252662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 253662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 254662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 2554c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 2564c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org stream->Add(" = "); 2574c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org base_object()->PrintTo(stream); 258ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org stream->Add(" + "); 259ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org offset()->PrintTo(stream); 2604c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org} 2614c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org 2624c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org 26326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 26426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("= "); 26526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org function()->PrintTo(stream); 26626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("#%d / ", arity()); 26726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 26826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 26926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 27026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 27126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 0; i < InputCount(); i++) { 27226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org InputAt(i)->PrintTo(stream); 27326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add(" "); 27426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("#%d / ", arity()); 276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 280c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org context()->PrintTo(stream); 281c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("[%d]", slot_index()); 282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 283c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 284c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 285c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 286c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org context()->PrintTo(stream); 287c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("[%d] <- ", slot_index()); 288c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org value()->PrintTo(stream); 289c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("= "); 294c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org function()->PrintTo(stream); 295c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" #%d / ", arity()); 296c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 298c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 299c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) { 300c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("= "); 301c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org constructor()->PrintTo(stream); 302c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" #%d / ", arity()); 303c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 304c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 305c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 306750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) { 307750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org stream->Add("= "); 308750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org constructor()->PrintTo(stream); 309750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org stream->Add(" #%d / ", arity()); 31007237aaaed914a17c1afd64234883bff619581d5palfia@homejinni.com ElementsKind kind = hydrogen()->elements_kind(); 311750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org stream->Add(" (%s) ", ElementsKindToString(kind)); 312750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 313750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 314750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 315c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 316c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org arguments()->PrintTo(stream); 317c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" length "); 318c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org length()->PrintTo(stream); 319c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" index "); 320c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org index()->PrintTo(stream); 321c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 322c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 323c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 324c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 325c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org object()->PrintTo(stream); 326f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 327f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << hydrogen()->access() << " <- "; 328f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org stream->Add(os.c_str()); 329c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org value()->PrintTo(stream); 330c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 331c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 332c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 333c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 334c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org object()->PrintTo(stream); 335c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("."); 336afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org stream->Add(String::cast(*name())->ToCString().get()); 337c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" <- "); 338c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org value()->PrintTo(stream); 339c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 340c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 341c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 3428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 343c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org elements()->PrintTo(stream); 344c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("["); 345c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org key()->PrintTo(stream); 3468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 347fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d]", base_offset()); 3488e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("]"); 3508e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 352c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 353c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 3548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 3558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org elements()->PrintTo(stream); 356c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add("["); 357c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org key()->PrintTo(stream); 3588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 359fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d] <-", base_offset()); 3608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("] <- "); 3628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 36346d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com 36446d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com if (value() == NULL) { 365e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hydrogen()->IsConstantHoleStore() && 36646d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com hydrogen()->value()->representation().IsDouble()); 36746d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com stream->Add("<the hole(nan)>"); 36846d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com } else { 36946d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com value()->PrintTo(stream); 37046d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com } 371c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 372c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 373c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 37483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 37583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org object()->PrintTo(stream); 37683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org stream->Add("["); 37783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org key()->PrintTo(stream); 37883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org stream->Add("] <- "); 37983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org value()->PrintTo(stream); 38083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org} 38183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 38283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org 383c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 384c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org object()->PrintTo(stream); 385c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 386c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 387c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 388c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 389c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 390c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Skip a slot if for a double-width slot. 391c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) spill_slot_count_++; 392c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return spill_slot_count_++; 393c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 394c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 396c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 397c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org int index = GetNextSpillIndex(kind); 398c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) { 3997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LDoubleStackSlot::Create(index, zone()); 400c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kind == GENERAL_REGISTERS); 4027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LStackSlot::Create(index, zone()); 403c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 404c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 405c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 406c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 40728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() { 408e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_unused()); 40928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org chunk_ = new(zone()) LPlatformChunk(info(), graph()); 4101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LPhase phase("L_Building chunk", chunk_); 411c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org status_ = BUILDING; 412c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 413c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // If compiling for OSR, reserve space for the unoptimized frame, 414c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which will be subsumed into this frame. 415c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (graph()->has_osr()) { 416c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 417c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 418c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 419c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 420c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 421c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 422c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (int i = 0; i < blocks->length(); i++) { 423c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HBasicBlock* next = NULL; 424c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (i < blocks->length() - 1) next = blocks->at(i + 1); 425c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org DoBasicBlock(blocks->at(i), next); 426c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (is_aborted()) return NULL; 427c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 428c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org status_ = DONE; 429c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return chunk_; 430c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 431c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 432c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 433c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 434812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 435812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Register::ToAllocationIndex(reg)); 436c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 437c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 438c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 439c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 440812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 441812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DoubleRegister::ToAllocationIndex(reg)); 442c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 445c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 446c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, ToUnallocated(fixed_register)); 447c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 448c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 449c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 450c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) { 451c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, ToUnallocated(reg)); 452c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 453c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 454c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 455c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) { 456812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 457c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 458c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 461c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, 462812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 463812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LUnallocated::USED_AT_START)); 464c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 465c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 466c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 467c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 468812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 470c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 471c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) { 473812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 474c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 475c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 476c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 477c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) { 478812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 479c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated::USED_AT_START)); 480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 481c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 482c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 483c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 484c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return value->IsConstant() 485c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 486c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : Use(value); 487c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 488c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 489c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 490c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 491c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return value->IsConstant() 492c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : UseAtStart(value); 494c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 495c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 496c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 497c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 498c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return value->IsConstant() 499c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 500c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : UseRegister(value); 501c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 502c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 503c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return value->IsConstant() 506c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : UseRegisterAtStart(value); 508c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 509c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 511f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) { 512f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return chunk_->DefineConstantOperand(HConstant::cast(value)); 513f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 514f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 515f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 516c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseAny(HValue* value) { 517c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return value->IsConstant() 518c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 519812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 520c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 524c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (value->EmitAtUses()) { 525c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HInstruction* instr = HInstruction::cast(value); 526c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org VisitInstruction(instr); 527c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 528994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org operand->set_virtual_register(value->id()); 529c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return operand; 530c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 531c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 532c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 53326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 534c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* result) { 535994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org result->set_virtual_register(current_instruction_->id()); 536c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr->set_result(result); 537c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return instr; 538c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 539c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 540c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 541c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister( 54226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 543812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 544812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 545c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 546c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 547c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled( 54926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, int index) { 550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 553c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 554c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 555c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst( 55626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 557812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 558812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 559c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 560c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 561c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 562c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineFixed( 56326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, Register reg) { 564c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Define(instr, ToUnallocated(reg)); 565c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 566c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 567c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 568c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble( 56926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, DoubleRegister reg) { 570c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Define(instr, ToUnallocated(reg)); 571c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 572c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 573c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 574c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 575c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HEnvironment* hydrogen_env = current_block_->last_environment(); 576c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int argument_index_accumulator = 0; 577594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ZoneList<HValue*> objects_to_materialize(0, zone()); 578c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr->set_environment(CreateEnvironment(hydrogen_env, 579594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org &argument_index_accumulator, 580594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org &objects_to_materialize)); 581c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return instr; 582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 584c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 585c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 586c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HInstruction* hinstr, 587c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org CanDeoptimize can_deoptimize) { 58859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org info()->MarkAsNonDeferredCalling(); 589c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG 590c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr->VerifyCall(); 591c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif 592c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr->MarkAsCall(); 593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr = AssignPointerMap(instr); 594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 595c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // If instruction does not have side-effects lazy deoptimization 596c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // after the call will try to deoptimize to the point before the call. 597c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Thus we still need to attach environment to this call even if 598c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // call sequence can not deoptimize eagerly. 599c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org bool needs_environment = 600c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org !hinstr->HasObservableSideEffects(); 602c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (needs_environment && !instr->HasEnvironment()) { 603c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr = AssignEnvironment(instr); 604da0c8284c47004231268322ae983e4bd2eb5aff8machenbach@chromium.org // We can't really figure out if the environment is needed or not. 605da0c8284c47004231268322ae983e4bd2eb5aff8machenbach@chromium.org instr->environment()->set_has_been_used(); 606c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 607c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return instr; 609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 611c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 612c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 613e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->HasPointerMap()); 61471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org instr->set_pointer_map(new(zone()) LPointerMap(zone())); 615c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return instr; 616c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 617c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 618c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 619c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLUnallocated* LChunkBuilder::TempRegister() { 620812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LUnallocated* operand = 621812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 6222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int vreg = allocator_->GetVirtualRegister(); 6232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (!allocator_->AllocationOk()) { 624594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 62557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org vreg = 0; 6262bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 6272bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org operand->set_virtual_register(vreg); 628c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return operand; 629c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 631c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 632d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() { 633d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LUnallocated* operand = 634d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); 635d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org int vreg = allocator_->GetVirtualRegister(); 636d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org if (!allocator_->AllocationOk()) { 637d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 638d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org vreg = 0; 639d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 640d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org operand->set_virtual_register(vreg); 641d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return operand; 642d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org} 643d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 644d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 645c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) { 646c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* operand = ToUnallocated(reg); 647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 648c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return operand; 649c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 650c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 651c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 652c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* operand = ToUnallocated(reg); 654e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 655c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return operand; 656c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 657c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 658c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 659c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 660812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LLabel(instr->block()); 661c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 662c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 663c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 66446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 66546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 66646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 66746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 66846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 669d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 670d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org UNREACHABLE(); 671d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return NULL; 672d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org} 673d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 674d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 675c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 676812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LDeoptimize); 677c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 678c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 679c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op, 681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HBitwiseBinaryOperation* instr) { 682528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 683e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 684e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 685528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 686c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 687528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HValue* right_value = instr->right(); 688528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = NULL; 689528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int constant_value = 0; 690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool does_deopt = false; 691528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (right_value->IsConstant()) { 692528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HConstant* constant = HConstant::cast(right_value); 693528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = chunk_->DefineConstantOperand(constant); 694528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org constant_value = constant->Integer32Value() & 0x1f; 695528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Left shifts can deoptimize if we shift by > 0 and the result cannot be 696528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // truncated to smi. 697528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmi() && constant_value > 0) { 698528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 699528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 700528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 701528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = UseRegisterAtStart(right_value); 702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 7032f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 704528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Shift operations can only deoptimize if we do a logical shift 705528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // by 0 and the result cannot be truncated to int32. 706528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::SHR && constant_value == 0) { 707528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (FLAG_opt_safe_uint32_operations) { 708528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckFlag(HInstruction::kUint32); 709528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 710528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 711528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 7122f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } 7132f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 714528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LInstruction* result = 715528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt)); 716528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return does_deopt ? AssignEnvironment(result) : result; 717528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 718528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(op, instr); 719528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 720c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 721c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 724c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HArithmeticBinaryOperation* instr) { 725e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 727e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::MOD) { 729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseFixedDouble(instr->left(), f2); 730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseFixedDouble(instr->right(), f4); 731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 732528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // We call a C function for double modulo. It can't trigger a GC. We need 733528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // to use fixed result register for the call. 734528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // TODO(fschneider): Allow any register as input registers. 735528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return MarkAsCall(DefineFixedDouble(result, f2), instr); 736528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 737528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 738528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 739528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineAsRegister(result); 741528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 742c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 743c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 744c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 746528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HBinaryOperation* instr) { 747c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HValue* left = instr->left(); 748c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HValue* right = instr->right(); 749e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(left->representation().IsTagged()); 750e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(right->representation().IsTagged()); 751fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 752c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left_operand = UseFixed(left, a1); 753c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* right_operand = UseFixed(right, a0); 754812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LArithmeticT* result = 755fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LArithmeticT(op, context, left_operand, right_operand); 756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 758c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 759c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 761e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_building()); 762c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current_block_ = block; 763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org next_block_ = next_block; 764c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (block->IsStartBlock()) { 765c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org block->UpdateEnvironment(graph_->start_environment()); 766c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org argument_count_ = 0; 767c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (block->predecessors()->length() == 1) { 768c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // We have a single predecessor => copy environment and outgoing 769c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // argument count from the predecessor. 770e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(block->phis()->length() == 0); 771c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 772c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HEnvironment* last_environment = pred->last_environment(); 773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_environment != NULL); 774c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Only copy the environment, if it is later used again. 775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (pred->end()->SecondSuccessor() == NULL) { 776e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->end()->FirstSuccessor() == block); 777c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 778c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 779c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 780c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org last_environment = last_environment->Copy(); 781c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 782c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 783c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org block->UpdateEnvironment(last_environment); 784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->argument_count() >= 0); 785c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org argument_count_ = pred->argument_count(); 786c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 787c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // We are at a state join => process phis. 788c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 789c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // No need to copy the environment, it cannot be used later. 790c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HEnvironment* last_environment = pred->last_environment(); 791c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (int i = 0; i < block->phis()->length(); ++i) { 792c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HPhi* phi = block->phis()->at(i); 793ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org if (phi->HasMergedIndex()) { 79477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org last_environment->SetValueAt(phi->merged_index(), phi); 79577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 796c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 797c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (int i = 0; i < block->deleted_phis()->length(); ++i) { 79877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (block->deleted_phis()->at(i) < last_environment->length()) { 79977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org last_environment->SetValueAt(block->deleted_phis()->at(i), 80077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org graph_->GetConstantUndefined()); 80177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 802c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 803c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org block->UpdateEnvironment(last_environment); 804c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Pick up the outgoing argument count of one of the predecessors. 805c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org argument_count_ = pred->argument_count(); 806c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 807c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HInstruction* current = block->first(); 808c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int start = chunk_->instructions()->length(); 809c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org while (current != NULL && !is_aborted()) { 810c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Code for constants in registers is generated lazily. 811c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (!current->EmitAtUses()) { 812c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org VisitInstruction(current); 813c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 814c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current = current->next(); 815c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 816c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org int end = chunk_->instructions()->length() - 1; 817c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (end >= start) { 818c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org block->set_first_instruction_index(start); 819c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org block->set_last_instruction_index(end); 820c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 821c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org block->set_argument_count(argument_count_); 822c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org next_block_ = NULL; 823c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current_block_ = NULL; 824c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 825c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 826c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 827c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 828c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HInstruction* old_current = current_instruction_; 829c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current_instruction_ = current; 830d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 831d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* instr = NULL; 832d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org if (current->CanReplaceWithDummyUses()) { 833935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (current->OperandCount() == 0) { 834935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) LDummy()); 835935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } else { 836e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!current->OperandAt(0)->IsControlInstruction()); 837935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) 838935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LDummyUse(UseAny(current->OperandAt(0)))); 839935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } 840d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org for (int i = 1; i < current->OperandCount(); ++i) { 84109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org if (current->OperandAt(i)->IsControlInstruction()) continue; 842d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* dummy = 843d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 844d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org dummy->set_hydrogen_value(current); 845d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org chunk_->AddInstruction(dummy, current_block_); 846d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 847d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } else { 8488d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HBasicBlock* successor; 8498d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org if (current->IsControlInstruction() && 8508d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 8518d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org successor != NULL) { 8528d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = new(zone()) LGoto(successor); 8538d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } else { 8548d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = current->CompileToLithium(this); 8558d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } 856d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 857d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 858d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org argument_count_ += current->argument_delta(); 859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ >= 0); 860c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 861c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (instr != NULL) { 862011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(instr, current); 863011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 864011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 865011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org current_instruction_ = old_current; 866011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org} 867011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 868011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 869011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr, 870011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HInstruction* hydrogen_val) { 871011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org// Associate the hydrogen instruction first, since we may need it for 872011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 873011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->set_hydrogen_value(hydrogen_val); 874fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org 875f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG 876011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Make sure that the lithium instruction has either no fixed register 877011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // constraints in temps or the result OR no uses that are only used at 878011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // start. If this invariant doesn't hold, the register allocator can decide 879011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // to insert a split of a range immediately before the instruction due to an 880011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // already allocated register needing to be used for the instruction's fixed 881011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // register constraint. In this case, The register allocator won't see an 882011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // interference between the split child and the use-at-start (it would if 883011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the it was just a plain use), so it is free to move the split child into 884011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the same register that is used for the use-at-start. 885011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // See https://code.google.com/p/chromium/issues/detail?id=201590 886011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (!(instr->ClobbersRegisters() && 887011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->ClobbersDoubleRegisters(isolate()))) { 888011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int fixed = 0; 889011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int used_at_start = 0; 890011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (UseIterator it(instr); !it.Done(); it.Advance()) { 891011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 892011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->IsUsedAtStart()) ++used_at_start; 893011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 894011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->Output() != NULL) { 895011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 896011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 897011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (TempIterator it(instr); !it.Done(); it.Advance()) { 898011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->HasFixedPolicy()) ++fixed; 900f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 901e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(fixed == 0 || used_at_start == 0); 902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 903f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif 904f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignPointerMap(instr); 907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_environments && !instr->HasEnvironment()) { 909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignEnvironment(instr); 910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 911011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(instr, current_block_); 912011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 913011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->IsCall()) { 914011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* instruction_needing_environment = NULL; 916011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (hydrogen_val->HasObservableSideEffects()) { 917011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment = instr; 919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org sim->ReplayEnvironment(current_block_->last_environment()); 920011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org hydrogen_value_for_lazy_bailout = sim; 921c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 922011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 923011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 924011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(bailout, current_block_); 925011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instruction_needing_environment != NULL) { 926011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Store the lazy deopt environment with the instruction if needed. 927011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Right now it is only used for LInstanceOfKnownGlobal. 928011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment-> 929011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 930486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 931c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 932c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 933c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 934c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 935c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 936d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org return new(zone()) LGoto(instr->FirstSuccessor()); 937c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 938c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 939c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 940c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 941d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org HValue* value = instr->value(); 9424edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org Representation r = value->representation(); 943f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com HType type = value->type(); 9441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ToBooleanStub::Types expected = instr->expected_input_types(); 9454edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 9464edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org 9474edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 9484edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 9494edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 9504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!easy_case && 9514edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 9524edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org !expected.IsGeneric())) { 9534edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org branch = AssignEnvironment(branch); 954f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 9554edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return branch; 956c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 957c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 958c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 959c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 960e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 961c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 962c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* temp = TempRegister(); 963812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LCmpMapAndBranch(value, temp); 964c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 965c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 966c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 967c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 96877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 969812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister( 970812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LArgumentsLength(UseRegister(length->value()))); 971c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 972c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 973c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 974c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 97577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 976b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org return DefineAsRegister(new(zone()) LArgumentsElements); 977c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 978c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 979c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 980c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 981fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 982c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInstanceOf* result = 983fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LInstanceOf(context, UseFixed(instr->left(), a0), 984812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org UseFixed(instr->right(), a1)); 985c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 986c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 987c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 988c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 989c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HInstanceOfKnownGlobal* instr) { 991c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInstanceOfKnownGlobal* result = 992fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LInstanceOfKnownGlobal( 993fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org UseFixed(instr->context(), cp), 994fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org UseFixed(instr->left(), a0), 995fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org FixedTemp(t0)); 996c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 997c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 998c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 999c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 10002c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 10012c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org LOperand* receiver = UseRegisterAtStart(instr->receiver()); 10022c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 10032c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 1004ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return AssignEnvironment(DefineAsRegister(result)); 10052c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org} 10062c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 10072c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 1008c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 1009c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* function = UseFixed(instr->function(), a1); 1010c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* receiver = UseFixed(instr->receiver(), a0); 1011c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* length = UseFixed(instr->length(), a2); 1012c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* elements = UseFixed(instr->elements(), a3); 1013812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LApplyArguments* result = new(zone()) LApplyArguments(function, 1014812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org receiver, 1015812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org length, 1016812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org elements); 1017c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 1018c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1019c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1020c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1021011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 1022011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int argc = instr->OperandCount(); 1023011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0; i < argc; ++i) { 1024011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LOperand* argument = Use(instr->argument(i)); 1025011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(new(zone()) LPushArgument(argument), instr); 1026011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 1027011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org return NULL; 1028c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1029c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1030c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1031662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry( 1032662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org HStoreCodeEntry* store_code_entry) { 1033662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* function = UseRegister(store_code_entry->function()); 1034662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 1035662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org return new(zone()) LStoreCodeEntry(function, code_object); 1036662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 1037662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 1038662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 10394c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1040ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org HInnerAllocatedObject* instr) { 1041ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1042ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1043ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return DefineAsRegister( 1044ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org new(zone()) LInnerAllocatedObject(base_object, offset)); 10454c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org} 10464c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org 10474c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org 1048c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 1049812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return instr->HasNoUses() 1050812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ? NULL 1051812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : DefineAsRegister(new(zone()) LThisFunction); 1052c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1053c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1054c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1055c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1056fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org if (instr->HasNoUses()) return NULL; 1057fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org 1058fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org if (info()->IsStub()) { 1059fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return DefineFixed(new(zone()) LContext, cp); 106059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 106159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 1062fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return DefineAsRegister(new(zone()) LContext); 1063c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1064c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1065c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1066f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1067fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1068fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 1069f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org} 1070f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 1071f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org 107226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction( 107326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallJSFunction* instr) { 107426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* function = UseFixed(instr->function(), a1); 107526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 107626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallJSFunction* result = new(zone()) LCallJSFunction(function); 107726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 107826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 107926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 108026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 108126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 108226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor( 108326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallWithDescriptor* instr) { 10849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org CallInterfaceDescriptor descriptor = instr->descriptor(); 108526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 108626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 108726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 108826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(target, zone()); 108926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 1; i < instr->OperandCount(); i++) { 10909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* op = 10919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1)); 109226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(op, zone()); 109326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 109426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 109526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 109626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org descriptor, ops, zone()); 109726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 1098c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1099c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1101e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache( 1102e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org HTailCallThroughMegamorphicCache* instr) { 1103e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1104e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* receiver_register = 1105e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister()); 1106e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* name_register = 1107e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->name(), LoadDescriptor::NameRegister()); 1108e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org // Not marked as call. It can't deoptimize, and it never returns. 1109e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return new (zone()) LTailCallThroughMegamorphicCache( 1110e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org context, receiver_register, name_register); 1111e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 1112e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1113e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1114c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1115fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* function = UseFixed(instr->function(), a1); 1117fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 1118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1120c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org switch (instr->op()) { 1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFloor: 1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFloor(instr); 1126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathRound: 1127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathRound(instr); 1128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFround: 1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFround(instr); 1130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathAbs: 1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathAbs(instr); 1132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathLog: 1133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathLog(instr); 1134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathExp: 1135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathExp(instr); 1136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathSqrt: 1137dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathSqrt(instr); 1138dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathPowHalf: 1139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathPowHalf(instr); 1140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathClz32: 1141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathClz32(instr); 1142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org default: 1143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org UNREACHABLE(); 1144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return NULL; 1145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1146c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1148c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1150e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1151e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 1152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseFixedDouble(instr->value(), f4); 11534f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr); 1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LMathClz32* result = new(zone()) LMathClz32(input); 1160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 1161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1165e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 11678e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp1 = TempRegister(); 1169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp2 = TempRegister(); 1170d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* double_temp = TempDoubleRegister(); 1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2); 1172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineAsRegister(result); 1173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf. 1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseFixedDouble(instr->value(), f8); 1179d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp = TempDoubleRegister(); 1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); 1181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineFixedDouble(result, f4); 1182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1186dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1187dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LMathFround* result = new (zone()) LMathFround(input); 1188dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DefineAsRegister(result); 1189dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org} 1190dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1191dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1193fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org Representation r = instr->value()->representation(); 1194fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) 1195fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org ? NULL 1196fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org : UseFixed(instr->context(), cp); 1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 11984edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* result = 11994edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org DefineAsRegister(new(zone()) LMathAbs(context, input)); 12004edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 12014edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!r.IsDouble()) result = AssignEnvironment(result); 12024edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp = TempRegister(); 1209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathFloor* result = new(zone()) LMathFloor(input, temp); 1210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 1215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathSqrt* result = new(zone()) LMathSqrt(input); 1217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineAsRegister(result); 1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1223d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp = TempDoubleRegister(); 1224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathRound* result = new(zone()) LMathRound(input, temp); 1225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1229c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 1230fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* constructor = UseFixed(instr->constructor(), a1); 1232fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LCallNew* result = new(zone()) LCallNew(context, constructor); 1233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 1234c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1237750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1238fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1239750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org LOperand* constructor = UseFixed(instr->constructor(), a1); 1240fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 1241750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 1242750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 1243750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1244750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 1245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1246fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1247c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org LOperand* function = UseFixed(instr->function(), a1); 1248ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org LCallFunction* call = new(zone()) LCallFunction(context, function); 1249a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return MarkAsCall(DefineFixed(call, v0), instr); 1250c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1251c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1253c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1254fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1255fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr); 1256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1257c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1258c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1259fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1260fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org return DoShift(Token::ROR, instr); 1261fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org} 1262fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 1263fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org 1264c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1265c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoShift(Token::SHR, instr); 1266c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1268c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1269c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1270c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoShift(Token::SAR, instr); 1271c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1272c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1273c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1274c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) { 1275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoShift(Token::SHL, instr); 1276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1280fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 1284c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1285906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1286906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 1287812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LBitI(left, right)); 1288c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1289528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(instr->op(), instr); 1290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 129400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1295e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1296e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1297e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 129800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 129900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 130000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 130100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org dividend, divisor)); 130200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 130300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 130400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 130500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org divisor != 1 && divisor != -1)) { 130600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org result = AssignEnvironment(result); 130700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org } 130800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org return result; 130900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org} 131000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org 131100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org 131200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1313e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1314e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1315e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 131600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 131700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 131800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( 131900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org dividend, divisor)); 132000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org if (divisor == 0 || 132100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 132200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 132300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org result = AssignEnvironment(result); 132400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org } 132500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org return result; 132600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org} 132700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org 132800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org 13294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1330e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1331e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1332e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1333ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1334ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 13355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org LOperand* temp = TempRegister(); 13364edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* result = 13375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); 13384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 13394edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 13404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && 13414edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) || 13424edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org (!instr->IsMathFloorOfDiv() && 13434edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { 13444edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org result = AssignEnvironment(result); 13454edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } 13464edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 1347ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1348ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1349ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1350c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1351528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 135200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org if (instr->RightIsPowerOf2()) { 135300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org return DoDivByPowerOf2I(instr); 135400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org } else if (instr->right()->IsConstant()) { 135500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org return DoDivByConstI(instr); 135600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org } else { 135700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org return DoDivI(instr); 135800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org } 1359528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1360528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::DIV, instr); 1361c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1362c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticT(Token::DIV, instr); 1363c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1364c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1365c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1366c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1367bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1368bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1369bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1370381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I( 1371381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org dividend, divisor)); 1372381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1373381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1374381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1375381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } 1376381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1377ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1378ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1379b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 1380ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1381e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1384ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1385bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1386fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org LOperand* temp = 1387fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 1388fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 1389fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org NULL : TempRegister(); 1390fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org LInstruction* result = DefineAsRegister( 1391fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org new(zone()) LFlooringDivByConstI(dividend, divisor, temp)); 1392fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org if (divisor == 0 || 1393fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 1394fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org result = AssignEnvironment(result); 1395fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org } 1396fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org return result; 1397b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org} 1398b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 1399b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 14004edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1403e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 14044edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 14054edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 14064edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor); 14074edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return AssignEnvironment(DefineAsRegister(div)); 14084edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org} 14094edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org 14104edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org 1411b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1412bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1413bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoFlooringDivByPowerOf2I(instr); 1414fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org } else if (instr->right()->IsConstant()) { 1415fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org return DoFlooringDivByConstI(instr); 1416ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } else { 14174edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return DoFlooringDivI(instr); 1418ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } 1419ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1420ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1421ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1423e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1424e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1426ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1427ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1428486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1429486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1430e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1432486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1433486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1434486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1435ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1436ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1437ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 143800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1439e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1440e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1441e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 144200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 144300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 144400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( 144500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org dividend, divisor)); 144600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 144700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org result = AssignEnvironment(result); 144800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org } 144900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org return result; 145000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org} 145100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org 145200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org 1453ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1454e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1455e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1456e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1457ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1458ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1459486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LModI( 1460486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1461486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1462486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1463486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1464486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1465486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1466b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org} 1467b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 1468b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org 1469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1470fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1471ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr); 1472528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1473528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::MOD, instr); 14742f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } else { 1475528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(Token::MOD, instr); 1476c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1477c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1478c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1479c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1481fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1482e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1483e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1484c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org HValue* left = instr->BetterLeftOperand(); 1485c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org HValue* right = instr->BetterRightOperand(); 1486c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* left_op; 1487c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LOperand* right_op; 1488c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1489c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero); 1490c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1491c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (right->IsConstant()) { 1492c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org HConstant* constant = HConstant::cast(right); 1493c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org int32_t constant_value = constant->Integer32Value(); 1494c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // Constants -1, 0 and 1 can be optimized if the result can overflow. 1495c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // For other constants, it can be optimized only without overflow. 1496c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) { 1497c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org left_op = UseRegisterAtStart(left); 1498c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org right_op = UseConstant(right); 1499c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org } else { 1500c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (bailout_on_minus_zero) { 1501c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org left_op = UseRegister(left); 1502c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org } else { 1503c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org left_op = UseRegisterAtStart(left); 1504c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org } 1505c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org right_op = UseRegister(right); 1506c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org } 1507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1508c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (bailout_on_minus_zero) { 1509c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org left_op = UseRegister(left); 1510c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org } else { 1511c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org left_op = UseRegisterAtStart(left); 1512c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org } 1513c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org right_op = UseRegister(right); 1514c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1515c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org LMulI* mul = new(zone()) LMulI(left_op, right_op); 1516c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (can_overflow || bailout_on_minus_zero) { 1517f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com AssignEnvironment(mul); 1518f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1519f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return DefineAsRegister(mul); 1520c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (instr->representation().IsDouble()) { 15225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { 15234b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org if (instr->HasOneUse() && instr->uses().value()->IsAdd()) { 152459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org HAdd* add = HAdd::cast(instr->uses().value()); 152559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (instr == add->left()) { 152659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // This mul is the lhs of an add. The add and mul will be folded 152759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // into a multiply-add. 152859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return NULL; 152959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 153059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (instr == add->right() && !add->left()->IsMul()) { 153159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // This mul is the rhs of an add, where the lhs is not another mul. 153259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // The add and mul will be folded into a multiply-add. 153359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return NULL; 153459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 153559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 153659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 1537c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticD(Token::MUL, instr); 1538c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1539c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticT(Token::MUL, instr); 1540c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1541c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1542c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1543c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1545fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1546e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1547e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1549c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LSubI* sub = new(zone()) LSubI(left, right); 1551c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInstruction* result = DefineAsRegister(sub); 1552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1553c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org result = AssignEnvironment(result); 1554c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1555c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return result; 1556c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (instr->representation().IsDouble()) { 1557c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticD(Token::SUB, instr); 1558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1559c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticT(Token::SUB, instr); 1560c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1561c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1562c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1563c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 156459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { 156559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org LOperand* multiplier_op = UseRegisterAtStart(mul->left()); 156659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); 156759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org LOperand* addend_op = UseRegisterAtStart(addend); 156859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, 156959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org multiplicand_op)); 157059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org} 157159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 157259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 1573c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1574fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1575e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1576e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1577906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1578906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 1579812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LAddI* add = new(zone()) LAddI(left, right); 1580c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInstruction* result = DefineAsRegister(add); 1581c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org result = AssignEnvironment(result); 1583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1584c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return result; 158537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org } else if (instr->representation().IsExternal()) { 1586e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsExternal()); 1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsInteger32()); 1588e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 158937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 159037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 159137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LAddI* add = new(zone()) LAddI(left, right); 159237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LInstruction* result = DefineAsRegister(add); 159337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return result; 1594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (instr->representation().IsDouble()) { 15955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { 159659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (instr->left()->IsMul()) 159759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); 159859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org 159959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org if (instr->right()->IsMul()) { 1600e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->left()->IsMul()); 160159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); 160259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 160359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 1604c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticD(Token::ADD, instr); 1605c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1606c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DoArithmeticT(Token::ADD, instr); 1607c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1611471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1612471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* left = NULL; 1613471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* right = NULL; 1614fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1615e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1617906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 1618906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org right = UseOrConstantAtStart(instr->BetterRightOperand()); 1619471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } else { 1620e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1621e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1622e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1623471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org left = UseRegisterAtStart(instr->left()); 1624471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org right = UseRegisterAtStart(instr->right()); 1625471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 1626471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return DefineAsRegister(new(zone()) LMathMinMax(left, right)); 1627471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org} 1628471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1629471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1631e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1632c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // We call a C function for double power. It can't trigger a GC. 1633c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // We need to use fixed result register for the call. 1634c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Representation exponent_type = instr->right()->representation(); 1635e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1636c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left = UseFixedDouble(instr->left(), f2); 16376313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org LOperand* right = 16386313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org exponent_type.IsDouble() 16396313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org ? UseFixedDouble(instr->right(), f4) 16406313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 1641812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LPower* result = new(zone()) LPower(left, right); 164264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return MarkAsCall(DefineFixedDouble(result, f0), 1643c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr, 1644c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org CAN_DEOPTIMIZE_EAGERLY); 1645c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1646c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1647c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1648c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1649e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1650e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1651fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1652c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left = UseFixed(instr->left(), a1); 1653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* right = UseFixed(instr->right(), a0); 1654fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LCmpT* result = new(zone()) LCmpT(context, left, right); 1655c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 1656c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1657c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1658c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1659e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1660e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HCompareNumericAndBranch* instr) { 16618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Representation r = instr->representation(); 1662b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (r.IsSmiOrInteger32()) { 1663e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(r)); 1664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(r)); 1665c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 1666c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1667e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1668c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1669e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(r.IsDouble()); 1670e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1672c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1673c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 1674e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1675c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1676c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1677c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1678c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1679c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 1680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HCompareObjectEqAndBranch* instr) { 1681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1682c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* right = UseRegisterAtStart(instr->right()); 1683812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LCmpObjectEqAndBranch(left, right); 1684c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1685c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1686c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1687c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.comLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1688c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com HCompareHoleAndBranch* instr) { 1689528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return new(zone()) LCmpHoleAndBranch(value); 1691c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com} 1692c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com 1693c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com 16940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 16950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org HCompareMinusZeroAndBranch* instr) { 16960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* value = UseRegister(instr->value()); 16970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* scratch = TempRegister(); 16980cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 16990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 17000cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 17010cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 1702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1703e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1704c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* temp = TempRegister(); 1705812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()), 1706812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org temp); 1707c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1708c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1709c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1710f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1711e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1712f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org LOperand* temp = TempRegister(); 1713812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()), 1714812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org temp); 1715f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org} 1716f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 1717f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 1718c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1719e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1720812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1721c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1724c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 1725c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HIsUndetectableAndBranch* instr) { 1726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1727812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsUndetectableAndBranch( 1728812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org UseRegisterAtStart(instr->value()), TempRegister()); 1729c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1730c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1731c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1732f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgLInstruction* LChunkBuilder::DoStringCompareAndBranch( 1733f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org HStringCompareAndBranch* instr) { 1734e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1735e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1736fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 1737f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org LOperand* left = UseFixed(instr->left(), a1); 1738f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org LOperand* right = UseFixed(instr->right(), a0); 1739812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LStringCompareAndBranch* result = 1740fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LStringCompareAndBranch(context, left, right); 1741f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org return MarkAsCall(result, instr); 1742f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org} 1743f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 1744f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org 1745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 1746c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HHasInstanceTypeAndBranch* instr) { 1747e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1748812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1749812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LHasInstanceTypeAndBranch(value); 1750c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1751c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1752c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1753c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 1754c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HGetCachedArrayIndex* instr) { 1755e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1758812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 1759c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1761c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1762c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 1763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HHasCachedArrayIndexAndBranch* instr) { 1764e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1765812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LHasCachedArrayIndexAndBranch( 1766c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UseRegisterAtStart(instr->value())); 1767c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1768c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1769c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1770c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 1771c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HClassOfTestAndBranch* instr) { 1772e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1773812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()), 1774812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org TempRegister()); 1775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1776c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1777c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 177878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 177978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org LOperand* map = UseRegisterAtStart(instr->value()); 178078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org return DefineAsRegister(new(zone()) LMapEnumLength(map)); 178178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org} 178278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org 178378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org 1784154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 1785154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* object = UseFixed(instr->value(), a0); 17867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org LDateField* result = 17877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org new(zone()) LDateField(object, FixedTemp(a1), instr->index()); 1788de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 1789154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org} 1790154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1791154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1792e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1793e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 1794e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1795e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 1796e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1797e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1798e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1799a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 18009af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 18019af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* index = FLAG_debug_code 18029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ? UseRegisterAtStart(instr->index()) 18039af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org : UseRegisterOrConstantAtStart(instr->index()); 18049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 18059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL; 18069af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return new(zone()) LSeqStringSetChar(context, string, index, value); 1807a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org} 1808a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 1809a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 1810c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1811a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code && instr->skip_check()) return NULL; 1812a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1813a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* length = !index->IsConstantOperand() 1814a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ? UseRegisterOrConstantAtStart(instr->length()) 1815a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org : UseRegisterAtStart(instr->length()); 1816a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LInstruction* result = new(zone()) LBoundsCheck(index, length); 1817a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code || !instr->skip_check()) { 1818a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org result = AssignEnvironment(result); 1819a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 1820a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return result; 1821c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1822c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1823c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1824876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 1825876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org HBoundsCheckBaseIndexInformation* instr) { 1826876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org UNREACHABLE(); 1827876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org return NULL; 1828876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org} 1829876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1830876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1831c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 1832c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // The control instruction marking the end of a block that completed 1833c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // abruptly (e.g., threw an exception). There is nothing specific to do. 1834c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return NULL; 1835c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org} 1836c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1837c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1838c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 1839c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 1840c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1841c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1842c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1843c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1844c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // All HForceRepresentation instructions should be eliminated in the 1845c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // representation change phase of Hydrogen. 1846c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UNREACHABLE(); 1847c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 1848c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1849c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1850c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1851c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) { 1852c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Representation from = instr->from(); 1853c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Representation to = instr->to(); 18544edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org HValue* val = instr->value(); 1855a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (from.IsSmi()) { 1856a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (to.IsTagged()) { 18574edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegister(val); 1858a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1859a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1860a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org from = Representation::Tagged(); 1861a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1862c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (from.IsTagged()) { 1863c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (to.IsDouble()) { 18644edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegister(val); 18654edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 18664edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 18674edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 1868a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1869a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 187053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org if (val->type().IsSmi()) { 187153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 187253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org } 1873c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 1874c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 1876662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (val->type().IsSmi() || val->representation().IsSmi()) { 18774edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 18784edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 1879c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 18804edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegister(val); 1881c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* temp1 = TempRegister(); 1882d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LOperand* temp2 = TempDoubleRegister(); 18834edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* result = 18844edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); 1885da0c8284c47004231268322ae983e4bd2eb5aff8machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 18864edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 1887c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1888c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1889c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (from.IsDouble()) { 1890c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (to.IsTagged()) { 189159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org info()->MarkAsDeferredCalling(); 18924edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegister(val); 1893c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* temp1 = TempRegister(); 1894c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* temp2 = TempRegister(); 1895c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* result_temp = TempRegister(); 1896812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 18974edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return AssignPointerMap(Define(result, result_temp)); 1898a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 18994edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegister(val); 19008fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org return AssignEnvironment( 19018fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org DefineAsRegister(new(zone()) LDoubleToSmi(value))); 1902c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1903e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 19044edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegister(val); 19054edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 19064edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 19074edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 1908c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1909c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (from.IsInteger32()) { 191059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org info()->MarkAsDeferredCalling(); 1911c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (to.IsTagged()) { 1912381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (!instr->CheckFlag(HValue::kCanOverflow)) { 19134edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1914381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiTag(value)); 1915381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } else if (val->CheckFlag(HInstruction::kUint32)) { 19164edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1917bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp1 = TempRegister(); 1918bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp2 = TempRegister(); 1919bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 19204edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 1921c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 19224edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1923bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp1 = TempRegister(); 1924bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp2 = TempRegister(); 1925bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 19264edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 1927c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1928a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1929a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1930381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1931381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1932381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1933a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1934381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1935c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1936e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsDouble()); 19374edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 19384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 193978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } else { 19404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val))); 194178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org } 1942c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1943c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1944c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UNREACHABLE(); 1945c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 1946c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1947c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1948c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 19491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 1950c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 19518f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org LInstruction* result = new(zone()) LCheckNonSmi(value); 1952eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org if (!instr->value()->type().IsHeapObject()) { 1953eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org result = AssignEnvironment(result); 1954eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 19558f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return result; 1956c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1957c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1958c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1959e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 1960e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1961e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckSmi(value)); 1962e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} 1963e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1964e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1965c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 1966c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1967812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = new(zone()) LCheckInstanceType(value); 1968c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignEnvironment(result); 1969c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1970c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1971c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 19721f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 1973c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 19741f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckValue(value)); 1975c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1976c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1977c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 19781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1979af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 1980af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1981af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 1982af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->HasMigrationTarget()) { 1983af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org info()->MarkAsDeferredCalling(); 1984af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org result = AssignPointerMap(result); 1985594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1986594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return result; 1987c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 1988c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1989c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 1991c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HValue* value = instr->value(); 1992c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Representation input_rep = value->representation(); 1993c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* reg = UseRegister(value); 1994c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (input_rep.IsDouble()) { 1995c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // Revisit this decision, here and 8 lines below. 1996d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return DefineAsRegister(new(zone()) LClampDToUint8(reg, 1997d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TempDoubleRegister())); 1998c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (input_rep.IsInteger32()) { 1999812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 2000c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 2001e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(input_rep.IsSmiOrTagged()); 2002d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org LClampTToUint8* result = 2003d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org new(zone()) LClampTToUint8(reg, TempDoubleRegister()); 2004c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignEnvironment(DefineAsRegister(result)); 2005c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 2006c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2007c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2008c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2009ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2010ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org HValue* value = instr->value(); 2011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value->representation().IsDouble()); 2012ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2013ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2014ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2015ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2016ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2017ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* lo = UseRegister(instr->lo()); 2018ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* hi = UseRegister(instr->hi()); 2019ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2020ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2021ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2022ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2023c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2024fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = info()->IsStub() 2025fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org ? UseFixed(instr->context(), cp) 2026fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org : NULL; 20276e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2028fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return new(zone()) LReturn(UseFixed(instr->value(), v0), context, 20296e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org parameter_count); 2030c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2031c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2032c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2033c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 2034c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Representation r = instr->representation(); 2035b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (r.IsSmi()) { 2036b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org return DefineAsRegister(new(zone()) LConstantS); 2037b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsInteger32()) { 2038812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantI); 2039c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else if (r.IsDouble()) { 2040812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantD); 2041d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (r.IsExternal()) { 2042d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return DefineAsRegister(new(zone()) LConstantE); 2043b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsTagged()) { 2044812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantT); 2045c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 2046c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UNREACHABLE(); 2047c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 2048c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 2049c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2050c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2051c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2052c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 2053812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 2054c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return instr->RequiresHoleCheck() 2055c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 2056c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : DefineAsRegister(result); 2057c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2058c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2059c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2060c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 2061fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2062fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* global_object = 20639aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 20649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 20659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 20669aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 20679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 2068fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LLoadGlobalGeneric* result = 20699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org new(zone()) LLoadGlobalGeneric(context, global_object, vector); 2070c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 2071c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2072c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2073c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2074c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 2075e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org LOperand* value = UseRegister(instr->value()); 2076e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org // Use a temp to check the value in the cell in the case where we perform 2077e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org // a hole check. 2078e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org return instr->RequiresHoleCheck() 2079812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 2080812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : new(zone()) LStoreGlobalCell(value, NULL); 2081c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2082c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2083c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2084c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 2085c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* context = UseRegisterAtStart(instr->value()); 2086812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = 2087812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DefineAsRegister(new(zone()) LLoadContextSlot(context)); 20884edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 20894edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org result = AssignEnvironment(result); 20904edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } 20914edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 2092c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2093c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2095c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 2096c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* context; 2097c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* value; 2098c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (instr->NeedsWriteBarrier()) { 2099c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org context = UseTempRegister(instr->context()); 2100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org value = UseTempRegister(instr->value()); 2101c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 2102c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org context = UseRegister(instr->context()); 2103c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org value = UseRegister(instr->value()); 2104c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 2105812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = new(zone()) LStoreContextSlot(context, value); 21064edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 21074edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org result = AssignEnvironment(result); 21084edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } 21094edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 2110c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2111c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2112c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2113c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 2114f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org LOperand* obj = UseRegisterAtStart(instr->object()); 2115f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 2116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 2120fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2121fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 21229aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 21239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21259aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 21279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 2128fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LInstruction* result = 21299d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), v0); 2130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(result, instr); 2131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2132c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2133c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2134c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 2135c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HLoadFunctionPrototype* instr) { 2136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignEnvironment(DefineAsRegister( 2137812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 2138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2141528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2142528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineAsRegister(new(zone()) LLoadRoot); 2143528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 2144528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2145528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2146e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2147e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsSmiOrInteger32()); 2148e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org ElementsKind elements_kind = instr->elements_kind(); 2149c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 21504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org LInstruction* result = NULL; 2151c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 21525c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2153e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org LOperand* obj = NULL; 2154e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (instr->representation().IsDouble()) { 2155fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org obj = UseRegister(instr->elements()); 2156e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } else { 2157e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrTagged()); 2158e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org obj = UseRegisterAtStart(instr->elements()); 2159e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 21604edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); 2161e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } else { 2162e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 2163e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org (instr->representation().IsInteger32() && 21644edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org !IsDoubleOrFloatElementsKind(elements_kind)) || 2165e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org (instr->representation().IsDouble() && 21664edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org IsDoubleOrFloatElementsKind(elements_kind))); 21675c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 21684edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key)); 2169e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 2170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 21714edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if ((instr->is_external() || instr->is_fixed_typed_array()) ? 21724edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // see LCodeGen::DoLoadKeyedExternalArray 21734edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org ((elements_kind == EXTERNAL_UINT32_ELEMENTS || 21744edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org elements_kind == UINT32_ELEMENTS) && 21754edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org !instr->CheckFlag(HInstruction::kUint32)) : 21764edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // see LCodeGen::DoLoadKeyedFixedDoubleArray and 21774edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // LCodeGen::DoLoadKeyedFixedArray 21784edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org instr->RequiresHoleCheck()) { 21794edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org result = AssignEnvironment(result); 21804edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } 21814edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return result; 2182c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2183c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2184c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2185c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 2186fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2187fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 21889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 21899aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 21909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21919d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21939d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 2194c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInstruction* result = 21969d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), 21979d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org v0); 2198c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(result, instr); 2199c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2200c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2201c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2202e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 22035c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->elements()->representation().IsTagged()); 22058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2206e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org LOperand* object = NULL; 22078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* val = NULL; 22088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* key = NULL; 22098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 2210e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org if (instr->value()->representation().IsDouble()) { 2211e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org object = UseRegisterAtStart(instr->elements()); 22128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 2213528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org val = UseRegister(instr->value()); 2214e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } else { 2215e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsSmiOrTagged()); 2216528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (needs_write_barrier) { 2217528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org object = UseTempRegister(instr->elements()); 2218528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org val = UseTempRegister(instr->value()); 2219528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org key = UseTempRegister(instr->key()); 2220528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 2221528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org object = UseRegisterAtStart(instr->elements()); 2222528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org val = UseRegisterAtStart(instr->value()); 2223528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 2224528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 2225e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 2226e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 22278e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return new(zone()) LStoreKeyed(object, key, val); 2228e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 2229e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org 2230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 22318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (instr->value()->representation().IsInteger32() && 22325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 22338e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (instr->value()->representation().IsDouble() && 22345c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org IsDoubleOrFloatElementsKind(instr->elements_kind()))); 2235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->is_fixed_typed_array() && 22365c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsTagged()) || 22375c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (instr->is_external() && 22385c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsExternal())); 2239528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* val = UseRegister(instr->value()); 22408e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 22415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 22425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return new(zone()) LStoreKeyed(backing_store, key, val); 2243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2244c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2246c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2247fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2248fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* obj = 22499aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 22509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 22519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2253e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->object()->representation().IsTagged()); 2254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsTagged()); 2255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 2256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2257fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall( 2258fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr); 2259c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2260c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2261c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoTransitionElementsKind( 2263c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HTransitionElementsKind* instr) { 2264003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 22652f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseRegister(instr->object()); 2266c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* new_map_reg = TempRegister(); 2267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LTransitionElementsKind* result = 2268fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); 2269f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return result; 2270c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org } else { 22712f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseFixed(instr->object(), a0); 2272fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2273c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org LTransitionElementsKind* result = 2274fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LTransitionElementsKind(object, context, NULL); 22752f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return MarkAsCall(result, instr); 2276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 2277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 22807c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento( 22817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org HTrapAllocationMemento* instr) { 22827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org LOperand* object = UseRegister(instr->object()); 22837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org LOperand* temp = TempRegister(); 22847c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org LTrapAllocationMemento* result = 22857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org new(zone()) LTrapAllocationMemento(object, temp); 22867c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return AssignEnvironment(result); 22877c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org} 22887c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 22897c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 2290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 229153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org bool is_in_object = instr->access().IsInobject(); 2292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2293594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool needs_write_barrier_for_map = instr->has_transition() && 229437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org instr->NeedsWriteBarrierForMap(); 229537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org 229637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org LOperand* obj; 229737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org if (needs_write_barrier) { 229853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org obj = is_in_object 229937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 230037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseTempRegister(instr->object()); 230137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } else { 230237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org obj = needs_write_barrier_for_map 230337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 230437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseRegisterAtStart(instr->object()); 230537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } 2306c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 230757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org LOperand* val; 2308d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org if (needs_write_barrier) { 230957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseTempRegister(instr->value()); 2310bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org } else if (instr->field_representation().IsDouble()) { 231157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseRegisterAtStart(instr->value()); 231257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } else { 231357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseRegister(instr->value()); 231457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 2315c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 231637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org // We need a temporary register for write barrier of the map field. 231737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL; 231837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org 2319d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return new(zone()) LStoreNamedField(obj, val, temp); 2320c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2321c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2322c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2323c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2324fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2325fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* obj = 23269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 23279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2328c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2329fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); 2330c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(result, instr); 2331c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2332c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2333c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2334c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2335fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2336bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* left = UseFixed(instr->left(), a1); 2337bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* right = UseFixed(instr->right(), a0); 2338fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall( 2339fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org DefineFixed(new(zone()) LStringAdd(context, left, right), v0), 2340fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org instr); 2341c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2342c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2343c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2344c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 2345c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* string = UseTempRegister(instr->string()); 2346c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* index = UseTempRegister(instr->index()); 2347fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2348fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LStringCharCodeAt* result = 2349fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LStringCharCodeAt(context, string, index); 23504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2352c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2353c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2354c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 2355c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* char_code = UseRegister(instr->value()); 2356fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2357fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LStringCharFromCode* result = 2358fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org new(zone()) LStringCharFromCode(context, char_code); 2359c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2360c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2361c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2362c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 23637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 23647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org info()->MarkAsDeferredCalling(); 2365fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2366c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org LOperand* size = UseRegisterOrConstant(instr->size()); 23677c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org LOperand* temp1 = TempRegister(); 23687c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org LOperand* temp2 = TempRegister(); 2369fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); 23707c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org return AssignPointerMap(DefineAsRegister(result)); 23717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org} 23727c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 23737c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 2374c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2375fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2376fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall( 2377fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org DefineFixed(new(zone()) LRegExpLiteral(context), v0), instr); 2378c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2379c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2380c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2381c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 2382fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2383fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall( 2384fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org DefineFixed(new(zone()) LFunctionLiteral(context), v0), instr); 2385c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2386c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2387c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2388c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2389e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ == 0); 2390c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org allocator_->MarkAsOsrEntry(); 2391c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current_block_->last_environment()->set_ast_id(instr->ast_id()); 2392812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LOsrEntry); 2393c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2394c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2396c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 239759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org LParameter* result = new(zone()) LParameter; 23987c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org if (instr->kind() == HParameter::STACK_PARAMETER) { 239959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org int spill_index = chunk()->GetParameterStackSlot(instr->index()); 240059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return DefineAsSpilled(result, spill_index); 240159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } else { 2402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->IsStub()); 2403e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallInterfaceDescriptor descriptor = 2404e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org info()->code_stub()->GetCallInterfaceDescriptor(); 2405ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org int index = static_cast<int>(instr->index()); 240642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org Register reg = descriptor.GetEnvironmentParameterRegister(index); 240759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org return DefineFixed(result, reg); 240859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org } 2409c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2410c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2411c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2412c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2413c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // Use an index that corresponds to the location in the unoptimized frame, 2414c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which the optimized frame will subsume. 2415c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int env_index = instr->index(); 2416c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int spill_index = 0; 2417c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (instr->environment()->is_parameter_index(env_index)) { 2418c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = chunk()->GetParameterStackSlot(env_index); 2419c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } else { 2420c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = env_index - instr->environment()->first_local_index(); 2421c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2422b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Retry(kTooManySpillSlotsNeededForOSR); 2423c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = 0; 2424c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 2425c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 2426812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2427c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2428c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2429c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2430c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 2431fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2432fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), v0), instr); 2433c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2434c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2435c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2436c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 2437c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // There are no real uses of the arguments object. 2438c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // arguments.length and element access are supported directly on 2439c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // stack arguments, and any real arguments object use causes a bailout. 2440c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // So this value is never used. 2441c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 2442c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2445594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2446662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 24471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2448594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // There are no real uses of a captured object. 2449594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return NULL; 2450594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 2451594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2452594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2453c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 245477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 2455c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org LOperand* args = UseRegister(instr->arguments()); 245690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org LOperand* length = UseRegisterOrConstantAtStart(instr->length()); 245790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 2458c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 2459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2461c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2462c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 2463c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LOperand* object = UseFixed(instr->value(), a0); 2464812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LToFastProperties* result = new(zone()) LToFastProperties(object); 2465c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 2466c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2467c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2468c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2470fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2471fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0)); 2472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(result, v0), instr); 2473c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2474c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2475c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2476c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 2477812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 2478c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2479c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2481c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 2482c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HIsConstructCallAndBranch* instr) { 2483812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsConstructCallAndBranch(TempRegister()); 2484c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2485c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2486c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2487c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2488662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 2489c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 2490c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2491c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2492c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2494c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (instr->is_function_entry()) { 2495fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2496fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return MarkAsCall(new(zone()) LStackCheck(context), instr); 2497c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 2498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->is_backwards_branch()); 2499fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2500fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org return AssignEnvironment( 2501fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org AssignPointerMap(new(zone()) LStackCheck(context))); 2502c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 2503c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2506c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 2507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HEnvironment* outer = current_block_->last_environment(); 2508f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org outer->set_ast_id(instr->ReturnId()); 2509c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HConstant* undefined = graph()->GetConstantUndefined(); 2510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org HEnvironment* inner = outer->CopyForInlining(instr->closure(), 2511fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org instr->arguments_count(), 2512c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org instr->function(), 2513c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org undefined, 2514e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org instr->inlining_kind()); 2515b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org // Only replay binding of arguments object if it wasn't removed from graph. 2516b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2517b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org inner->Bind(instr->arguments_var(), instr->arguments_object()); 25188c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org } 2519ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org inner->BindContext(instr->closure_context()); 252056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org inner->set_entry(instr); 2521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current_block_->UpdateEnvironment(inner); 2522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org chunk_->AddInlinedClosure(instr->closure()); 2523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return NULL; 2524c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2525c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2526c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2527c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 252828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org LInstruction* pop = NULL; 252928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 253028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org HEnvironment* env = current_block_->last_environment(); 253128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 253233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (env->entry()->arguments_pushed()) { 253328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int argument_count = env->arguments_environment()->parameter_count(); 253428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org pop = new(zone()) LDrop(argument_count); 2535e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->argument_delta() == -argument_count); 253628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 253728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 2538fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org HEnvironment* outer = current_block_->last_environment()-> 2539fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org DiscardInlined(false); 2540c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org current_block_->UpdateEnvironment(outer); 254128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 254228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return pop; 2543c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 2544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2545c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 2546812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2547fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LOperand* context = UseFixed(instr->context(), cp); 2548812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* object = UseFixed(instr->enumerable(), a0); 2549fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 2550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 2551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org} 2552812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2553812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2554812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 2555812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* map = UseRegister(instr->map()); 255689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); 2557812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org} 2558812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2559812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2560812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 2561812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2562812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* map = UseRegisterAtStart(instr->map()); 256335814e51cffd39ade0aaeaaafb9b4612aa1d9efbfschneider@chromium.org return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 2564812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org} 2565812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2566812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2567812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2568812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* object = UseRegister(instr->object()); 2569a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org LOperand* index = UseTempRegister(instr->index()); 2570ab43d2fe8b76a093650c03e80a89b6344b6be49emachenbach@chromium.org LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 2571ab43d2fe8b76a093650c03e80a89b6344b6be49emachenbach@chromium.org LInstruction* result = DefineSameAsFirst(load); 2572ab43d2fe8b76a093650c03e80a89b6344b6be49emachenbach@chromium.org return AssignPointerMap(result); 2573812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org} 2574812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 2575812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 25761e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 25771e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 25781e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->context()); 25791e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return new(zone()) LStoreFrameContext(context); 25801e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 25811e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 25821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 25831e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext( 25841e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org HAllocateBlockContext* instr) { 25851e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), cp); 25861e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 25871e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LAllocateBlockContext* result = 25881e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org new(zone()) LAllocateBlockContext(context, function); 25891e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return MarkAsCall(DefineFixed(result, cp), instr); 25901e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 25911e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 2592c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} } // namespace v8::internal 25937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 25947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif // V8_TARGET_ARCH_MIPS 2595