13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without 33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are 43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met: 53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions of source code must retain the above copyright 73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// notice, this list of conditions and the following disclaimer. 83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Redistributions in binary form must reproduce the above 93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// copyright notice, this list of conditions and the following 103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// disclaimer in the documentation and/or other materials provided 113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// with the distribution. 123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * Neither the name of Google Inc. nor the names of its 133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// contributors may be used to endorse or promote products derived 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// from this software without specific prior written permission. 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "v8.h" 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "lithium-allocator-inl.h" 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "mips/lithium-mips.h" 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "mips/lithium-codegen-mips.h" 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 { 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal { 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_COMPILE(type) \ 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void L##type::CompileToNative(LCodeGen* generator) { \ 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch generator->Do##type(this); \ 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_COMPILE 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOsrEntry::LOsrEntry() { 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < Register::kNumAllocatableRegisters; ++i) { 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch register_spills_[i] = NULL; 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; ++i) { 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double_register_spills_[i] = NULL; 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LOsrEntry::MarkSpilledRegister(int allocation_index, 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* spill_operand) { 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(spill_operand->IsStackSlot()); 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(register_spills_[allocation_index] == NULL); 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch register_spills_[allocation_index] = spill_operand; 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::VerifyCall() { 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Call instructions can use only fixed registers as temporaries and 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // outputs because all registers are blocked by the calling convention. 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Inputs operands must use a fixed register or use-at-start policy or 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a non-register policy. 683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(Output() == NULL || 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::cast(Output())->HasFixedPolicy() || 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !LUnallocated::cast(Output())->HasRegisterPolicy()); 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (UseIterator it(this); !it.Done(); it.Advance()) { 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(operand->HasFixedPolicy() || 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->IsUsedAtStart()); 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (TempIterator it(this); !it.Done(); it.Advance()) { 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LOsrEntry::MarkSpilledDoubleRegister(int allocation_index, 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* spill_operand) { 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(spill_operand->IsDoubleStackSlot()); 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(double_register_spills_[allocation_index] == NULL); 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double_register_spills_[allocation_index] = spill_operand; 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::PrintTo(StringStream* stream) { 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s ", this->Mnemonic()); 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintOutputOperandTo(stream); 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintDataTo(stream); 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasEnvironment()) { 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch environment()->PrintTo(stream); 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasPointerMap()) { 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pointer_map()->PrintTo(stream); 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int R, int I, int T> 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) { 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < inputs_.length(); i++) { 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i > 0) stream->Add(" "); 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inputs_[i]->PrintTo(stream); 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int R, int I, int T> 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) { 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < results_.length(); i++) { 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i > 0) stream->Add(" "); 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch results_[i]->PrintTo(stream); 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLabel::PrintDataTo(StringStream* stream) { 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LGap::PrintDataTo(stream); 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLabel* rep = replacement(); 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (rep != NULL) { 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" Dead block replaced with B%d", rep->block_id()); 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LGap::IsRedundant() const { 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < 4; i++) { 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGap::PrintDataTo(StringStream* stream) { 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < 4; i++) { 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("("); 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parallel_moves_[i] != NULL) { 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch parallel_moves_[i]->PrintDataTo(stream); 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") "); 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticD::Mnemonic() const { 1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op()) { 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::ADD: return "add-d"; 1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SUB: return "sub-d"; 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MUL: return "mul-d"; 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::DIV: return "div-d"; 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MOD: return "mod-d"; 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticT::Mnemonic() const { 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op()) { 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::ADD: return "add-t"; 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SUB: return "sub-t"; 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MUL: return "mul-t"; 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MOD: return "mod-t"; 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::DIV: return "div-t"; 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_AND: return "bit-and-t"; 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_OR: return "bit-or-t"; 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_XOR: return "bit-xor-t"; 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SHL: return "sll-t"; 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SAR: return "sra-t"; 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SHR: return "srl-t"; 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGoto::PrintDataTo(StringStream* stream) { 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("B%d", block_id()); 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LBranch::PrintDataTo(StringStream* stream) { 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCmpIDAndBranch::PrintDataTo(StringStream* stream) { 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if "); 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %s ", Token::String(op())); 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(1)->PrintTo(stream); 2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsNilAndBranch::PrintDataTo(StringStream* stream) { 2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if "); 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(kind() == kStrictEquality ? " === " : " == "); 2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(nil() == kNullValue ? "null" : "undefined"); 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_object("); 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_string("); 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_smi("); 2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_undetectable("); 2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if string_compare("); 2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(1)->PrintTo(stream); 2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if has_instance_type("); 2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if has_cached_array_index("); 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if class_of_test("); 2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(", \"%o\") then B%d else B%d", 2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *hydrogen()->class_name(), 2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch true_block_id(), 2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch false_block_id()); 2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if typeof "); 2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" == \"%s\" then B%d else B%d", 2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *hydrogen()->type_literal()->ToCString(), 2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch true_block_id(), false_block_id()); 2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallConstantFunction::PrintDataTo(StringStream* stream) { 2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("#%d / ", arity()); 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LUnaryMathOperation::PrintDataTo(StringStream* stream) { 2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("/%s ", hydrogen()->OpName()); 3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d]", slot_index()); 3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d] <- ", slot_index()); 3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(1)->PrintTo(stream); 3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" #%d / ", arity()); 3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallKeyed::PrintDataTo(StringStream* stream) { 3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[a2] #%d / ", arity()); 3263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallNamed::PrintDataTo(StringStream* stream) { 3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SmartArrayPointer<char> name_string = name()->ToCString(); 3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s #%d / ", *name_string, arity()); 3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallGlobal::PrintDataTo(StringStream* stream) { 3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SmartArrayPointer<char> name_string = name()->ToCString(); 3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s #%d / ", *name_string, arity()); 3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallKnownGlobal::PrintDataTo(StringStream* stream) { 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("#%d / ", arity()); 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallNew::PrintDataTo(StringStream* stream) { 3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" #%d / ", arity()); 3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments()->PrintTo(stream); 3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" length "); 3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length()->PrintTo(stream); 3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" index "); 3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index()->PrintTo(stream); 3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("."); 3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" <- "); 3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("."); 3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" <- "); 3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("] <- "); 3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { 3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements()->PrintTo(stream); 3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("] <- "); 3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("] <- "); 4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLChunk::LChunk(CompilationInfo* info, HGraph* graph) 4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : spill_slot_count_(0), 4173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch info_(info), 4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch graph_(graph), 4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instructions_(32), 4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pointer_maps_(8), 4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inlined_closures_(1) { 4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::GetNextSpillIndex(bool is_double) { 4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Skip a slot if for a double-width slot. 4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_double) spill_slot_count_++; 4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return spill_slot_count_++; 4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunk::GetNextSpillSlot(bool is_double) { 4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index = GetNextSpillIndex(is_double); 4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_double) { 4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return LDoubleStackSlot::Create(index); 4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return LStackSlot::Create(index); 4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunk::MarkEmptyBlocks() { 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhase phase("L_Mark empty blocks", this); 4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < graph()->blocks()->length(); ++i) { 4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* block = graph()->blocks()->at(i); 4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int first = block->first_instruction_index(); 4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int last = block->last_instruction_index(); 4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* first_instr = instructions()->at(first); 4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* last_instr = instructions()->at(last); 4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLabel* label = LLabel::cast(first_instr); 4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (last_instr->IsGoto()) { 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LGoto* goto_instr = LGoto::cast(last_instr); 4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (label->IsRedundant() && 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !label->is_loop_header()) { 4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool can_eliminate = true; 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = first + 1; i < last && can_eliminate; ++i) { 4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* cur = instructions()->at(i); 4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (cur->IsGap()) { 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LGap* gap = LGap::cast(cur); 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!gap->IsRedundant()) { 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch can_eliminate = false; 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch can_eliminate = false; 4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (can_eliminate) { 4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch label->set_replacement(GetLabel(goto_instr->block_id())); 4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) { 4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstructionGap* gap = new(graph_->zone()) LInstructionGap(block); 4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index = -1; 4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->IsControl()) { 4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instructions_.Add(gap); 4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index = instructions_.length(); 4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instructions_.Add(instr); 4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index = instructions_.length(); 4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instructions_.Add(instr); 4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instructions_.Add(gap); 4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->HasPointerMap()) { 4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pointer_maps_.Add(instr->pointer_map()); 4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->pointer_map()->set_lithium_position(index); 4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLConstantOperand* LChunk::DefineConstantOperand(HConstant* constant) { 4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return LConstantOperand::Create(constant->id()); 4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::GetParameterStackSlot(int index) const { 5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The receiver is at index 0, the first parameter at index 1, so we 5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // shift all parameter indexes down by the number of parameters, and 5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // make sure they end up negative so they are distinguishable from 5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // spill slots. 5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int result = index - info()->scope()->num_parameters() - 1; 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(result < 0); 5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A parameter relative to ebp in the arguments stub. 5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::ParameterAt(int index) { 5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(-1 <= index); // -1 is the receiver. 5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (1 + info()->scope()->num_parameters() - index) * 5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kPointerSize; 5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLGap* LChunk::GetGapAt(int index) const { 5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return LGap::cast(instructions_[index]); 5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LChunk::IsGapAt(int index) const { 5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instructions_[index]->IsGap(); 5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::NearestGapPos(int index) const { 5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (!IsGapAt(index)) index--; 5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return index; 5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunk::AddGapMove(int index, LOperand* from, LOperand* to) { 5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GetGapAt(index)->GetOrCreateParallelMove(LGap::START)->AddMove(from, to); 5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> LChunk::LookupLiteral(LConstantOperand* operand) const { 5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HConstant::cast(graph_->LookupValue(operand->index()))->handle(); 5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRepresentation LChunk::LookupLiteralRepresentation( 5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LConstantOperand* operand) const { 5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return graph_->LookupValue(operand->index())->representation(); 5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLChunk* LChunkBuilder::Build() { 5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(is_unused()); 5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunk_ = new(zone()) LChunk(info(), graph()); 5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhase phase("L_Building chunk", chunk_); 5563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch status_ = BUILDING; 5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < blocks->length(); i++) { 5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* next = NULL; 5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i < blocks->length() - 1) next = blocks->at(i + 1); 5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DoBasicBlock(blocks->at(i), next); 5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_aborted()) return NULL; 5633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch status_ = DONE; 5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return chunk_; 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::Abort(const char* format, ...) { 5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (FLAG_trace_bailout) { 5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SmartArrayPointer<char> name( 5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch info()->shared_info()->DebugName()->ToCString()); 5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintF("Aborting LChunk building in @\"%s\": ", *name); 5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch va_list arguments; 5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch va_start(arguments, format); 5763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch OS::VPrint(format, arguments); 5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch va_end(arguments); 5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintF("\n"); 5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch status_ = ABORTED; 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Register::ToAllocationIndex(reg)); 5873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DoubleRegister::ToAllocationIndex(reg)); 5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, ToUnallocated(fixed_register)); 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) { 6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, ToUnallocated(reg)); 6033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) { 6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, 6133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::USED_AT_START)); 6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 6203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value) { 6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) { 6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::USED_AT_START)); 6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 6363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 6373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value); 6383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 6443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseAtStart(value); 6453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 6513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegister(value); 6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegisterAtStart(value); 6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAny(HValue* value) { 6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 6643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->EmitAtUses()) { 6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* instr = HInstruction::cast(value); 6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VisitInstruction(instr); 6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(value->id()); 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T> 6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr, 6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* result) { 6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->set_virtual_register(current_instruction_->id()); 6833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_result(result); 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T> 6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsRegister( 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTemplateInstruction<1, I, T>* instr) { 6913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T> 6973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsSpilled( 6983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTemplateInstruction<1, I, T>* instr, int index) { 6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 7003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T> 7053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineSameAsFirst( 7063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTemplateInstruction<1, I, T>* instr) { 7073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 7083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 7093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T> 7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixed( 7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTemplateInstruction<1, I, T>* instr, Register reg) { 7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, ToUnallocated(reg)); 7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T> 7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixedDouble( 7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTemplateInstruction<1, I, T>* instr, DoubleRegister reg) { 7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, ToUnallocated(reg)); 7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* hydrogen_env = current_block_->last_environment(); 7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int argument_index_accumulator = 0; 7293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_environment(CreateEnvironment(hydrogen_env, 7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &argument_index_accumulator)); 7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment( 7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* instr, int ast_id) { 7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instruction_pending_deoptimization_environment_ == NULL); 7383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); 7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instruction_pending_deoptimization_environment_ = instr; 7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pending_deoptimization_ast_id_ = ast_id; 7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() { 7463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instruction_pending_deoptimization_environment_ = NULL; 7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pending_deoptimization_ast_id_ = AstNode::kNoNumber; 7483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* hinstr, 7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CanDeoptimize can_deoptimize) { 7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->VerifyCall(); 7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->MarkAsCall(); 7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignPointerMap(instr); 7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hinstr->HasObservableSideEffects()) { 7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(hinstr->next()->IsSimulate()); 7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HSimulate* sim = HSimulate::cast(hinstr->next()); 7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = SetInstructionPendingDeoptimizationEnvironment( 7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr, sim->ast_id()); 7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If instruction does not have side-effects lazy deoptimization 7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // after the call will try to deoptimize to the point before the call. 7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Thus we still need to attach environment to this call even if 7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // call sequence can not deoptimize eagerly. 7713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_environment = 7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 7733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !hinstr->HasObservableSideEffects(); 7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (needs_environment && !instr->HasEnvironment()) { 7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignEnvironment(instr); 7763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7823ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) { 7833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->MarkAsSaveDoubles(); 7843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 7893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!instr->HasPointerMap()); 7903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_pointer_map(new(zone()) LPointerMap(position_)); 7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 7923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::TempRegister() { 7963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = 7973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 7983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(allocator_->GetVirtualRegister()); 7993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!allocator_->AllocationOk()) Abort("Not enough virtual registers."); 8003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 8013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) { 8053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = ToUnallocated(reg); 8063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(operand->HasFixedPolicy()); 8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = ToUnallocated(reg); 8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(operand->HasFixedPolicy()); 8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LLabel(instr->block()); 8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSoftDeoptimize(HSoftDeoptimize* instr) { 8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 8293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 8303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShift(Token::Value op, 8343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBitwiseBinaryOperation* instr) { 8353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsTagged()) { 8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsTagged()); 8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsTagged()); 8383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 8403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = new(zone()) LArithmeticT(op, left, right); 8423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 8433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsInteger32()); 8463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right_value = instr->right(); 8513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = NULL; 8523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int constant_value = 0; 8533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (right_value->IsConstant()) { 8543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* constant = HConstant::cast(right_value); 8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = chunk_->DefineConstantOperand(constant); 8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch constant_value = constant->Integer32Value() & 0x1f; 8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 8583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterAtStart(right_value); 8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Shift operations can only deoptimize if we do a logical shift 8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // by 0 and the result cannot be truncated to int32. 8633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool may_deopt = (op == Token::SHR && constant_value == 0); 8643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool does_deopt = false; 8653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (may_deopt) { 8663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { 8673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) { 8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch does_deopt = true; 8693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt)); 8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return does_deopt ? AssignEnvironment(result) : result; 8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HArithmeticBinaryOperation* instr) { 8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsDouble()); 8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsDouble()); 8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsDouble()); 8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(op != Token::MOD); 8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(result); 8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HArithmeticBinaryOperation* instr) { 8953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(op == Token::ADD || 8963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op == Token::DIV || 8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op == Token::MOD || 8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op == Token::MUL || 8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op == Token::SUB); 9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left = instr->left(); 9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right = instr->right(); 9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(left->representation().IsTagged()); 9033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(right->representation().IsTagged()); 9043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left_operand = UseFixed(left, a1); 9053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right_operand = UseFixed(right, a0); 9063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = 9073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LArithmeticT(op, left_operand, right_operand); 9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 9093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 9133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(is_building()); 9143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_ = block; 9153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_block_ = next_block; 9163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (block->IsStartBlock()) { 9173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(graph_->start_environment()); 9183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = 0; 9193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (block->predecessors()->length() == 1) { 9203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We have a single predecessor => copy environment and outgoing 9213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // argument count from the predecessor. 9223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(block->phis()->length() == 0); 9233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* pred = block->predecessors()->at(0); 9243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* last_environment = pred->last_environment(); 9253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(last_environment != NULL); 9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Only copy the environment, if it is later used again. 9273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pred->end()->SecondSuccessor() == NULL) { 9283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(pred->end()->FirstSuccessor() == block); 9293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 9303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 9313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_environment = last_environment->Copy(); 9333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(last_environment); 9363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(pred->argument_count() >= 0); 9373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = pred->argument_count(); 9383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We are at a state join => process phis. 9403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* pred = block->predecessors()->at(0); 9413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // No need to copy the environment, it cannot be used later. 9423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* last_environment = pred->last_environment(); 9433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < block->phis()->length(); ++i) { 9443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* phi = block->phis()->at(i); 9453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_environment->SetValueAt(phi->merged_index(), phi); 9463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < block->deleted_phis()->length(); ++i) { 9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_environment->SetValueAt(block->deleted_phis()->at(i), 9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch graph_->GetConstantUndefined()); 9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(last_environment); 9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Pick up the outgoing argument count of one of the predecessors. 9533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = pred->argument_count(); 9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* current = block->first(); 9563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int start = chunk_->instructions()->length(); 9573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (current != NULL && !is_aborted()) { 9583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Code for constants in registers is generated lazily. 9593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!current->EmitAtUses()) { 9603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VisitInstruction(current); 9613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current = current->next(); 9633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int end = chunk_->instructions()->length() - 1; 9653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (end >= start) { 9663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_first_instruction_index(start); 9673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_last_instruction_index(end); 9683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_argument_count(argument_count_); 9703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_block_ = NULL; 9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_ = NULL; 9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* old_current = current_instruction_; 9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_instruction_ = current; 9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (current->has_position()) position_ = current->position(); 9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* instr = current->CompileToLithium(this); 9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr != NULL) { 9823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignPointerMap(instr); 9843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (FLAG_stress_environments && !instr->HasEnvironment()) { 9863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignEnvironment(instr); 9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_hydrogen_value(current); 9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunk_->AddInstruction(instr, current_block_); 9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_instruction_ = old_current; 9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLEnvironment* LChunkBuilder::CreateEnvironment( 9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* hydrogen_env, 9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int* argument_index_accumulator) { 9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hydrogen_env == NULL) return NULL; 9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LEnvironment* outer = 10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator); 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int ast_id = hydrogen_env->ast_id(); 10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(ast_id != AstNode::kNoNumber || 10043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->frame_type() != JS_FUNCTION); 10053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int value_count = hydrogen_env->length(); 10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LEnvironment* result = new(zone()) LEnvironment( 10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->closure(), 10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->frame_type(), 10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ast_id, 10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->parameter_count(), 10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_, 10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value_count, 10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch outer); 10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int argument_index = *argument_index_accumulator; 10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < value_count; ++i) { 10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hydrogen_env->is_special_index(i)) continue; 10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = hydrogen_env->values()->at(i); 10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* op = NULL; 10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->IsArgumentsObject()) { 10213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op = NULL; 10223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (value->IsPushArgument()) { 10233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op = new(zone()) LArgument(argument_index++); 10243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op = UseAny(value); 10263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->AddValue(op, value->representation()); 10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hydrogen_env->frame_type() == JS_FUNCTION) { 10313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *argument_index_accumulator = argument_index; 10323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 10393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LGoto(instr->FirstSuccessor()->block_id()); 10403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 10443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->EmitAtUses()) { 10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* successor = HConstant::cast(value)->ToBoolean() 10473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? instr->FirstSuccessor() 10483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : instr->SecondSuccessor(); 10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LGoto(successor->block_id()); 10503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LBranch* result = new(zone()) LBranch(UseRegister(value)); 10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Tagged values that are not known smis or booleans require a 10543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // deoptimization environment. 10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation rep = value->representation(); 10563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HType type = value->type(); 10573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) { 10583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(result); 10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 10613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 10653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 10673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 10683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpMapAndBranch(value, temp); 10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 10733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister( 10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LArgumentsLength(UseRegister(length->value()))); 10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 10793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsElements); 10803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 10843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstanceOf* result = 10853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LInstanceOf(UseFixed(instr->left(), a0), 10863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseFixed(instr->right(), a1)); 10873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 10883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstanceOfKnownGlobal* instr) { 10933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstanceOfKnownGlobal* result = 10943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(), a0), 10953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(t0)); 10963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 10973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 11013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseRegisterAtStart(instr->receiver()); 11023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 11033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 11043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 11053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 11093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 11103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseFixed(instr->receiver(), a0); 11113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* length = UseFixed(instr->length(), a2); 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* elements = UseFixed(instr->elements(), a3); 11133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LApplyArguments* result = new(zone()) LApplyArguments(function, 11143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch receiver, 11153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length, 11163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements); 11173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 11183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { 11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ++argument_count_; 11233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* argument = Use(instr->argument()); 11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LPushArgument(argument); 11253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 11293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() 11303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? NULL 11313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(new(zone()) LThisFunction); 11323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoContext(HContext* instr) { 11363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() ? NULL : DefineAsRegister(new(zone()) LContext); 11373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) { 11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LOuterContext(context)); 11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LDeclareGlobals, instr); 11483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) { 11523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 11533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGlobalObject(context)); 11543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11573ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { 11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* global_object = UseRegisterAtStart(instr->value()); 11593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGlobalReceiver(global_object)); 11603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallConstantFunction( 11643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCallConstantFunction* instr) { 11653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, v0), instr); 11673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 11713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 11723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 11733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInvokeFunction* result = new(zone()) LInvokeFunction(function); 11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 11753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 11793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch BuiltinFunctionId op = instr->op(); 11803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (op == kMathLog || op == kMathSin || op == kMathCos || op == kMathTan) { 11813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f4); 11823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input, NULL); 11833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, f4), instr); 11843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (op == kMathPowHalf) { 11853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Input cannot be the same as the result. 11863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // See lithium-codegen-mips.cc::DoMathPowHalf. 11873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f8); 11883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = FixedTemp(f6); 11893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input, temp); 11903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineFixedDouble(result, f4); 11913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL; 11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input, temp); 11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op) { 11963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case kMathAbs: 11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case kMathFloor: 11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 12003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case kMathSqrt: 12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(result); 12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case kMathRound: 12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 12073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { 12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsTagged()); 12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseFixed(instr->key(), a2); 12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallKeyed(key), v0), instr); 12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { 12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallNamed, v0), instr); 12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { 12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, v0), instr); 12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { 12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, v0), instr); 12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 12393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* constructor = UseFixed(instr->constructor(), a1); 12403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCallNew* result = new(zone()) LCallNew(constructor); 12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallFunction(function), v0), 12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr); 12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, v0), instr); 12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) { 12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoShift(Token::SHR, instr); 12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) { 12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoShift(Token::SAR, instr); 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) { 12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoShift(Token::SHL, instr); 12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsInteger32()) { 12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand()); 12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand()); 12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LBitI(left, right)); 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsTagged()); 12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsTagged()); 12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsTagged()); 12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 12903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = new(zone()) LArithmeticT(instr->op(), left, right); 12913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 12923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) { 12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsInteger32()); 12983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsInteger32()); 12993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LBitNotI(value)); 13013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 13053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsDouble()) { 13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::DIV, instr); 13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsInteger32()) { 13083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // TODO(1042) The fixed register allocation 13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // is needed because we call TypeRecordingBinaryOpStub from 13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the generated code, which requires registers a0 13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // and a1 to be used. We should remove that 13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // when we provide a native implementation. 13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* dividend = UseFixed(instr->left(), a0); 13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* divisor = UseFixed(instr->right(), a1); 13153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap( 13163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineFixed(new(zone()) LDivI(dividend, divisor), v0))); 13173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::DIV, instr); 13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) { 13243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsInteger32()) { 13253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 13263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 13273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LModI* mod; 13293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->HasPowerOf2Divisor()) { 13303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!instr->CheckFlag(HValue::kCanBeDivByZero)); 13313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->left()); 13323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mod = new(zone()) LModI(value, UseOrConstant(instr->right())); 13333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* dividend = UseRegister(instr->left()); 13353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* divisor = UseRegister(instr->right()); 13363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mod = new(zone()) LModI(dividend, 13373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch divisor, 13383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister(), 13393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(f20), 13403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(f22)); 13413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kBailoutOnMinusZero) || 13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->CheckFlag(HValue::kCanBeDivByZero)) { 13453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(mod)); 13463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(mod); 13483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsTagged()) { 13503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::MOD, instr); 13513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsDouble()); 13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We call a C function for double modulo. It can't trigger a GC. 13543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We need to use fixed result register for the call. 13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // TODO(fschneider): Allow any register as input registers. 13563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixedDouble(instr->left(), f2); 13573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixedDouble(instr->right(), f4); 13583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(Token::MOD, left, right); 13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, f2), instr); 13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) { 13653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsInteger32()) { 13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left; 13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstant(instr->MostConstantOperand()); 13703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = NULL; 13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kBailoutOnMinusZero) && 13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) || 13733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !right->IsConstantOperand())) { 13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegister(instr->LeastConstantOperand()); 13753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp = TempRegister(); 13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterAtStart(instr->LeastConstantOperand()); 13783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LMulI* mul = new(zone()) LMulI(left, right, temp); 13803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow) || 13813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 13823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(mul); 13833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(mul); 13853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::MUL, instr); 13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::MUL, instr); 13913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) { 13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsInteger32()) { 13973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstantAtStart(instr->right()); 14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LSubI* sub = new(zone()) LSubI(left, right); 14023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineAsRegister(sub); 14033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 14043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 14053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 14073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 14083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::SUB, instr); 14093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 14103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::SUB, instr); 14113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsInteger32()) { 14173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 14193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand()); 14203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand()); 14213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 14223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineAsRegister(add); 14233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 14253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 14273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 14283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::ADD, instr); 14293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 14303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsTagged()); 14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::ADD, instr); 14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) { 14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsDouble()); 14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We call a C function for double power. It can't trigger a GC. 14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We need to use fixed result register for the call. 14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation exponent_type = instr->right()->representation(); 14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsDouble()); 14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixedDouble(instr->left(), f2); 14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = exponent_type.IsDouble() ? 14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseFixedDouble(instr->right(), f4) : 14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseFixed(instr->right(), a2); 14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LPower* result = new(zone()) LPower(left, right); 14473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, f0), 14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr, 14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CAN_DEOPTIMIZE_EAGERLY); 14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRandom(HRandom* instr) { 14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsDouble()); 14553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->global_object()->representation().IsTagged()); 14563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* global_object = UseFixed(instr->global_object(), a0); 14573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LRandom* result = new(zone()) LRandom(global_object); 14583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, f0), instr); 14593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 14633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsTagged()); 14643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsTagged()); 14653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 14663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 14673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCmpT* result = new(zone()) LCmpT(left, right); 14683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 14693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareIDAndBranch( 14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCompareIDAndBranch* instr) { 14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation r = instr->GetInputRepresentation(); 14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (r.IsInteger32()) { 14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpIDAndBranch(left, right); 14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(r.IsDouble()); 14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsDouble()); 14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsDouble()); 14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpIDAndBranch(left, right); 14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCompareObjectEqAndBranch* instr) { 14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpObjectEqAndBranch(left, right); 14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareConstantEqAndBranch( 15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCompareConstantEqAndBranch* instr) { 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpConstantEqAndBranch( 15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseRegisterAtStart(instr->value())); 15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsNilAndBranch(HIsNilAndBranch* instr) { 15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsNilAndBranch(UseRegisterAtStart(instr->value())); 15103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()), 15173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp); 15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 15223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 15243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()), 15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp); 15263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 15303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsSmiAndBranch(Use(instr->value())); 15323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HIsUndetectableAndBranch* instr) { 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsUndetectableAndBranch( 15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseRegisterAtStart(instr->value()), TempRegister()); 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch( 15443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch* instr) { 15453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsTagged()); 15463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsTagged()); 15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCompareAndBranch* result = 15503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LStringCompareAndBranch(left, right); 15513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 15523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HHasInstanceTypeAndBranch* instr) { 15573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 15593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasInstanceTypeAndBranch(value); 15603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 15643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HGetCachedArrayIndex* instr) { 15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 15673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 15693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HHasCachedArrayIndexAndBranch* instr) { 15743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasCachedArrayIndexAndBranch( 15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseRegisterAtStart(instr->value())); 15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HClassOfTestAndBranch* instr) { 15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()), 15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister()); 15853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) { 15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* array = UseRegisterAtStart(instr->value()); 15903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LJSArrayLength(array)); 15913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFixedArrayBaseLength( 15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HFixedArrayBaseLength* instr) { 15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* array = UseRegisterAtStart(instr->value()); 15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array)); 15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoElementsKind(HElementsKind* instr) { 16023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegisterAtStart(instr->value()); 16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LElementsKind(object)); 16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { 16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->value()); 16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LValueOf* result = new(zone()) LValueOf(object, TempRegister()); 16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(result); 16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->value(), a0); 16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LDateField* result = new LDateField(object, FixedTemp(a1), instr->index()); 16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 16183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->index()); 16233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* length = UseRegister(instr->length()); 16243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LBoundsCheck(value, length)); 16253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 16293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The control instruction marking the end of a block that completed 16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // abruptly (e.g., threw an exception). There is nothing specific to do. 16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThrow(HThrow* instr) { 16363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseFixed(instr->value(), a0); 16373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LThrow(value), instr); 16383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // All HForceRepresentation instructions should be eliminated in the 16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // representation change phase of Hydrogen. 16493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) { 16553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation from = instr->from(); 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation to = instr->to(); 16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (from.IsTagged()) { 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsDouble()) { 16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberUntagD* res = new(zone()) LNumberUntagD(value); 16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(res)); 16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 16633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(to.IsInteger32()); 16643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_check = !instr->value()->type().IsSmi(); 16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* res = NULL; 16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!needs_check) { 16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch res = DefineAsRegister(new(zone()) LSmiUntag(value, needs_check)); 16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp2 = instr->CanTruncateToInt32() ? TempRegister() 16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : NULL; 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp3 = instr->CanTruncateToInt32() ? FixedTemp(f22) 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : NULL; 16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch res = DefineSameAsFirst(new(zone()) LTaggedToI(value, 16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp1, 16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp2, 16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp3)); 16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch res = AssignEnvironment(res); 16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return res; 16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from.IsDouble()) { 16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsTagged()) { 16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 16873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp2 = TempRegister(); 16883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Make sure that the temp and result_temp registers are 16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // different. 16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* result_temp = TempRegister(); 16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 16933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Define(result, result_temp); 16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(result); 16953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 16963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(to.IsInteger32()); 16973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 16983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp2 = instr->CanTruncateToInt32() ? TempRegister() : NULL; 17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LDoubleToI* res = new(zone()) LDoubleToI(value, temp1, temp2); 17013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(res)); 17023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from.IsInteger32()) { 17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsTagged()) { 17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* val = instr->value(); 17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(val); 17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (val->HasRange() && val->range()->IsInSmiRange()) { 17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LSmiTag(value)); 17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagI* result = new(zone()) LNumberTagI(value); 17113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(to.IsDouble()); 17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = Use(instr->value()); 17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LInteger32ToDouble(value)); 17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) { 17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckNonSmi(value)); 17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 17313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LCheckInstanceType(value); 17333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(result); 17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) { 17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp2 = TempRegister(); 17403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LCheckPrototypeMaps(temp1, temp2); 17413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(result); 17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckSmi(value)); 17483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) { 17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckFunction(value)); 17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMap(HCheckMap* instr) { 17583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LCheckMap(value); 17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(result); 17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation input_rep = value->representation(); 17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* reg = UseRegister(value); 17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (input_rep.IsDouble()) { 17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Revisit this decision, here and 8 lines below. 17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LClampDToUint8(reg, FixedTemp(f22))); 17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (input_rep.IsInteger32()) { 17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(input_rep.IsTagged()); 17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Register allocator doesn't (yet) support allocation of double 17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // temps. Reserve f22 explicitly. 17773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LClampTToUint8* result = new(zone()) LClampTToUint8(reg, FixedTemp(f22)); 17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LReturn(UseFixed(instr->value(), v0)); 17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 17893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation r = instr->representation(); 17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (r.IsInteger32()) { 17913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantI); 17923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (r.IsDouble()) { 17933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantD); 17943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (r.IsTagged()) { 17953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantT); 17963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 17983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 18043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 18053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() 18063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? AssignEnvironment(DefineAsRegister(result)) 18073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(result); 18083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 18123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* global_object = UseFixed(instr->global_object(), a0); 18133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadGlobalGeneric* result = new(zone()) LLoadGlobalGeneric(global_object); 18143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 18153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Use a temp to check the value in the cell in the case where we perform 18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a hole check. 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() 18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone()) LStoreGlobalCell(value, NULL); 18253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) { 18293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* global_object = UseFixed(instr->global_object(), a1); 18303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseFixed(instr->value(), a0); 18313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStoreGlobalGeneric* result = 18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LStoreGlobalGeneric(global_object, value); 18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 18393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 18403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LLoadContextSlot(context)); 18413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result; 18423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 18463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context; 18473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value; 18483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->NeedsWriteBarrier()) { 18493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch context = UseTempRegister(instr->context()); 18503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value = UseTempRegister(instr->value()); 18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch context = UseRegister(instr->context()); 18533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value = UseRegister(instr->value()); 18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreContextSlot(context, value); 18563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result; 18573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister( 18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadNamedField(UseRegisterAtStart(instr->object()))); 18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic( 18673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadNamedFieldPolymorphic* instr) { 18683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsTagged()); 18693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->need_generic()) { 18703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = UseFixed(instr->object(), a0); 18713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadNamedFieldPolymorphic* result = 18723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadNamedFieldPolymorphic(obj); 18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = UseRegisterAtStart(instr->object()); 18763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadNamedFieldPolymorphic* result = 18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadNamedFieldPolymorphic(obj); 18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), a0); 18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineFixed(new(zone()) LLoadNamedGeneric(object), v0); 18863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 18913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadFunctionPrototype* instr) { 18923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) { 18983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 18993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadElements(input)); 19003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadExternalArrayPointer( 19043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadExternalArrayPointer* instr) { 19053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 19063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input)); 19073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastElement( 19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedFastElement* instr) { 19123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsTagged()); 19133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = UseRegisterAtStart(instr->object()); 19153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterAtStart(instr->key()); 19163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadKeyedFastElement* result = new(zone()) LLoadKeyedFastElement(obj, key); 19173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->RequiresHoleCheck()) AssignEnvironment(result); 19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(result); 19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement( 19233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedFastDoubleElement* instr) { 19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsDouble()); 19253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* elements = UseTempRegister(instr->elements()); 19273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 19283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadKeyedFastDoubleElement* result = 19293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadKeyedFastDoubleElement(elements, key); 19303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement( 19353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedSpecializedArrayElement* instr) { 19363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 19373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation representation(instr->representation()); 19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT( 19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (representation.IsInteger32() && 19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements_kind != EXTERNAL_FLOAT_ELEMENTS) && 19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) || 19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (representation.IsDouble() && 19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) || 19443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements_kind == EXTERNAL_DOUBLE_ELEMENTS)))); 19453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* external_pointer = UseRegister(instr->external_pointer()); 19473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 19483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadKeyedSpecializedArrayElement* result = 19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key); 19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* load_instr = DefineAsRegister(result); 19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // An unsigned int array load might overflow and cause a deopt, make sure it 19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // has an environment. 19533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ? 19543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(load_instr) : load_instr; 19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), a1); 19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseFixed(instr->key(), a0); 19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineFixed(new(zone()) LLoadKeyedGeneric(object, key), v0); 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 19653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastElement( 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStoreKeyedFastElement* instr) { 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->object()->representation().IsTagged()); 19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = UseTempRegister(instr->object()); 19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* val = needs_write_barrier 19773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? UseTempRegister(instr->value()) 19783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegisterAtStart(instr->value()); 19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = needs_write_barrier 19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? UseTempRegister(instr->key()) 19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegisterOrConstantAtStart(instr->key()); 19823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreKeyedFastElement(obj, key, val); 19833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement( 19873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStoreKeyedFastDoubleElement* instr) { 19883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsDouble()); 19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->elements()->representation().IsTagged()); 19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* elements = UseRegisterAtStart(instr->elements()); 19933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* val = UseTempRegister(instr->value()); 19943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val); 19973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement( 20013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStoreKeyedSpecializedArrayElement* instr) { 20023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation representation(instr->value()->representation()); 20033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT( 20053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (representation.IsInteger32() && 20063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements_kind != EXTERNAL_FLOAT_ELEMENTS) && 20073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) || 20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (representation.IsDouble() && 20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) || 20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements_kind == EXTERNAL_DOUBLE_ELEMENTS)))); 20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->external_pointer()->representation().IsExternal()); 20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 20133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* external_pointer = UseRegister(instr->external_pointer()); 20153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool val_is_temp_register = 20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements_kind == EXTERNAL_PIXEL_ELEMENTS || 20173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements_kind == EXTERNAL_FLOAT_ELEMENTS; 20183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* val = val_is_temp_register 20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? UseTempRegister(instr->value()) 20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegister(instr->value()); 20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer, 20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key, 20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch val); 20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = UseFixed(instr->object(), a2); 20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseFixed(instr->key(), a1); 20323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* val = UseFixed(instr->value(), a0); 20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->object()->representation().IsTagged()); 20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->key()->representation().IsTagged()); 20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LStoreKeyedGeneric(obj, key, val), instr); 20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind( 20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr) { 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->original_map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS && 20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->transitioned_map()->elements_kind() == FAST_ELEMENTS) { 20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = TempRegister(); 20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LTransitionElementsKind(object, new_map_reg, NULL); 20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(result); 20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), a0); 20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* fixed_object_reg = FixedTemp(a2); 20543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = FixedTemp(a3); 20553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LTransitionElementsKind(object, 20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_map_reg, 20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fixed_object_reg); 20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 20653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 20663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = needs_write_barrier 20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? UseTempRegister(instr->object()) 20693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegisterAtStart(instr->object()); 20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* val = needs_write_barrier 20723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? UseTempRegister(instr->value()) 20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegister(instr->value()); 20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreNamedField(obj, val); 20763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 20803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* obj = UseFixed(instr->object(), a1); 20813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* val = UseFixed(instr->value(), a0); 20823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreNamedGeneric(obj, val); 20843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 20853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 20893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 20903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 20913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LStringAdd(left, right), v0), 20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr); 20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* string = UseTempRegister(instr->string()); 20983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseTempRegister(instr->index()); 20993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCharCodeAt* result = new(zone()) LStringCharCodeAt(string, index); 21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* char_code = UseRegister(instr->value()); 21063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCharFromCode* result = new(zone()) LStringCharFromCode(char_code); 21073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { 21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* string = UseRegisterAtStart(instr->value()); 21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LStringLength(string)); 21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) { 21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAllocateObject* result = new(zone()) LAllocateObject( 21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister(), TempRegister()); 21203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 21213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFastLiteral(HFastLiteral* instr) { 21253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LFastLiteral, v0), instr); 21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) { 21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LArrayLiteral, v0), instr); 21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) { 21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LObjectLiteral, v0), instr); 21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, v0), instr); 21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LFunctionLiteral, v0), instr); 21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { 21503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), a0); 21513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseFixed(instr->key(), a1); 21523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LDeleteProperty* result = new(zone()) LDeleteProperty(object, key); 21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21573ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch allocator_->MarkAsOsrEntry(); 21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->last_environment()->set_ast_id(instr->ast_id()); 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LOsrEntry); 21613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 21653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int spill_index = chunk()->GetParameterStackSlot(instr->index()); 21663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LParameter, spill_index); 21673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width. 21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (spill_index > LUnallocated::kMaxFixedIndex) { 21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Abort("Too many spill slots needed for OSR"); 21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch spill_index = 0; 21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 21813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ -= instr->argument_count(); 21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallStub, v0), instr); 21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // There are no real uses of the arguments object. 21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // arguments.length and element access are supported directly on 21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // stack arguments, and any real arguments object use causes a bailout. 21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // So this value is never used. 21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 21923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 21963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* arguments = UseRegister(instr->arguments()); 21973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* length = UseTempRegister(instr->length()); 21983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseRegister(instr->index()); 21993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAccessArgumentsAt* result = 22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LAccessArgumentsAt(arguments, length, index); 22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 22063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->value(), a0); 22073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LToFastProperties* result = new(zone()) LToFastProperties(object); 22083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 22133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTypeof* result = new(zone()) LTypeof(UseFixed(instr->value(), a0)); 22143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 22153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HIsConstructCallAndBranch* instr) { 22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsConstructCallAndBranch(TempRegister()); 22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* env = current_block_->last_environment(); 22313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(env != NULL); 22323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch env->set_ast_id(instr->ast_id()); 22343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch env->Drop(instr->pop_count()); 22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < instr->values()->length(); ++i) { 22373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->values()->at(i); 22383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->HasAssignedIndexAt(i)) { 22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch env->Bind(instr->GetAssignedIndexAt(i), value); 22403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 22413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch env->Push(value); 22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If there is an instruction pending deoptimization environment create a 22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // lazy bailout instruction to capture the environment. 22473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pending_deoptimization_ast_id_ == instr->ast_id()) { 22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LLazyBailout; 22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 22503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instruction_pending_deoptimization_environment_-> 22513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_deoptimization_environment(result->environment()); 22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ClearInstructionPendingDeoptimizationEnvironment(); 22533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 22543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 22573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->is_function_entry()) { 22623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LStackCheck, instr); 22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->is_backwards_branch()); 22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap(new(zone()) LStackCheck)); 22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment(); 22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* undefined = graph()->GetConstantUndefined(); 22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* inner = outer->CopyForInlining(instr->closure(), 22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->arguments_count(), 22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->function(), 22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch undefined, 22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->call_kind(), 22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->is_construct()); 22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->arguments() != NULL) { 22803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inner->Bind(instr->arguments(), graph()->GetArgumentsObject()); 22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->UpdateEnvironment(inner); 22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunk_->AddInlinedClosure(instr->closure()); 22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 22853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment()-> 22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DiscardInlined(false); 22913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->UpdateEnvironment(outer); 22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIn(HIn* instr) { 22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterAtStart(instr->key()); 22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegisterAtStart(instr->object()); 22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LIn* result = new(zone()) LIn(key, object); 23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->enumerable(), a0); 23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LForInPrepareMap* result = new(zone()) LForInPrepareMap(object); 23073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 23083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegister(instr->map()); 23133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LForInCacheArray(map))); 23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegisterAtStart(instr->map()); 23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 23263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 23273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseRegister(instr->index()); 23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadFieldByIndex(object, index)); 23293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} } // namespace v8::internal 2333