1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32 8c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium-allocator-inl.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ia32/lithium-ia32.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ia32/lithium-codegen-ia32.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-osr.h" 13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 { 15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal { 16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DEFINE_COMPILE(type) \ 18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org void L##type::CompileToNative(LCodeGen* generator) { \ 19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org generator->Do##type(this); \ 20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DEFINE_COMPILE 23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG 2683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LInstruction::VerifyCall() { 27160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Call instructions can use only fixed registers as temporaries and 28160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // outputs because all registers are blocked by the calling convention. 29160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Inputs operands must use a fixed register or use-at-start policy or 30160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // a non-register policy. 3183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org ASSERT(Output() == NULL || 3283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LUnallocated::cast(Output())->HasFixedPolicy() || 3383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org !LUnallocated::cast(Output())->HasRegisterPolicy()); 34e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (UseIterator it(this); !it.Done(); it.Advance()) { 35e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 36160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org ASSERT(operand->HasFixedPolicy() || 37160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org operand->IsUsedAtStart()); 3883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 39e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (TempIterator it(this); !it.Done(); it.Advance()) { 40e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 41160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 4383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 4483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif 4583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 4683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 47e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool LInstruction::HasDoubleRegisterResult() { 48e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return HasResult() && result()->IsDoubleRegister(); 49e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 50e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 51e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 52e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool LInstruction::HasDoubleRegisterInput() { 53e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (int i = 0; i < InputCount(); i++) { 54e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* op = InputAt(i); 55ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org if (op != NULL && op->IsDoubleRegister()) { 56e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return true; 57e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 58e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return false; 60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 63c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) { 64a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("%s ", this->Mnemonic()); 6583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 6683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org PrintOutputOperandTo(stream); 67c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org PrintDataTo(stream); 69a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (HasEnvironment()) { 71a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" "); 72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org environment()->PrintTo(stream); 73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 74a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 75a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (HasPointerMap()) { 76a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" "); 77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pointer_map()->PrintTo(stream); 78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 79a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 82c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) { 830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com stream->Add("= "); 84c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org for (int i = 0; i < InputCount(); i++) { 856d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (i > 0) stream->Add(" "); 864cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (InputAt(i) == NULL) { 874cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org stream->Add("NULL"); 884cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } else { 894cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org InputAt(i)->PrintTo(stream); 904cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 95c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 96c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org if (HasResult()) result()->PrintTo(stream); 97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) { 101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LGap::PrintDataTo(stream); 102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LLabel* rep = replacement(); 103c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (rep != NULL) { 104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" Dead block replaced with B%d", rep->block_id()); 105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool LGap::IsRedundant() const { 110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < 4; i++) { 111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return false; 113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return true; 117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 120c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) { 121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < 4; i++) { 122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("("); 123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (parallel_moves_[i] != NULL) { 124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org parallel_moves_[i]->PrintDataTo(stream); 125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") "); 127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticD::Mnemonic() const { 132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org switch (op()) { 133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::ADD: return "add-d"; 134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::SUB: return "sub-d"; 135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MUL: return "mul-d"; 136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::DIV: return "div-d"; 137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MOD: return "mod-d"; 138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org default: 139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticT::Mnemonic() const { 146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org switch (op()) { 147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::ADD: return "add-t"; 148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::SUB: return "sub-t"; 149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MUL: return "mul-t"; 150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::MOD: return "mod-t"; 151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case Token::DIV: return "div-t"; 1520a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org case Token::BIT_AND: return "bit-and-t"; 1530a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org case Token::BIT_OR: return "bit-or-t"; 1540a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org case Token::BIT_XOR: return "bit-xor-t"; 155e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org case Token::ROR: return "ror-t"; 1560a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org case Token::SHL: return "sal-t"; 1570a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org case Token::SAR: return "sar-t"; 1580a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org case Token::SHR: return "shr-t"; 159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org default: 160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 16632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const { 16732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return !gen->IsNextEmittedBlock(block_id()); 16832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 16932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 17032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 171c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) { 172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("B%d", block_id()); 173a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 175a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 176c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) { 177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 17856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 182e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if "); 18456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org left()->PrintTo(stream); 185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" %s ", Token::String(op())); 18656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org right()->PrintTo(stream); 187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 191c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 1925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org stream->Add("if is_object("); 19356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 1945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 1965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1980ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1990ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add("if is_string("); 20056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 2010ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2020ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 2030ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 2040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 205c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if is_smi("); 20756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 209a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 2137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stream->Add("if is_undetectable("); 21456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 2157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2190ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2200ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add("if string_compare("); 22156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org left()->PrintTo(stream); 22256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org right()->PrintTo(stream); 2230ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2240ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 2250ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 2260ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 227c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if has_instance_type("); 22956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 231a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 233a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 234c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 235a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if has_cached_array_index("); 23656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 238a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 239a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 240a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 241c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if class_of_test("); 24356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 244a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(", \"%o\") then B%d else B%d", 245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org *hydrogen()->class_name(), 246a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org true_block_id(), 247a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org false_block_id()); 248a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 251c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("if typeof "); 25356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 254a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" == \"%s\" then B%d else B%d", 255afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org hydrogen()->type_literal()->ToCString().get(), 256a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org true_block_id(), false_block_id()); 257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 259a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 260662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 261662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(" = "); 262662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org function()->PrintTo(stream); 263662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(".code_entry = "); 264662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org code_object()->PrintTo(stream); 265662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 266662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 267662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 2682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 2692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org stream->Add(" = "); 2702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org base_object()->PrintTo(stream); 271ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org stream->Add(" + "); 272ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org offset()->PrintTo(stream); 2732bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 2742bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 2752bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 27626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 27726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("= "); 27826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org function()->PrintTo(stream); 27926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("#%d / ", arity()); 28026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 28126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 28226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 28326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 28426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 0; i < InputCount(); i++) { 28526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org InputAt(i)->PrintTo(stream); 28626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add(" "); 28726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 288a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("#%d / ", arity()); 289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 290a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 292c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 29356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context()->PrintTo(stream); 29483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org stream->Add("[%d]", slot_index()); 29583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 29683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 29783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 29883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 29956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context()->PrintTo(stream); 30083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org stream->Add("[%d] <- ", slot_index()); 30156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 302c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 303c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 304c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 305160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 306160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add("= "); 30756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context()->PrintTo(stream); 308160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add(" "); 30956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org function()->PrintTo(stream); 310160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add(" #%d / ", arity()); 311160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 312160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 313160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 314c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) { 315c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("= "); 31656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context()->PrintTo(stream); 31756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org stream->Add(" "); 31856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org constructor()->PrintTo(stream); 319a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" #%d / ", arity()); 320a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 321a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 322a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) { 3244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add("= "); 3254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org context()->PrintTo(stream); 3264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" "); 3274a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org constructor()->PrintTo(stream); 3284a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" #%d / ", arity()); 3291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind = hydrogen()->elements_kind(); 3304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" (%s) ", ElementsKindToString(kind)); 3314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 3324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 3334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 334c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 335a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org arguments()->PrintTo(stream); 336a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 337a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" length "); 338a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org length()->PrintTo(stream); 339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 340a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" index "); 341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org index()->PrintTo(stream); 342a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 343a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 345c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 346a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Skip a slot if for a double-width slot. 347c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) { 3487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org spill_slot_count_++; 3497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org spill_slot_count_ |= 1; 3507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org num_double_slots_++; 3517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org } 352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return spill_slot_count_++; 353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 356c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 357c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org int index = GetNextSpillIndex(kind); 358c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) { 3597028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LDoubleStackSlot::Create(index, zone()); 360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 361c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org ASSERT(kind == GENERAL_REGISTERS); 3627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LStackSlot::Create(index, zone()); 363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 364a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 366a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org object()->PrintTo(stream); 369a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org hydrogen()->access().PrintTo(stream); 370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add(" <- "); 371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org value()->PrintTo(stream); 372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 3763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object()->PrintTo(stream); 3773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add("."); 378afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org stream->Add(String::cast(*name())->ToCString().get()); 3793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add(" <- "); 3803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org value()->PrintTo(stream); 3813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 3823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3848e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 3858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org elements()->PrintTo(stream); 3868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("["); 3878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org key()->PrintTo(stream); 3888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 389fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d]", base_offset()); 3908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("]"); 3928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 3938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 3948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 3958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 396e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 397717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org elements()->PrintTo(stream); 398717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org stream->Add("["); 399717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org key()->PrintTo(stream); 4008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 401fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d] <-", base_offset()); 4028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 4038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("] <- "); 4048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 405d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 406d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (value() == NULL) { 407d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org ASSERT(hydrogen()->IsConstantHoleStore() && 408d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org hydrogen()->value()->representation().IsDouble()); 409d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org stream->Add("<the hole(nan)>"); 410d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } else { 411d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org value()->PrintTo(stream); 412d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } 413717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org} 414717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 415717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org object()->PrintTo(stream); 418a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("["); 419a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org key()->PrintTo(stream); 420a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org stream->Add("] <- "); 421a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org value()->PrintTo(stream); 422a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 424a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 425394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 426394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com object()->PrintTo(stream); 427394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 428394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 429394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 430394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 43128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() { 432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(is_unused()); 43328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org chunk_ = new(zone()) LPlatformChunk(info(), graph()); 4341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LPhase phase("L_Building chunk", chunk_); 435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org status_ = BUILDING; 4367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 4377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org // Reserve the first spill slot for the state of dynamic alignment. 438a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (info()->IsOptimizing()) { 439c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org int alignment_state_index = chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 440a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org ASSERT_EQ(alignment_state_index, 0); 441a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org USE(alignment_state_index); 442a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 4437028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 444c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // If compiling for OSR, reserve space for the unoptimized frame, 445c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which will be subsumed into this frame. 446c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (graph()->has_osr()) { 447c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 448c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 449c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 450c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 451c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < blocks->length(); i++) { 454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBasicBlock* next = NULL; 455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (i < blocks->length() - 1) next = blocks->at(i + 1); 456a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DoBasicBlock(blocks->at(i), next); 457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (is_aborted()) return NULL; 458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org status_ = DONE; 460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return chunk_; 461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 464594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid LChunkBuilder::Abort(BailoutReason reason) { 46546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org info()->set_bailout_reason(reason); 466a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org status_ = ABORTED; 467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 471c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org Register::ToAllocationIndex(reg)); 473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) { 477c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 478c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org XMMRegister::ToAllocationIndex(reg)); 479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Use(value, ToUnallocated(fixed_register)); 484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) { 488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Use(value, ToUnallocated(reg)); 489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) { 493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Use(value, 499c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 500c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated::USED_AT_START)); 501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) { 510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 511a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 512a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 513a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 514a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) { 515c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 516c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated::USED_AT_START)); 517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 519a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 520c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgstatic inline bool CanBeImmediateConstant(HValue* value) { 521c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return value->IsConstant() && HConstant::cast(value)->NotInNewSpace(); 522c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org} 523c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 524c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org 525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 526c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return CanBeImmediateConstant(value) 527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : Use(value); 529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 532a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 533c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return CanBeImmediateConstant(value) 534a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 535a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : UseAtStart(value); 536a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 537a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 539e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLOperand* LChunkBuilder::UseFixedOrConstant(HValue* value, 540e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Register fixed_register) { 541e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return CanBeImmediateConstant(value) 542e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 543e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org : UseFixed(value, fixed_register); 544e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 545e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 546e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 548c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return CanBeImmediateConstant(value) 549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : UseRegister(value); 551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 555c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org return CanBeImmediateConstant(value) 556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : UseRegisterAtStart(value); 558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 561f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) { 562f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return chunk_->DefineConstantOperand(HConstant::cast(value)); 563f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 564f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 565f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 5660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comLOperand* LChunkBuilder::UseAny(HValue* value) { 5670511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return value->IsConstant() 5680511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com ? chunk_->DefineConstantOperand(HConstant::cast(value)) 569c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 5700511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 5710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 5720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (value->EmitAtUses()) { 575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* instr = HInstruction::cast(value); 576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org VisitInstruction(instr); 577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 578994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org operand->set_virtual_register(value->id()); 579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 58326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 584c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LUnallocated* result) { 585994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org result->set_virtual_register(current_instruction_->id()); 586c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org instr->set_result(result); 587c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return instr; 588c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 589c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 590c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 591c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister( 59226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Define(instr, 594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 598c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled( 59926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, 600c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int index) { 601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Define(instr, 602c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 606c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst( 60726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return Define(instr, 609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 61326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr, 614c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Register reg) { 615a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Define(instr, ToUnallocated(reg)); 616a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 617a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 618a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 619c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble( 62026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, 621c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org XMMRegister reg) { 622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return Define(instr, ToUnallocated(reg)); 623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 626a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 627a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* hydrogen_env = current_block_->last_environment(); 628c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int argument_index_accumulator = 0; 629594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ZoneList<HValue*> objects_to_materialize(0, zone()); 630c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com instr->set_environment(CreateEnvironment(hydrogen_env, 631594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org &argument_index_accumulator, 632594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org &objects_to_materialize)); 633a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return instr; 634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 636a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 637a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 638a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* hinstr, 639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CanDeoptimize can_deoptimize) { 640a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsNonDeferredCalling(); 641a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 64283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG 64383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org instr->VerifyCall(); 64483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif 64583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org instr->MarkAsCall(); 646a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org instr = AssignPointerMap(instr); 647a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // If instruction does not have side-effects lazy deoptimization 649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // after the call will try to deoptimize to the point before the call. 650a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Thus we still need to attach environment to this call even if 651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // call sequence can not deoptimize eagerly. 652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool needs_environment = 653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 654c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org !hinstr->HasObservableSideEffects(); 655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (needs_environment && !instr->HasEnvironment()) { 656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org instr = AssignEnvironment(instr); 6574edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // We can't really figure out if the environment is needed or not. 6584edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org instr->environment()->set_has_been_used(); 659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 660a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 661a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return instr; 662a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 663a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 664a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 665a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 666a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(!instr->HasPointerMap()); 66771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org instr->set_pointer_map(new(zone()) LPointerMap(zone())); 668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return instr; 669a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 671a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::TempRegister() { 673c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LUnallocated* operand = 674c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 6752bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int vreg = allocator_->GetVirtualRegister(); 676994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!allocator_->AllocationOk()) { 677594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 67857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org vreg = 0; 679994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 6802bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org operand->set_virtual_register(vreg); 681a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 682a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 683a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 684a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 685a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) { 686a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LUnallocated* operand = ToUnallocated(reg); 687994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org ASSERT(operand->HasFixedPolicy()); 688a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 690a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 691a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 692a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) { 693a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LUnallocated* operand = ToUnallocated(reg); 694994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org ASSERT(operand->HasFixedPolicy()); 695a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return operand; 696a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 697a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 699a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 700c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LLabel(instr->block()); 701a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 702a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 703a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 70446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 70546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 70646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 70746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 70846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 709d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 710d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org UNREACHABLE(); 711d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return NULL; 712d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org} 713d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 714d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 715a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 716c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignEnvironment(new(zone()) LDeoptimize); 717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 719a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 720a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op, 721a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBitwiseBinaryOperation* instr) { 722528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 723528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 724528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 725528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 726a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 727528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HValue* right_value = instr->right(); 728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = NULL; 729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int constant_value = 0; 730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org bool does_deopt = false; 731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (right_value->IsConstant()) { 732528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HConstant* constant = HConstant::cast(right_value); 733528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = chunk_->DefineConstantOperand(constant); 734528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org constant_value = constant->Integer32Value() & 0x1f; 735528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Left shifts can deoptimize if we shift by > 0 and the result cannot be 736528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // truncated to smi. 737528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmi() && constant_value > 0) { 738528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 739528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 741528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = UseFixed(right_value, ecx); 742a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7432f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 744528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Shift operations can only deoptimize if we do a logical shift by 0 and 745528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // the result cannot be truncated to int32. 746528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::SHR && constant_value == 0) { 747528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (FLAG_opt_safe_uint32_operations) { 748528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckFlag(HInstruction::kUint32); 749528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 750528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 751528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 7522f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } 7532f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 754528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LInstruction* result = 755528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt)); 756528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return does_deopt ? AssignEnvironment(result) : result; 757528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 758528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(op, instr); 759528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 760a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 761a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 763a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 764a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HArithmeticBinaryOperation* instr) { 765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->representation().IsDouble()); 766a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->left()->representation().IsDouble()); 767a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->right()->representation().IsDouble()); 768528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::MOD) { 769528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 770528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); 771528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 772528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return MarkAsCall(DefineSameAsFirst(result), instr); 773528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 774528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 775528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); 776528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 777528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineSameAsFirst(result); 778528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 780a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 781a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 782a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 783528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HBinaryOperation* instr) { 784a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HValue* left = instr->left(); 785a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HValue* right = instr->right(); 786fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org ASSERT(left->representation().IsTagged()); 787fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org ASSERT(right->representation().IsTagged()); 788ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 789a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* left_operand = UseFixed(left, edx); 790a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* right_operand = UseFixed(right, eax); 791ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LArithmeticT* result = 792c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LArithmeticT(op, context, left_operand, right_operand); 793a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 794a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 795a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 796ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 797a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 798a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(is_building()); 799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_ = block; 800a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org next_block_ = next_block; 801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (block->IsStartBlock()) { 802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->UpdateEnvironment(graph_->start_environment()); 803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org argument_count_ = 0; 804a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (block->predecessors()->length() == 1) { 805a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // We have a single predecessor => copy environment and outgoing 806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // argument count from the predecessor. 807a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(block->phis()->length() == 0); 808a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 809a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* last_environment = pred->last_environment(); 810a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(last_environment != NULL); 811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Only copy the environment, if it is later used again. 812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (pred->end()->SecondSuccessor() == NULL) { 813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(pred->end()->FirstSuccessor() == block); 814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org last_environment = last_environment->Copy(); 818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 820a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->UpdateEnvironment(last_environment); 821a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(pred->argument_count() >= 0); 822a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org argument_count_ = pred->argument_count(); 823a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 824a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // We are at a state join => process phis. 825a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // No need to copy the environment, it cannot be used later. 827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* last_environment = pred->last_environment(); 828a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < block->phis()->length(); ++i) { 829a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HPhi* phi = block->phis()->at(i); 830ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org if (phi->HasMergedIndex()) { 831b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org last_environment->SetValueAt(phi->merged_index(), phi); 832b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org } 833a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 834a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < block->deleted_phis()->length(); ++i) { 835b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org if (block->deleted_phis()->at(i) < last_environment->length()) { 836b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org last_environment->SetValueAt(block->deleted_phis()->at(i), 837b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org graph_->GetConstantUndefined()); 838b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org } 839a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 840a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->UpdateEnvironment(last_environment); 841a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Pick up the outgoing argument count of one of the predecessors. 842a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org argument_count_ = pred->argument_count(); 843a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 844a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* current = block->first(); 845a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int start = chunk_->instructions()->length(); 846a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org while (current != NULL && !is_aborted()) { 847a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Code for constants in registers is generated lazily. 848a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (!current->EmitAtUses()) { 849a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org VisitInstruction(current); 850a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 851a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current = current->next(); 852a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 853a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int end = chunk_->instructions()->length() - 1; 854a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (end >= start) { 855a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->set_first_instruction_index(start); 856a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->set_last_instruction_index(end); 857a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 858a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org block->set_argument_count(argument_count_); 859a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org next_block_ = NULL; 860a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_ = NULL; 861a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 862a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 863a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 864a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 865a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HInstruction* old_current = current_instruction_; 866a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_instruction_ = current; 867d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 868d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* instr = NULL; 869d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org if (current->CanReplaceWithDummyUses()) { 870935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (current->OperandCount() == 0) { 871935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) LDummy()); 872935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } else { 87309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org ASSERT(!current->OperandAt(0)->IsControlInstruction()); 874935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) 875935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LDummyUse(UseAny(current->OperandAt(0)))); 876935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } 877d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org for (int i = 1; i < current->OperandCount(); ++i) { 87809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org if (current->OperandAt(i)->IsControlInstruction()) continue; 879d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* dummy = 880d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 881d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org dummy->set_hydrogen_value(current); 882d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org chunk_->AddInstruction(dummy, current_block_); 883d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 884d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } else { 8858d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HBasicBlock* successor; 8868d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org if (current->IsControlInstruction() && 8878d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 8888d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org successor != NULL) { 8898d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = new(zone()) LGoto(successor); 8908d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } else { 8918d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = current->CompileToLithium(this); 8928d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } 893d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 894d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 895d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org argument_count_ += current->argument_delta(); 896d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org ASSERT(argument_count_ >= 0); 897a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 898a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (instr != NULL) { 899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(instr, current); 900011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 901011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org current_instruction_ = old_current; 903011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org} 904011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr, 907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HInstruction* hydrogen_val) { 908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Associate the hydrogen instruction first, since we may need it for 909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->set_hydrogen_value(hydrogen_val); 911fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org 912f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG 913011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Make sure that the lithium instruction has either no fixed register 914011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // constraints in temps or the result OR no uses that are only used at 915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // start. If this invariant doesn't hold, the register allocator can decide 916011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // to insert a split of a range immediately before the instruction due to an 917011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // already allocated register needing to be used for the instruction's fixed 918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // register constraint. In this case, The register allocator won't see an 919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // interference between the split child and the use-at-start (it would if 920011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the it was just a plain use), so it is free to move the split child into 921011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the same register that is used for the use-at-start. 922011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // See https://code.google.com/p/chromium/issues/detail?id=201590 923011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (!(instr->ClobbersRegisters() && 924011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->ClobbersDoubleRegisters(isolate()))) { 925011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int fixed = 0; 926011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int used_at_start = 0; 927011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (UseIterator it(instr); !it.Done(); it.Advance()) { 928011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 929011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->IsUsedAtStart()) ++used_at_start; 930011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 931011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->Output() != NULL) { 932011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 933011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 934011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (TempIterator it(instr); !it.Done(); it.Advance()) { 935011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 936011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->HasFixedPolicy()) ++fixed; 937f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 938011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org ASSERT(fixed == 0 || used_at_start == 0); 939011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 940f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif 941f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 942011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 943011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignPointerMap(instr); 944011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 945011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_environments && !instr->HasEnvironment()) { 946011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignEnvironment(instr); 947011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 948011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(instr, current_block_); 949011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 950011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->IsCall()) { 951011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 952011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* instruction_needing_environment = NULL; 953011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (hydrogen_val->HasObservableSideEffects()) { 954011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 955011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment = instr; 956011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org sim->ReplayEnvironment(current_block_->last_environment()); 957011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org hydrogen_value_for_lazy_bailout = sim; 958a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 959011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 960011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 961011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(bailout, current_block_); 962011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instruction_needing_environment != NULL) { 963011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Store the lazy deopt environment with the instruction if needed. 964011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Right now it is only used for LInstanceOfKnownGlobal. 965011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment-> 966011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 967486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 970a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 971a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 9734a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org return new(zone()) LGoto(instr->FirstSuccessor()); 974a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 975a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 976a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 9774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 978d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org HValue* value = instr->value(); 979b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org Representation r = value->representation(); 980f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com HType type = value->type(); 981b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org ToBooleanStub::Types expected = instr->expected_input_types(); 982b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 9831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 984b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 985b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 986b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org LOperand* temp = !easy_case && expected.NeedsMap() ? TempRegister() : NULL; 987b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org LInstruction* branch = new(zone()) LBranch(UseRegister(value), temp); 988b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (!easy_case && 989b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 990b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org !expected.IsGeneric())) { 991b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org branch = AssignEnvironment(branch); 9921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 993b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return branch; 994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 995a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 996a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 9974e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 9984e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return new(zone()) LDebugBreak(); 9994e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 10004e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 10014e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 10020a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 1003a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->value()->representation().IsTagged()); 1004a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1005c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LCmpMapAndBranch(value); 1006a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1007a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1008a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1009a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 101077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 1011c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); 1012a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1013a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1014a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1015a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 101677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 1017b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org return DefineAsRegister(new(zone()) LArgumentsElements); 1018a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1019a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1020a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1021a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 1022496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* left = UseFixed(instr->left(), InstanceofStub::left()); 1023496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* right = UseFixed(instr->right(), InstanceofStub::right()); 1024496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 1025c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInstanceOf* result = new(zone()) LInstanceOf(context, left, right); 1026a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 1027a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1028a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1029a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1030d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 1031d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org HInstanceOfKnownGlobal* instr) { 1032c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LInstanceOfKnownGlobal* result = 1033c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LInstanceOfKnownGlobal( 1034ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org UseFixed(instr->context(), esi), 1035ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org UseFixed(instr->left(), InstanceofStub::left()), 1036d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org FixedTemp(edi)); 10379ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 1038d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org} 1039d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 1040d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 1041154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 1042154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* receiver = UseRegister(instr->receiver()); 10439ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org LOperand* function = UseRegister(instr->function()); 1044154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* temp = TempRegister(); 1045154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LWrapReceiver* result = 1046154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org new(zone()) LWrapReceiver(receiver, function, temp); 1047154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org return AssignEnvironment(DefineSameAsFirst(result)); 1048154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org} 1049154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1050154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1051a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 1052a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* function = UseFixed(instr->function(), edi); 1053a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* receiver = UseFixed(instr->receiver(), eax); 1054496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* length = UseFixed(instr->length(), ebx); 1055496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* elements = UseFixed(instr->elements(), ecx); 1056c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LApplyArguments* result = new(zone()) LApplyArguments(function, 1057c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org receiver, 1058c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org length, 1059154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org elements); 1060a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, eax), instr, CAN_DEOPTIMIZE_EAGERLY); 1061a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1062a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1063a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1064011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 1065011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int argc = instr->OperandCount(); 1066011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0; i < argc; ++i) { 1067011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LOperand* argument = UseAny(instr->argument(i)); 1068011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(new(zone()) LPushArgument(argument), instr); 1069011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 1070011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org return NULL; 1071a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1072a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1073a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1074662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry( 1075662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org HStoreCodeEntry* store_code_entry) { 1076662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* function = UseRegister(store_code_entry->function()); 1077662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 1078662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org return new(zone()) LStoreCodeEntry(function, code_object); 1079662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 1080662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 1081662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 10822bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1083ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org HInnerAllocatedObject* instr) { 1084ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1085ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1086ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return DefineAsRegister( 1087ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org new(zone()) LInnerAllocatedObject(base_object, offset)); 10882bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 10892bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 10902bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 1091d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 1092c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return instr->HasNoUses() 1093c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org ? NULL 1094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org : DefineAsRegister(new(zone()) LThisFunction); 1095d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 1096d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1097d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 109883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) { 10994cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (instr->HasNoUses()) return NULL; 11004cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 11014cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (info()->IsStub()) { 11024cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return DefineFixed(new(zone()) LContext, esi); 11034cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 11044cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 11054cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org return DefineAsRegister(new(zone()) LContext); 110683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 110783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 110883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 110956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 111056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org LOperand* context = UseFixed(instr->context(), esi); 111156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 111256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org} 111356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 111456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 111526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction( 111626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallJSFunction* instr) { 111726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* function = UseFixed(instr->function(), edi); 111826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 111926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallJSFunction* result = new(zone()) LCallJSFunction(function); 112026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 112126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 112226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 112326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 112426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 112526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor( 112626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallWithDescriptor* instr) { 112726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org const CallInterfaceDescriptor* descriptor = instr->descriptor(); 112826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 112926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 113026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 113126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(target, zone()); 113226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 1; i < instr->OperandCount(); i++) { 113326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* op = UseFixed(instr->OperandAt(i), 113426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org descriptor->GetParameterRegister(i - 1)); 113526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(op, zone()); 113626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 113726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 113826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 113926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org descriptor, ops, zone()); 114026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1144160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1145160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org LOperand* context = UseFixed(instr->context(), esi); 1146160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org LOperand* function = UseFixed(instr->function(), edi); 1147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 1148160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1149160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 1150160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org switch (instr->op()) { 1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathFloor: return DoMathFloor(instr); 1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathRound: return DoMathRound(instr); 1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathAbs: return DoMathAbs(instr); 1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathLog: return DoMathLog(instr); 1158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathExp: return DoMathExp(instr); 1159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathSqrt: return DoMathSqrt(instr); 1160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case kMathPowHalf: return DoMathPowHalf(instr); 1161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case kMathClz32: return DoMathClz32(instr); 1162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org default: 1163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org UNREACHABLE(); 1164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return NULL; 1165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathFloor* result = new(zone()) LMathFloor(input); 1172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegister(instr->value()); 1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp = FixedTemp(xmm4); 1179935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LMathRound* result = new(zone()) LMathRound(input, temp); 1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* context = UseAny(instr->context()); // Deferred use. 1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1187b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org LInstruction* result = 1188b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org DefineSameAsFirst(new(zone()) LMathAbs(context, input)); 1189b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org Representation r = instr->value()->representation(); 1190b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 1191b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (!r.IsDouble()) result = AssignEnvironment(result); 1192b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 1193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ASSERT(instr->representation().IsDouble()); 1198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ASSERT(instr->value()->representation().IsDouble()); 1199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 12004f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return MarkAsCall(DefineSameAsFirst(new(zone()) LMathLog(input)), instr); 1201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LMathClz32* result = new(zone()) LMathClz32(input); 1207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 1208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1209f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1210f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ASSERT(instr->representation().IsDouble()); 1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ASSERT(instr->value()->representation().IsDouble()); 1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* value = UseTempRegister(instr->value()); 1215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp1 = TempRegister(); 1216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp2 = TempRegister(); 1217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathExp* result = new(zone()) LMathExp(value, temp1, temp2); 1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineAsRegister(result); 1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 12237e6132b924829c353864933f29124419916db550machenbach@chromium.org LOperand* input = UseAtStart(instr->value()); 12247e6132b924829c353864933f29124419916db550machenbach@chromium.org return DefineAsRegister(new(zone()) LMathSqrt(input)); 1225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp = TempRegister(); 1231935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); 1232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineSameAsFirst(result); 1233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 1237496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 1238a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* constructor = UseFixed(instr->constructor(), edi); 1239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LCallNew* result = new(zone()) LCallNew(context, constructor); 1240a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 1241a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1243a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 12444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 12454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LOperand* context = UseFixed(instr->context(), esi); 12464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LOperand* constructor = UseFixed(instr->constructor(), edi); 12474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 12484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 12494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 12504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 12514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 1252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1253496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 1254c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org LOperand* function = UseFixed(instr->function(), edi); 1255ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org LCallFunction* call = new(zone()) LCallFunction(context, function); 1256a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return MarkAsCall(DefineFixed(call, eax), instr); 1257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1259a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1260a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1261ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 1262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), eax), instr); 1263a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1264a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1266e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1267e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org return DoShift(Token::ROR, instr); 1268e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 1269e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1270e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1271a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1272a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoShift(Token::SHR, instr); 1273a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1274a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1275a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1276a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1277a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoShift(Token::SAR, instr); 1278a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1279a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1280a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1281a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) { 1282a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoShift(Token::SHL, instr); 1283a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1284a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1286c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1287fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1288594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1289594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1290528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org ASSERT(instr->CheckFlag(HValue::kTruncatingToInt32)); 1291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1292906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1293906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 1294c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineSameAsFirst(new(zone()) LBitI(left, right)); 1295c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1296528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(instr->op(), instr); 1297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1298a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1301ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1302ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->representation().IsSmiOrInteger32()); 1303ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1304ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1305ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1306ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1307486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1308486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1309486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1310486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1311ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1312486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org divisor != 1 && divisor != -1)) { 1313486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1314486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1315486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1316ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1317ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1318ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1319bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1320bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->representation().IsInteger32()); 1321bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1322bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1323bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1324bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1325bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp1 = FixedTemp(eax); 1326bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp2 = FixedTemp(edx); 1327486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LDivByConstI( 1328486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp1, temp2), edx); 1329486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || 1330486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1331486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1332486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1333486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1334486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1335bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1336bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1337bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1338ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1339ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->representation().IsSmiOrInteger32()); 1340ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1341ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1342ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseFixed(instr->left(), eax); 1343ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1344ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* temp = FixedTemp(edx); 1345486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LDivI( 1346486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp), eax); 1347486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1348486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1349486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kCanOverflow) || 1350ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) { 1351486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1352486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1353486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1354ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1355ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1356ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1358528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1359bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1360bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByPowerOf2I(instr); 1361bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1362bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByConstI(instr); 1363bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1364bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivI(instr); 1365bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1366528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1367528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::DIV, instr); 1368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::DIV, instr); 1370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1374ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1375ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1376ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1377381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I( 1378381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org dividend, divisor)); 1379381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1380381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1381381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1382381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } 1383381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1384ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1385ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1386ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1387ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1388bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->representation().IsInteger32()); 1389bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1390bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1391bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1392ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1393bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp1 = FixedTemp(eax); 1394bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp2 = FixedTemp(edx); 13957010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org LOperand* temp3 = 13967010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 13977010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 13987010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org NULL : TempRegister(); 1399ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LInstruction* result = 1400bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org DefineFixed(new(zone()) LFlooringDivByConstI(dividend, 1401bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org divisor, 1402bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org temp1, 14037010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org temp2, 14047010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org temp3), 1405bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org edx); 14067010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org if (divisor == 0 || 14077010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 14087010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org result = AssignEnvironment(result); 14097010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } 14107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return result; 1411ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 14124cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 1413ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1414ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1415ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org ASSERT(instr->representation().IsSmiOrInteger32()); 1416ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1417ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1418ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* dividend = UseFixed(instr->left(), eax); 1419ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1420ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* temp = FixedTemp(edx); 1421ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineFixed(new(zone()) LFlooringDivI( 1422ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org dividend, divisor, temp), eax); 1423ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1424ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1425ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org instr->CheckFlag(HValue::kCanOverflow)) { 1426ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1427ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1428ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1429ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org} 1430ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 1431ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 1432ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1433ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1434ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoFlooringDivByPowerOf2I(instr); 14357010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } else if (instr->right()->IsConstant()) { 14367010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return DoFlooringDivByConstI(instr); 1437d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org } else { 1438ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DoFlooringDivI(instr); 1439d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org } 1440d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org} 1441d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org 1442d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org 1443ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1444ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->representation().IsSmiOrInteger32()); 1445ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1446ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1447ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1448ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1449486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1450486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1451486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1452486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1453486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1454486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1455ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1456ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1457ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1458bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1459bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->representation().IsSmiOrInteger32()); 1460bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1461bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1462bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1463bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1464bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp1 = FixedTemp(eax); 1465bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp2 = FixedTemp(edx); 1466486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LModByConstI( 1467486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp1, temp2), eax); 1468486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1469486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1470486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1471486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1472bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1473bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1474bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1475ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1476ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->representation().IsSmiOrInteger32()); 1477ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1478ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1479ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseFixed(instr->left(), eax); 1480ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1481ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* temp = FixedTemp(edx); 1482486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LModI( 1483486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp), edx); 1484486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1485486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1486486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1487486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1488486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1489ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1490ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1491ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1493fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1494bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1495bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByPowerOf2I(instr); 1496bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1497bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByConstI(instr); 1498bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1499bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModI(instr); 1500bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1501528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1502528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::MOD, instr); 15032f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } else { 1504528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(Token::MOD, instr); 1505a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1510fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1511fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1512fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1513906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1514906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstant(instr->BetterRightOperand()); 1515a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* temp = NULL; 1516a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org temp = TempRegister(); 1518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1519c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LMulI* mul = new(zone()) LMulI(left, right, temp); 1520f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (instr->CheckFlag(HValue::kCanOverflow) || 1521f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1522f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com AssignEnvironment(mul); 1523f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1524f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return DefineSameAsFirst(mul); 1525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (instr->representation().IsDouble()) { 1526169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org return DoArithmeticD(Token::MUL, instr); 1527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::MUL, instr); 1529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1532a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1533a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1534fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1535594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1536594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 15370ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 15380ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1539c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LSubI* sub = new(zone()) LSubI(left, right); 1540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LInstruction* result = DefineSameAsFirst(sub); 1541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = AssignEnvironment(result); 1543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return result; 1545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (instr->representation().IsDouble()) { 1546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticD(Token::SUB, instr); 1547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1548a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::SUB, instr); 1549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1554fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1555594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1556594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1557906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Check to see if it would be advantageous to use an lea instruction rather 1558906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // than an add. This is the case when no overflow check is needed and there 1559906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // are multiple uses of the add's inputs, so using a 3-register add will 1560906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // preserve all input values for later uses. 1561906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org bool use_lea = LAddI::UseLea(instr); 1562906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1563906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org HValue* right_candidate = instr->BetterRightOperand(); 1564906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = use_lea 1565906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org ? UseRegisterOrConstantAtStart(right_candidate) 1566906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org : UseOrConstantAtStart(right_candidate); 1567c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LAddI* add = new(zone()) LAddI(left, right); 1568906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1569906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LInstruction* result = use_lea 1570906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org ? DefineAsRegister(add) 1571906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org : DefineSameAsFirst(add); 1572906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (can_overflow) { 1573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = AssignEnvironment(result); 1574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return result; 1576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (instr->representation().IsDouble()) { 1577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticD(Token::ADD, instr); 157837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org } else if (instr->representation().IsExternal()) { 157937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ASSERT(instr->left()->representation().IsExternal()); 158037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ASSERT(instr->right()->representation().IsInteger32()); 158137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ASSERT(!instr->CheckFlag(HValue::kCanOverflow)); 158237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org bool use_lea = LAddI::UseLea(instr); 158337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 158437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org HValue* right_candidate = instr->right(); 158537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* right = use_lea 158637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ? UseRegisterOrConstantAtStart(right_candidate) 158737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org : UseOrConstantAtStart(right_candidate); 158837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LAddI* add = new(zone()) LAddI(left, right); 158937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LInstruction* result = use_lea 159037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ? DefineAsRegister(add) 159137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org : DefineSameAsFirst(add); 159237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return result; 1593a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return DoArithmeticT(Token::ADD, instr); 1595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1598a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1599471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1600471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* left = NULL; 1601471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* right = NULL; 1602fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1603594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->left()->representation().Equals(instr->representation())); 1604594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->right()->representation().Equals(instr->representation())); 1605906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 1606906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org right = UseOrConstantAtStart(instr->BetterRightOperand()); 1607471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } else { 1608471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org ASSERT(instr->representation().IsDouble()); 1609471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org ASSERT(instr->left()->representation().IsDouble()); 1610471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org ASSERT(instr->right()->representation().IsDouble()); 1611471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org left = UseRegisterAtStart(instr->left()); 1612471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org right = UseRegisterAtStart(instr->right()); 1613471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 1614471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LMathMinMax* minmax = new(zone()) LMathMinMax(left, right); 1615471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return DefineSameAsFirst(minmax); 1616471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org} 1617471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1618471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 16195f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) { 16205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org ASSERT(instr->representation().IsDouble()); 16215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // We call a C function for double power. It can't trigger a GC. 16225f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // We need to use fixed result register for the call. 16235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org Representation exponent_type = instr->right()->representation(); 16245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org ASSERT(instr->left()->representation().IsDouble()); 162564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org LOperand* left = UseFixedDouble(instr->left(), xmm2); 16265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org LOperand* right = exponent_type.IsDouble() ? 162764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org UseFixedDouble(instr->right(), xmm1) : 16285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org UseFixed(instr->right(), eax); 1629c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LPower* result = new(zone()) LPower(left, right); 16305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return MarkAsCall(DefineFixedDouble(result, xmm3), instr, 16315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org CAN_DEOPTIMIZE_EAGERLY); 16325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 16335f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 16345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 16354f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 163653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org ASSERT(instr->left()->representation().IsSmiOrTagged()); 163753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org ASSERT(instr->right()->representation().IsSmiOrTagged()); 1638ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 1639394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left = UseFixed(instr->left(), edx); 1640394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* right = UseFixed(instr->right(), eax); 1641c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LCmpT* result = new(zone()) LCmpT(context, left, right); 16424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 16434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org} 16444f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 16454f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 1646e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1647e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HCompareNumericAndBranch* instr) { 1648fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org Representation r = instr->representation(); 1649c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (r.IsSmiOrInteger32()) { 1650594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->left()->representation().Equals(r)); 1651594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ASSERT(instr->right()->representation().Equals(r)); 1652394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 1653a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1654e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 16554f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } else { 16564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org ASSERT(r.IsDouble()); 1657c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ASSERT(instr->left()->representation().IsDouble()); 1658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->right()->representation().IsDouble()); 1659394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left; 1660394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* right; 16614000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org if (CanBeImmediateConstant(instr->left()) && 16624000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org CanBeImmediateConstant(instr->right())) { 16634000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org // The code generator requires either both inputs to be constant 16644000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org // operands, or neither. 16654000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org left = UseConstant(instr->left()); 16664000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org right = UseConstant(instr->right()); 1667394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } else { 1668394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com left = UseRegisterAtStart(instr->left()); 1669394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com right = UseRegisterAtStart(instr->right()); 1670394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 1671e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 1672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1675a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 16764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 16774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HCompareObjectEqAndBranch* instr) { 1678a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1679b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LCmpObjectEqAndBranch(left, right); 16817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 16827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 16837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1684c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1685c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org HCompareHoleAndBranch* instr) { 1686528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1687528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return new(zone()) LCmpHoleAndBranch(value); 1688c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org} 1689c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org 1690c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org 16910cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 16920cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org HCompareMinusZeroAndBranch* instr) { 16930cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* value = UseRegister(instr->value()); 16940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* scratch = TempRegister(); 16950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 16960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 16970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 16980cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 16994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 170053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org ASSERT(instr->value()->representation().IsSmiOrTagged()); 17014f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org LOperand* temp = TempRegister(); 1702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LIsObjectAndBranch(UseRegister(instr->value()), temp); 17035f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org} 17045f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 17055f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 17060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 17070ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry ASSERT(instr->value()->representation().IsTagged()); 17080ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* temp = TempRegister(); 17097028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return new(zone()) LIsStringAndBranch(UseRegister(instr->value()), temp); 17100ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17110ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17120ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->value()->representation().IsTagged()); 1715c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 17204f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HIsUndetectableAndBranch* instr) { 172153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org ASSERT(instr->value()->representation().IsTagged()); 1722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LIsUndetectableAndBranch( 1723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UseRegisterAtStart(instr->value()), TempRegister()); 17247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 17257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17270ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoStringCompareAndBranch( 17280ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry HStringCompareAndBranch* instr) { 17290ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry ASSERT(instr->left()->representation().IsTagged()); 17300ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry ASSERT(instr->right()->representation().IsTagged()); 17310ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* context = UseFixed(instr->context(), esi); 17320ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* left = UseFixed(instr->left(), edx); 17330ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* right = UseFixed(instr->right(), eax); 17340ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org LStringCompareAndBranch* result = new(zone()) 17360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LStringCompareAndBranch(context, left, right); 17370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry return MarkAsCall(result, instr); 17390ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17400ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17410ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 17434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HHasInstanceTypeAndBranch* instr) { 1744a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->value()->representation().IsTagged()); 1745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LHasInstanceTypeAndBranch( 1746c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org UseRegisterAtStart(instr->value()), 1747c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org TempRegister()); 1748a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1749a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 175149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 175249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org HGetCachedArrayIndex* instr) { 17538f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org ASSERT(instr->value()->representation().IsTagged()); 17548f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 17558f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org 1756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 175749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org} 175849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 175949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 17604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 17614f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HHasCachedArrayIndexAndBranch* instr) { 1762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->value()->representation().IsTagged()); 1763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LHasCachedArrayIndexAndBranch( 17644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org UseRegisterAtStart(instr->value())); 1765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1766a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1767a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 17694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HClassOfTestAndBranch* instr) { 1770a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->value()->representation().IsTagged()); 1771f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()), 1772f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com TempRegister(), 1773f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com TempRegister()); 1774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1775a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1776a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1777355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 1778355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org LOperand* map = UseRegisterAtStart(instr->value()); 1779355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return DefineAsRegister(new(zone()) LMapEnumLength(map)); 1780355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org} 1781355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 1782355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 17834efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 17844efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org LOperand* date = UseFixed(instr->value(), eax); 17854efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org LDateField* result = 17864efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org new(zone()) LDateField(date, FixedTemp(ecx), instr->index()); 1787de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org return MarkAsCall(DefineFixed(result, eax), instr, CAN_DEOPTIMIZE_EAGERLY); 17884efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org} 17894efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 17904efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 1791e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1792e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 1793e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1794e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 1795e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1796e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1797e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 17989af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgLOperand* LChunkBuilder::GetSeqStringSetCharOperand(HSeqStringSetChar* instr) { 17999af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (instr->encoding() == String::ONE_BYTE_ENCODING) { 18009af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (FLAG_debug_code) { 18019af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return UseFixed(instr->value(), eax); 18029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } else { 18039af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return UseFixedOrConstant(instr->value(), eax); 18049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } else { 18069af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (FLAG_debug_code) { 18079af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return UseRegisterAtStart(instr->value()); 18089af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } else { 18099af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return UseRegisterOrConstantAtStart(instr->value()); 18109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18119af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18129af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org} 18139af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 18149af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 181532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 1816e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 18179af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* index = FLAG_debug_code 18189af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ? UseRegisterAtStart(instr->index()) 18199af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org : UseRegisterOrConstantAtStart(instr->index()); 18209af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* value = GetSeqStringSetCharOperand(instr); 18219af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), esi) : NULL; 18229af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LInstruction* result = new(zone()) LSeqStringSetChar(context, string, 18239af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org index, value); 18249af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (FLAG_debug_code) { 18259af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org result = MarkAsCall(result, instr); 18269af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18279af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return result; 182832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org} 182932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 183032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 1831a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1832a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code && instr->skip_check()) return NULL; 1833a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1834a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* length = !index->IsConstantOperand() 1835a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ? UseOrConstantAtStart(instr->length()) 1836a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org : UseAtStart(instr->length()); 1837a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LInstruction* result = new(zone()) LBoundsCheck(index, length); 1838a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code || !instr->skip_check()) { 1839a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org result = AssignEnvironment(result); 1840a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 1841a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return result; 1842a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1843a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1844a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1845876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 1846876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org HBoundsCheckBaseIndexInformation* instr) { 1847876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org UNREACHABLE(); 1848876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org return NULL; 1849876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org} 1850876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1851876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1852c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 1853c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // The control instruction marking the end of a block that completed 1854c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // abruptly (e.g., threw an exception). There is nothing specific to do. 1855c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return NULL; 1856c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org} 1857c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1858c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1859d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 1860d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org return NULL; 1861d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 1862d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1863d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1864c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1865c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // All HForceRepresentation instructions should be eliminated in the 1866c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // representation change phase of Hydrogen. 1867c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org UNREACHABLE(); 1868c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org return NULL; 1869c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 1870c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1871c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1872a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) { 1873a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Representation from = instr->from(); 1874a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Representation to = instr->to(); 1875ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org HValue* val = instr->value(); 1876a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (from.IsSmi()) { 1877a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (to.IsTagged()) { 1878ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 187953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1880a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1881a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org from = Representation::Tagged(); 1882a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1883a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (from.IsTagged()) { 1884a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (to.IsDouble()) { 1885ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 18864a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org LOperand* temp = TempRegister(); 1887ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1888ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineAsRegister(new(zone()) LNumberUntagD(value, temp)); 1889ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1890b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 1891a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1892a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1893a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (val->type().IsSmi()) { 1894a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1895a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 189653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 1897a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1898a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(to.IsInteger32()); 1899662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (val->type().IsSmi() || val->representation().IsSmi()) { 1900662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* value = UseRegister(val); 190153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return DefineSameAsFirst(new(zone()) LSmiUntag(value, false)); 19027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org } else { 1903ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1904c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org bool truncating = instr->CanTruncateToInt32(); 19053c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org LOperand* xmm_temp = !truncating ? FixedTemp(xmm1) : NULL; 1906ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 1907ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp)); 19084edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1909b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 1910a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1911a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1912a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (from.IsDouble()) { 1913a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (to.IsTagged()) { 1914a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 1915ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegisterAtStart(val); 1916068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org LOperand* temp = FLAG_inline_new ? TempRegister() : NULL; 1917a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LUnallocated* result_temp = TempRegister(); 1918c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LNumberTagD* result = new(zone()) LNumberTagD(value, temp); 1919a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return AssignPointerMap(Define(result, result_temp)); 1920a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1921ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1922a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return AssignEnvironment( 1923a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org DefineAsRegister(new(zone()) LDoubleToSmi(value))); 1924a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1925a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(to.IsInteger32()); 1926c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org bool truncating = instr->CanTruncateToInt32(); 19273c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org bool needs_temp = !truncating; 1928ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = needs_temp ? UseTempRegister(val) : UseRegister(val); 1929c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LOperand* temp = needs_temp ? TempRegister() : NULL; 1930b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org LInstruction* result = 1931b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org DefineAsRegister(new(zone()) LDoubleToI(value, temp)); 1932b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (!truncating) result = AssignEnvironment(result); 1933b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 1934a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1935a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (from.IsInteger32()) { 1936a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 1937a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (to.IsTagged()) { 19387e6132b924829c353864933f29124419916db550machenbach@chromium.org LOperand* value = UseRegister(val); 1939381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (!instr->CheckFlag(HValue::kCanOverflow)) { 1940c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineSameAsFirst(new(zone()) LSmiTag(value)); 194146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } else if (val->CheckFlag(HInstruction::kUint32)) { 19427e6132b924829c353864933f29124419916db550machenbach@chromium.org LOperand* temp = TempRegister(); 19437e6132b924829c353864933f29124419916db550machenbach@chromium.org LNumberTagU* result = new(zone()) LNumberTagU(value, temp); 1944b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return AssignPointerMap(DefineSameAsFirst(result)); 1945a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1946bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp = TempRegister(); 1947bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LNumberTagI* result = new(zone()) LNumberTagI(value, temp); 1948b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return AssignPointerMap(DefineSameAsFirst(result)); 1949a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1950a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1951a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1952381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LSmiTag(value)); 1953381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1954381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1955a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1956381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1957a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 1958a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(to.IsDouble()); 1959ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 19607e6132b924829c353864933f29124419916db550machenbach@chromium.org return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 196146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } else { 1962ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val))); 196346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 1964a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1965a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1966a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 1967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 1968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1970a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 19711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 19724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org LOperand* value = UseAtStart(instr->value()); 19738f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org LInstruction* result = new(zone()) LCheckNonSmi(value); 1974eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org if (!instr->value()->type().IsHeapObject()) { 1975eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org result = AssignEnvironment(result); 1976eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 19778f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return result; 1978a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1979a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1980a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1981e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 1982e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1983e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckSmi(value)); 1984e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} 1985e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1986e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1987a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 1988a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1989a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* temp = TempRegister(); 1990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LCheckInstanceType* result = new(zone()) LCheckInstanceType(value, temp); 1991a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return AssignEnvironment(result); 1992a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 1993a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 19951f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 19961f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org // If the object is in new space, we'll emit a global cell compare and so 19971f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org // want the value in a register. If the object gets promoted before we 1998c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // emit code, we will still get the register but will do an immediate 1999c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // compare instead of the cell compare. This is safe. 20001f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org LOperand* value = instr->object_in_new_space() 2001003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org ? UseRegisterAtStart(instr->value()) : UseAtStart(instr->value()); 20021f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckValue(value)); 2003a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2004a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2005a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20061456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 2007af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 2008af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2009af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 2010af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->HasMigrationTarget()) { 2011af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org info()->MarkAsDeferredCalling(); 2012af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org result = AssignPointerMap(result); 2013594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 2014594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return result; 2015a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2016a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2017a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2018c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 2019c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org HValue* value = instr->value(); 2020c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org Representation input_rep = value->representation(); 2021c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org if (input_rep.IsDouble()) { 2022c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org LOperand* reg = UseRegister(value); 202389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return DefineFixed(new(zone()) LClampDToUint8(reg), eax); 2024c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } else if (input_rep.IsInteger32()) { 2025c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org LOperand* reg = UseFixed(value, eax); 2026c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineFixed(new(zone()) LClampIToUint8(reg), eax); 2027c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } else { 202853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org ASSERT(input_rep.IsSmiOrTagged()); 20293c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org LOperand* reg = UseFixed(value, eax); 20303c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org // Register allocator doesn't (yet) support allocation of double 20313c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org // temps. Reserve xmm1 explicitly. 20323c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org LOperand* temp = FixedTemp(xmm1); 20333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org LClampTToUint8* result = new(zone()) LClampTToUint8(reg, temp); 20343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org return AssignEnvironment(DefineFixed(result, eax)); 2035c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } 2036c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 2037c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 2038c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 2039ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2040ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org HValue* value = instr->value(); 2041ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org ASSERT(value->representation().IsDouble()); 2042ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2043ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2044ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2045ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2046ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2047ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* lo = UseRegister(instr->lo()); 2048ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* hi = UseRegister(instr->hi()); 2049ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2050ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2051ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2052ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2053a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2054935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = info()->IsStub() ? UseFixed(instr->context(), esi) : NULL; 20556e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2056935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return new(zone()) LReturn( 2057935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org UseFixed(instr->value(), eax), context, parameter_count); 2058a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2059a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2060a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2061a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 2062a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Representation r = instr->representation(); 2063b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (r.IsSmi()) { 2064b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org return DefineAsRegister(new(zone()) LConstantS); 2065b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsInteger32()) { 2066c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineAsRegister(new(zone()) LConstantI); 2067a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else if (r.IsDouble()) { 2068a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org double value = instr->DoubleValue(); 2069e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org bool value_is_zero = BitCast<uint64_t, double>(value) == 0; 2070169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org LOperand* temp = value_is_zero ? NULL : TempRegister(); 2071169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org return DefineAsRegister(new(zone()) LConstantD(temp)); 2072d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (r.IsExternal()) { 2073d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return DefineAsRegister(new(zone()) LConstantE); 2074b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsTagged()) { 2075c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineAsRegister(new(zone()) LConstantT); 2076a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 2077c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org UNREACHABLE(); 2078a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2079a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 2080a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2081a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2082a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2083c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 2084c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 2085c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return instr->RequiresHoleCheck() 2086a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 2087a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org : DefineAsRegister(result); 2088a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2089a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2090a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2091c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 2092c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org LOperand* context = UseFixed(instr->context(), esi); 20931044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org LOperand* global_object = UseFixed(instr->global_object(), edx); 2094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LLoadGlobalGeneric* result = 2095c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LLoadGlobalGeneric(context, global_object); 2096c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 2097c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 2098c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2099c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 210074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 210174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org LStoreGlobalCell* result = 2102e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org new(zone()) LStoreGlobalCell(UseRegister(instr->value())); 2103c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result; 2104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2107c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 210883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* context = UseRegisterAtStart(instr->value()); 210964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org LInstruction* result = 211064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org DefineAsRegister(new(zone()) LLoadContextSlot(context)); 2111b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2112b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org result = AssignEnvironment(result); 2113b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org } 2114b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 211583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 211683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 211783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 211883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 211983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* value; 212083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* temp; 2121c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOperand* context = UseRegister(instr->context()); 212283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org if (instr->NeedsWriteBarrier()) { 212383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org value = UseTempRegister(instr->value()); 212483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org temp = TempRegister(); 212583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } else { 212683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org value = UseRegister(instr->value()); 212783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org temp = NULL; 212883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 212964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp); 2130b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2131b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org result = AssignEnvironment(result); 2132b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org } 2133b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 2134c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2135c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2136c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 2138d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org LOperand* obj = (instr->access().IsExternalMemory() && 2139d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org instr->access().offset() == 0) 2140d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ? UseRegisterOrConstantAtStart(instr->object()) 2141d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org : UseRegisterAtStart(instr->object()); 214257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 2143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 2147496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 21481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org LOperand* object = UseFixed(instr->object(), edx); 2149c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(context, object); 2150c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 2151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 21549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 21559e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org HLoadFunctionPrototype* instr) { 21569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org return AssignEnvironment(DefineAsRegister( 2157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()), 2158c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org TempRegister()))); 21599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org} 21609e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 21619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 2162528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2163528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineAsRegister(new(zone()) LLoadRoot); 2164528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 2165528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2166528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2167e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org ASSERT(instr->key()->representation().IsSmiOrInteger32()); 216983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org ElementsKind elements_kind = instr->elements_kind(); 2170eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org bool clobbers_key = ExternalArrayOpRequiresTemp( 2171eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org instr->key()->representation(), elements_kind); 2172eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* key = clobbers_key 2173304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org ? UseTempRegister(instr->key()) 2174e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org : UseRegisterOrConstantAtStart(instr->key()); 2175b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org LInstruction* result = NULL; 2176304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 21775c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2178eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* obj = UseRegisterAtStart(instr->elements()); 2179b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); 2180eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } else { 2181e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org ASSERT( 2182e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org (instr->representation().IsInteger32() && 21835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org !(IsDoubleOrFloatElementsKind(instr->elements_kind()))) || 2184e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org (instr->representation().IsDouble() && 21855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (IsDoubleOrFloatElementsKind(instr->elements_kind())))); 21865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 2187b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key)); 2188e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 2189e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 2190b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org if ((instr->is_external() || instr->is_fixed_typed_array()) ? 2191b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // see LCodeGen::DoLoadKeyedExternalArray 2192b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org ((instr->elements_kind() == EXTERNAL_UINT32_ELEMENTS || 2193b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org instr->elements_kind() == UINT32_ELEMENTS) && 2194b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org !instr->CheckFlag(HInstruction::kUint32)) : 2195b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // see LCodeGen::DoLoadKeyedFixedDoubleArray and 2196b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org // LCodeGen::DoLoadKeyedFixedArray 2197b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org instr->RequiresHoleCheck()) { 2198b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org result = AssignEnvironment(result); 2199b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org } 2200b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return result; 2201496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org} 2202496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 2203496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 2204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 2205496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* object = UseFixed(instr->object(), edx); 22071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org LOperand* key = UseFixed(instr->key(), ecx); 2208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2209c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LLoadKeyedGeneric* result = 2210c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LLoadKeyedGeneric(context, object, key); 2211c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 2212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLOperand* LChunkBuilder::GetStoreKeyedValueOperand(HStoreKeyed* instr) { 2216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ElementsKind elements_kind = instr->elements_kind(); 2217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Determine if we need a byte register in this case for the value. 2219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org bool val_is_fixed_register = 2220af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org elements_kind == EXTERNAL_INT8_ELEMENTS || 2221af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org elements_kind == EXTERNAL_UINT8_ELEMENTS || 2222af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org elements_kind == EXTERNAL_UINT8_CLAMPED_ELEMENTS || 22235c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org elements_kind == UINT8_ELEMENTS || 22245c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org elements_kind == INT8_ELEMENTS || 22255c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org elements_kind == UINT8_CLAMPED_ELEMENTS; 2226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (val_is_fixed_register) { 2227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return UseFixed(instr->value(), eax); 2228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 2229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return UseRegister(instr->value()); 2231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 2232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2234e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 22355c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2236e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org ASSERT(instr->elements()->representation().IsTagged()); 2237e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org ASSERT(instr->key()->representation().IsInteger32() || 2238a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org instr->key()->representation().IsSmi()); 2239717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 2240eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (instr->value()->representation().IsDouble()) { 2241eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* object = UseRegisterAtStart(instr->elements()); 2242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* val = NULL; 2243169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org val = UseRegisterAtStart(instr->value()); 2244eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 22458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return new(zone()) LStoreKeyed(object, key, val); 2246e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } else { 2247a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org ASSERT(instr->value()->representation().IsSmiOrTagged()); 2248eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2249eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 2250eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* obj = UseRegister(instr->elements()); 225177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* val; 225277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* key; 225377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (needs_write_barrier) { 225477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseTempRegister(instr->value()); 225577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org key = UseTempRegister(instr->key()); 225677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } else { 2257f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org val = UseRegisterOrConstantAtStart(instr->value()); 2258f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 225977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 22608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return new(zone()) LStoreKeyed(obj, key, val); 2261e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 22627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org } 2263e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 22648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ElementsKind elements_kind = instr->elements_kind(); 22658e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ASSERT( 22668e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (instr->value()->representation().IsInteger32() && 22675c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org !IsDoubleOrFloatElementsKind(elements_kind)) || 22688e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org (instr->value()->representation().IsDouble() && 22695c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org IsDoubleOrFloatElementsKind(elements_kind))); 22705c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ASSERT((instr->is_fixed_typed_array() && 22715c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsTagged()) || 22725c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (instr->is_external() && 22735c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsExternal())); 22748e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 22755c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 2276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* val = GetStoreKeyedValueOperand(instr); 22778e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool clobbers_key = ExternalArrayOpRequiresTemp( 22788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org instr->key()->representation(), elements_kind); 22798e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* key = clobbers_key 22808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ? UseTempRegister(instr->key()) 22818e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : UseRegisterOrConstantAtStart(instr->key()); 22825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return new(zone()) LStoreKeyed(backing_store, key, val); 22833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 22843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 22853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2286a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2287496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2288496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* object = UseFixed(instr->object(), edx); 2289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org LOperand* key = UseFixed(instr->key(), ecx); 2290496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* value = UseFixed(instr->value(), eax); 2291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2292a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->object()->representation().IsTagged()); 2293a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->key()->representation().IsTagged()); 2294a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ASSERT(instr->value()->representation().IsTagged()); 2295a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2296496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LStoreKeyedGeneric* result = 2297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LStoreKeyedGeneric(context, object, key, value); 2298496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org return MarkAsCall(result, instr); 2299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2301a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2302394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comLInstruction* LChunkBuilder::DoTransitionElementsKind( 2303394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com HTransitionElementsKind* instr) { 2304003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 2305394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* object = UseRegister(instr->object()); 2306394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* new_map_reg = TempRegister(); 2307394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* temp_reg = TempRegister(); 2308394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LTransitionElementsKind* result = 230994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org new(zone()) LTransitionElementsKind(object, NULL, 231094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org new_map_reg, temp_reg); 231194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return result; 2312d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else { 23132f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseFixed(instr->object(), eax); 2314cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org LOperand* context = UseFixed(instr->context(), esi); 231594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LTransitionElementsKind* result = 231694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org new(zone()) LTransitionElementsKind(object, context, NULL, NULL); 23172f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return MarkAsCall(result, instr); 2318394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 2319394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 2320394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 2321394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 232294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento( 232394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org HTrapAllocationMemento* instr) { 232494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* object = UseRegister(instr->object()); 232594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp = TempRegister(); 232694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LTrapAllocationMemento* result = 232794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org new(zone()) LTrapAllocationMemento(object, temp); 232894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return AssignEnvironment(result); 232994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org} 233094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 233194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2332a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 233353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org bool is_in_object = instr->access().IsInobject(); 2334d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org bool is_external_location = instr->access().IsExternalMemory() && 2335d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org instr->access().offset() == 0; 23369e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2337594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool needs_write_barrier_for_map = instr->has_transition() && 233837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org instr->NeedsWriteBarrierForMap(); 2339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2340c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com LOperand* obj; 2341c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (needs_write_barrier) { 234253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org obj = is_in_object 2343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ? UseRegister(instr->object()) 2344c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : UseTempRegister(instr->object()); 2345d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (is_external_location) { 2346d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ASSERT(!is_in_object); 2347d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ASSERT(!needs_write_barrier); 2348d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ASSERT(!needs_write_barrier_for_map); 2349d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org obj = UseRegisterOrConstant(instr->object()); 2350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 235137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org obj = needs_write_barrier_for_map 235237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 235337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseRegisterAtStart(instr->object()); 2354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 2355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2356f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org bool can_be_constant = instr->value()->IsConstant() && 2357f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org HConstant::cast(instr->value())->NotInNewSpace() && 2358bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org !instr->field_representation().IsDouble(); 2359f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 236077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* val; 2361935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (instr->field_representation().IsInteger8() || 2362935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr->field_representation().IsUInteger8()) { 236325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // mov_b requires a byte register (i.e. any of eax, ebx, ecx, edx). 236425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org // Just force the value to be in eax and we're safe here. 236525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org val = UseFixed(instr->value(), eax); 236625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org } else if (needs_write_barrier) { 236777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseTempRegister(instr->value()); 2368f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } else if (can_be_constant) { 236977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseRegisterOrConstant(instr->value()); 2370bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org } else if (instr->field_representation().IsSmi()) { 2371f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org val = UseTempRegister(instr->value()); 2372bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org } else if (instr->field_representation().IsDouble()) { 2373169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org val = UseRegisterAtStart(instr->value()); 237477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } else { 237577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseRegister(instr->value()); 237677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 2377a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2378a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // We only need a scratch register if we have a write barrier or we 2379a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // have a store into the properties array (not in-object-property). 238053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org LOperand* temp = (!is_in_object || needs_write_barrier || 238157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org needs_write_barrier_for_map) ? TempRegister() : NULL; 238237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org 238337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org // We need a temporary register for write barrier of the map field. 238437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org LOperand* temp_map = needs_write_barrier_for_map ? TempRegister() : NULL; 2385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2386d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return new(zone()) LStoreNamedField(obj, val, temp, temp_map); 2387a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2388a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2391496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2392496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* object = UseFixed(instr->object(), edx); 2393496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* value = UseFixed(instr->value(), eax); 2394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LStoreNamedGeneric* result = 2396c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LStoreNamedGeneric(context, object, value); 2397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(result, instr); 2398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2400a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2401160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2402ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2403bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* left = UseFixed(instr->left(), edx); 2404bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* right = UseFixed(instr->right(), eax); 2405c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LStringAdd* string_add = new(zone()) LStringAdd(context, left, right); 2406ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org return MarkAsCall(DefineFixed(string_add, eax), instr); 2407160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2408160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2409160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 24100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 24114668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org LOperand* string = UseTempRegister(instr->string()); 24124668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org LOperand* index = UseTempRegister(instr->index()); 2413ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2414c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LStringCharCodeAt* result = 2415c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LStringCharCodeAt(context, string, index); 2416b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 24170a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 24180a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 24190a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 2420b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 2421b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org LOperand* char_code = UseRegister(instr->value()); 2422ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2423c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LStringCharFromCode* result = 2424c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org new(zone()) LStringCharFromCode(context, char_code); 2425b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2426b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 2427b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 2428b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 242994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 243094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org info()->MarkAsDeferredCalling(); 243194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* context = UseAny(instr->context()); 2432f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org LOperand* size = instr->size()->IsConstant() 2433f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org ? UseConstant(instr->size()) 2434f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org : UseTempRegister(instr->size()); 243594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp = TempRegister(); 243694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LAllocate* result = new(zone()) LAllocate(context, size, temp); 243794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return AssignPointerMap(DefineAsRegister(result)); 243894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org} 243994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 244094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2442ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall( 2444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org DefineFixed(new(zone()) LRegExpLiteral(context), eax), instr); 2445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 2449ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2450c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall( 2451c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org DefineFixed(new(zone()) LFunctionLiteral(context), eax), instr); 2452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 245633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org ASSERT(argument_count_ == 0); 2457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org allocator_->MarkAsOsrEntry(); 2458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_->last_environment()->set_ast_id(instr->ast_id()); 2459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignEnvironment(new(zone()) LOsrEntry); 2460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2464a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org LParameter* result = new(zone()) LParameter; 24652f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (instr->kind() == HParameter::STACK_PARAMETER) { 2466a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2467a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return DefineAsSpilled(result, spill_index); 2468a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } else { 2469a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org ASSERT(info()->IsStub()); 2470a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org CodeStubInterfaceDescriptor* descriptor = 2471f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org info()->code_stub()->GetInterfaceDescriptor(); 2472ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org int index = static_cast<int>(instr->index()); 24730cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org Register reg = descriptor->GetParameterRegister(index); 2474a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return DefineFixed(result, reg); 2475a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 2476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2480c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // Use an index that corresponds to the location in the unoptimized frame, 2481c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which the optimized frame will subsume. 2482c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int env_index = instr->index(); 2483c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int spill_index = 0; 2484c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (instr->environment()->is_parameter_index(env_index)) { 2485c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = chunk()->GetParameterStackSlot(env_index); 2486c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } else { 2487c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = env_index - instr->environment()->first_local_index(); 2488c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2489c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org Abort(kNotEnoughSpillSlotsForOsr); 2490c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = 0; 2491c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 2492c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (spill_index == 0) { 2493c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // The dynamic frame alignment state overwrites the first local. 2494c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // The first local is saved at the end of the unoptimized frame. 2495c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = graph()->osr()->UnoptimizedFrameSlots(); 2496c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 249704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 2498c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 2503496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LCallStub* result = new(zone()) LCallStub(context); 2505496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 2506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 25103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // There are no real uses of the arguments object. 25113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // arguments.length and element access are supported directly on 25123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // stack arguments, and any real arguments object use causes a bailout. 25133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // So this value is never used. 2514a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2515a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2516a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2518594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2519662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 25201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2521594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // There are no real uses of a captured object. 2522594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return NULL; 2523594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 2524594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2525594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 252777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 2528c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org LOperand* args = UseRegister(instr->arguments()); 252977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* length; 253077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* index; 253177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (instr->length()->IsConstant() && instr->index()->IsConstant()) { 253277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org length = UseRegisterOrConstant(instr->length()); 253377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org index = UseOrConstant(instr->index()); 253477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } else { 253577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org length = UseTempRegister(instr->length()); 253677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org index = Use(instr->index()); 253777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 2538c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 2539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2542ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 2543ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOperand* object = UseFixed(instr->value(), eax); 2544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LToFastProperties* result = new(zone()) LToFastProperties(object); 2545ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 2546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2547ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2548ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2550ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2551ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* value = UseAtStart(instr->value()); 2552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org LTypeof* result = new(zone()) LTypeof(context, value); 2553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return MarkAsCall(DefineFixed(result, eax), instr); 2554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 25574f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 2558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 2559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2561d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 25624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 25634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HIsConstructCallAndBranch* instr) { 2564c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return new(zone()) LIsConstructCallAndBranch(TempRegister()); 2565d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com} 2566d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2567d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2568a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2569662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 2570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2571a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2575a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 257604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org if (instr->is_function_entry()) { 2577ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2578c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return MarkAsCall(new(zone()) LStackCheck(context), instr); 257904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } else { 258004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org ASSERT(instr->is_backwards_branch()); 2581ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org LOperand* context = UseAny(instr->context()); 2582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org return AssignEnvironment( 2583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org AssignPointerMap(new(zone()) LStackCheck(context))); 258404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 2585a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 2589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* outer = current_block_->last_environment(); 2590f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org outer->set_ast_id(instr->ReturnId()); 2591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HConstant* undefined = graph()->GetConstantUndefined(); 2592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org HEnvironment* inner = outer->CopyForInlining(instr->closure(), 2593659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org instr->arguments_count(), 2594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org instr->function(), 259540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org undefined, 2596e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org instr->inlining_kind()); 2597b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org // Only replay binding of arguments object if it wasn't removed from graph. 2598b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2599b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org inner->Bind(instr->arguments_var(), instr->arguments_object()); 26008c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org } 260156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org inner->set_entry(instr); 2602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_->UpdateEnvironment(inner); 2603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org chunk_->AddInlinedClosure(instr->closure()); 2604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 2605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 260928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org LInstruction* pop = NULL; 261028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 261128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org HEnvironment* env = current_block_->last_environment(); 261228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 261333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (env->entry()->arguments_pushed()) { 261428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int argument_count = env->arguments_environment()->parameter_count(); 261528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org pop = new(zone()) LDrop(argument_count); 2616d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org ASSERT(instr->argument_delta() == -argument_count); 261728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 261828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 2619659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org HEnvironment* outer = current_block_->last_environment()-> 2620659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org DiscardInlined(false); 2621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org current_block_->UpdateEnvironment(outer); 262228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return pop; 2623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 2624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2626be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2627be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* context = UseFixed(instr->context(), esi); 2628be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* object = UseFixed(instr->enumerable(), eax); 2629be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 2630be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return MarkAsCall(DefineFixed(result, eax), instr, CAN_DEOPTIMIZE_EAGERLY); 2631be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2632be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2633be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2634be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 2635be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* map = UseRegister(instr->map()); 2636be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return AssignEnvironment(DefineAsRegister( 2637be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org new(zone()) LForInCacheArray(map))); 2638be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2639be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2640be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2641be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 2642be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2643be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* map = UseRegisterAtStart(instr->map()); 2644be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 2645be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2646be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2647be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2648be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2649be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* object = UseRegister(instr->object()); 2650be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* index = UseTempRegister(instr->index()); 265163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 265263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LInstruction* result = DefineSameAsFirst(load); 265363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org return AssignPointerMap(result); 2654be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2655be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2656be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 26571e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 26581e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->context()); 26591e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return new(zone()) LStoreFrameContext(context); 26601e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 26611e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26621e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26631e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext( 26641e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org HAllocateBlockContext* instr) { 26651e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), esi); 26661e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 26671e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LAllocateBlockContext* result = 26681e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org new(zone()) LAllocateBlockContext(context, function); 26691e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return MarkAsCall(DefineFixed(result, esi), instr); 26701e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 26711e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26721e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 2673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} } // namespace v8::internal 2674c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2675c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#endif // V8_TARGET_ARCH_IA32 2676