13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_MIPS 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hydrogen-osr.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/lithium-inl.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/mips/lithium-codegen-mips.h" 123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 { 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal { 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_COMPILE(type) \ 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void L##type::CompileToNative(LCodeGen* generator) { \ 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch generator->Do##type(this); \ 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_COMPILE 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::VerifyCall() { 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Call instructions can use only fixed registers as temporaries and 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // outputs because all registers are blocked by the calling convention. 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Inputs operands must use a fixed register or use-at-start policy or 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a non-register policy. 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Output() == NULL || 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::cast(Output())->HasFixedPolicy() || 313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !LUnallocated::cast(Output())->HasRegisterPolicy()); 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (UseIterator it(this); !it.Done(); it.Advance()) { 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() || 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->IsUsedAtStart()); 363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (TempIterator it(this); !it.Done(); it.Advance()) { 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::PrintTo(StringStream* stream) { 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s ", this->Mnemonic()); 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintOutputOperandTo(stream); 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintDataTo(stream); 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasEnvironment()) { 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch environment()->PrintTo(stream); 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasPointerMap()) { 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pointer_map()->PrintTo(stream); 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) { 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i > 0) stream->Add(" "); 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (InputAt(i) == NULL) { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("NULL"); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasResult()) result()->PrintTo(stream); 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLabel::PrintDataTo(StringStream* stream) { 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LGap::PrintDataTo(stream); 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLabel* rep = replacement(); 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (rep != NULL) { 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" Dead block replaced with B%d", rep->block_id()); 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LGap::IsRedundant() const { 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < 4; i++) { 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGap::PrintDataTo(StringStream* stream) { 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < 4; i++) { 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("("); 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parallel_moves_[i] != NULL) { 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch parallel_moves_[i]->PrintDataTo(stream); 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") "); 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticD::Mnemonic() const { 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op()) { 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::ADD: return "add-d"; 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SUB: return "sub-d"; 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MUL: return "mul-d"; 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::DIV: return "div-d"; 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MOD: return "mod-d"; 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticT::Mnemonic() const { 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op()) { 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::ADD: return "add-t"; 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SUB: return "sub-t"; 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MUL: return "mul-t"; 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MOD: return "mod-t"; 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::DIV: return "div-t"; 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_AND: return "bit-and-t"; 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_OR: return "bit-or-t"; 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_XOR: return "bit-xor-t"; 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case Token::ROR: return "ror-t"; 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SHL: return "sll-t"; 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SAR: return "sra-t"; 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SHR: return "srl-t"; 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const { 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !gen->IsNextEmittedBlock(block_id()); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGoto::PrintDataTo(StringStream* stream) { 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("B%d", block_id()); 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LBranch::PrintDataTo(StringStream* stream) { 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LDebugBreak(); 1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if "); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" %s ", Token::String(op())); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_object("); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_string("); 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_smi("); 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_undetectable("); 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if string_compare("); 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if has_instance_type("); 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if has_cached_array_index("); 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if class_of_test("); 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(", \"%o\") then B%d else B%d", 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *hydrogen()->class_name(), 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch true_block_id(), 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch false_block_id()); 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if typeof "); 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" == \"%s\" then B%d else B%d", 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->type_literal()->ToCString().get(), 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch true_block_id(), false_block_id()); 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(".code_entry = "); 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_object()->PrintTo(stream); 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_object()->PrintTo(stream); 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + "); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset()->PrintTo(stream); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("= "); 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("#%d / ", arity()); 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" "); 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("#%d / ", arity()); 2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d]", slot_index()); 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d] <- ", slot_index()); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" #%d / ", arity()); 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNew::PrintDataTo(StringStream* stream) { 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("= "); 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constructor()->PrintTo(stream); 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" #%d / ", arity()); 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) { 3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constructor()->PrintTo(stream); 3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" #%d / ", arity()); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind = hydrogen()->elements_kind(); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" (%s) ", ElementsKindToString(kind)); 3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments()->PrintTo(stream); 3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" length "); 3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length()->PrintTo(stream); 3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" index "); 3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index()->PrintTo(stream); 3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OStringStream os; 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << hydrogen()->access() << " <- "; 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(os.c_str()); 3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("."); 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(String::cast(*name())->ToCString().get()); 3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" <- "); 3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements()->PrintTo(stream); 3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d]", base_offset()); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("]"); 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements()->PrintTo(stream); 3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d] <-", base_offset()); 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("] <- "); 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value() == NULL) { 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(hydrogen()->IsConstantHoleStore() && 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->value()->representation().IsDouble()); 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("<the hole(nan)>"); 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("] <- "); 3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Skip a slot if for a double-width slot. 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS) spill_slot_count_++; 3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return spill_slot_count_++; 3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = GetNextSpillIndex(kind); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS) { 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LDoubleStackSlot::Create(index, zone()); 4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kind == GENERAL_REGISTERS); 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LStackSlot::Create(index, zone()); 4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() { 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_unused()); 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_ = new(zone()) LPlatformChunk(info(), graph()); 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LPhase phase("L_Building chunk", chunk_); 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch status_ = BUILDING; 4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If compiling for OSR, reserve space for the unoptimized frame, 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which will be subsumed into this frame. 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (graph()->has_osr()) { 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < blocks->length(); i++) { 4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* next = NULL; 4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i < blocks->length() - 1) next = blocks->at(i + 1); 4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DoBasicBlock(blocks->at(i), next); 4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_aborted()) return NULL; 4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch status_ = DONE; 4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return chunk_; 4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Register::ToAllocationIndex(reg)); 4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DoubleRegister::ToAllocationIndex(reg)); 4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, ToUnallocated(fixed_register)); 4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) { 4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, ToUnallocated(reg)); 4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) { 4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::USED_AT_START)); 4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value) { 4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) { 4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::USED_AT_START)); 4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value); 4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseAtStart(value); 4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegister(value); 5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegisterAtStart(value); 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) { 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return chunk_->DefineConstantOperand(HConstant::cast(value)); 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAny(HValue* value) { 5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->EmitAtUses()) { 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* instr = HInstruction::cast(value); 5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VisitInstruction(instr); 5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(value->id()); 5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* result) { 5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->set_virtual_register(current_instruction_->id()); 5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_result(result); 5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsRegister( 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsSpilled( 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, int index) { 5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineSameAsFirst( 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixed( 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, Register reg) { 5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, ToUnallocated(reg)); 5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixedDouble( 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, DoubleRegister reg) { 5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, ToUnallocated(reg)); 5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* hydrogen_env = current_block_->last_environment(); 5763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int argument_index_accumulator = 0; 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HValue*> objects_to_materialize(0, zone()); 5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_environment(CreateEnvironment(hydrogen_env, 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &argument_index_accumulator, 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &objects_to_materialize)); 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* hinstr, 5873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CanDeoptimize can_deoptimize) { 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsNonDeferredCalling(); 5893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->VerifyCall(); 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->MarkAsCall(); 5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignPointerMap(instr); 5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If instruction does not have side-effects lazy deoptimization 5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // after the call will try to deoptimize to the point before the call. 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Thus we still need to attach environment to this call even if 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // call sequence can not deoptimize eagerly. 5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_environment = 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !hinstr->HasObservableSideEffects(); 6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (needs_environment && !instr->HasEnvironment()) { 6033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignEnvironment(instr); 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We can't really figure out if the environment is needed or not. 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->environment()->set_has_been_used(); 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->HasPointerMap()); 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_pointer_map(new(zone()) LPointerMap(zone())); 6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::TempRegister() { 6203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = 6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int vreg = allocator_->GetVirtualRegister(); 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!allocator_->AllocationOk()) { 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vreg = 0; 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand->set_virtual_register(vreg); 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return operand; 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLUnallocated* LChunkBuilder::TempDoubleRegister() { 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int vreg = allocator_->GetVirtualRegister(); 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!allocator_->AllocationOk()) { 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vreg = 0; 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand->set_virtual_register(vreg); 6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) { 6463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = ToUnallocated(reg); 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 6533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = ToUnallocated(reg); 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LLabel(instr->block()); 6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShift(Token::Value op, 6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBitwiseBinaryOperation* instr) { 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_value = instr->right(); 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant_value = 0; 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool does_deopt = false; 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right_value->IsConstant()) { 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* constant = HConstant::cast(right_value); 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = chunk_->DefineConstantOperand(constant); 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constant_value = constant->Integer32Value() & 0x1f; 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Left shifts can deoptimize if we shift by > 0 and the result cannot be 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // truncated to smi. 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmi() && constant_value > 0) { 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(right_value); 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shift operations can only deoptimize if we do a logical shift 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // by 0 and the result cannot be truncated to int32. 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::SHR && constant_value == 0) { 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_opt_safe_uint32_operations) { 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch does_deopt = !instr->CheckFlag(HInstruction::kUint32); 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt)); 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return does_deopt ? AssignEnvironment(result) : result; 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(op, instr); 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HArithmeticBinaryOperation* instr) { 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::MOD) { 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseFixedDouble(instr->left(), f2); 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixedDouble(instr->right(), f4); 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We call a C function for double modulo. It can't trigger a GC. We need 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to use fixed result register for the call. 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(fschneider): Allow any register as input registers. 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixedDouble(result, f2), instr); 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation* instr) { 7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left = instr->left(); 7483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right = instr->right(); 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left->representation().IsTagged()); 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(right->representation().IsTagged()); 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left_operand = UseFixed(left, a1); 7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right_operand = UseFixed(right, a0); 7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LArithmeticT(op, context, left_operand, right_operand); 7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_building()); 7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_ = block; 7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_block_ = next_block; 7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (block->IsStartBlock()) { 7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(graph_->start_environment()); 7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = 0; 7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (block->predecessors()->length() == 1) { 7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We have a single predecessor => copy environment and outgoing 7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // argument count from the predecessor. 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(block->phis()->length() == 0); 7713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* pred = block->predecessors()->at(0); 7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* last_environment = pred->last_environment(); 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(last_environment != NULL); 7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Only copy the environment, if it is later used again. 7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pred->end()->SecondSuccessor() == NULL) { 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->end()->FirstSuccessor() == block); 7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 7783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_environment = last_environment->Copy(); 7813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(last_environment); 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->argument_count() >= 0); 7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = pred->argument_count(); 7863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 7873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We are at a state join => process phis. 7883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* pred = block->predecessors()->at(0); 7893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // No need to copy the environment, it cannot be used later. 7903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* last_environment = pred->last_environment(); 7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < block->phis()->length(); ++i) { 7923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* phi = block->phis()->at(i); 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (phi->HasMergedIndex()) { 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(phi->merged_index(), phi); 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < block->deleted_phis()->length(); ++i) { 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->deleted_phis()->at(i) < last_environment->length()) { 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(block->deleted_phis()->at(i), 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch graph_->GetConstantUndefined()); 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 8023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(last_environment); 8043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Pick up the outgoing argument count of one of the predecessors. 8053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = pred->argument_count(); 8063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* current = block->first(); 8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int start = chunk_->instructions()->length(); 8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (current != NULL && !is_aborted()) { 8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Code for constants in registers is generated lazily. 8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!current->EmitAtUses()) { 8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VisitInstruction(current); 8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current = current->next(); 8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int end = chunk_->instructions()->length() - 1; 8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (end >= start) { 8183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_first_instruction_index(start); 8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_last_instruction_index(end); 8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_argument_count(argument_count_); 8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_block_ = NULL; 8233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_ = NULL; 8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 8283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* old_current = current_instruction_; 8293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_instruction_ = current; 8303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* instr = NULL; 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->CanReplaceWithDummyUses()) { 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandCount() == 0) { 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) LDummy()); 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!current->OperandAt(0)->IsControlInstruction()); 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LDummyUse(UseAny(current->OperandAt(0)))); 8393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 1; i < current->OperandCount(); ++i) { 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandAt(i)->IsControlInstruction()) continue; 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* dummy = 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dummy->set_hydrogen_value(current); 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(dummy, current_block_); 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* successor; 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->IsControlInstruction() && 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch successor != NULL) { 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = new(zone()) LGoto(successor); 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = current->CompileToLithium(this); 8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch argument_count_ += current->argument_delta(); 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ >= 0); 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr != NULL) { 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(instr, current); 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_instruction_ = old_current; 8663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr, 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* hydrogen_val) { 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Associate the hydrogen instruction first, since we may need it for 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_hydrogen_value(hydrogen_val); 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG 876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that the lithium instruction has either no fixed register 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constraints in temps or the result OR no uses that are only used at 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // start. If this invariant doesn't hold, the register allocator can decide 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to insert a split of a range immediately before the instruction due to an 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // already allocated register needing to be used for the instruction's fixed 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // register constraint. In this case, The register allocator won't see an 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // interference between the split child and the use-at-start (it would if 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the it was just a plain use), so it is free to move the split child into 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the same register that is used for the use-at-start. 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // See https://code.google.com/p/chromium/issues/detail?id=201590 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!(instr->ClobbersRegisters() && 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ClobbersDoubleRegisters(isolate()))) { 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int fixed = 0; 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int used_at_start = 0; 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (UseIterator it(instr); !it.Done(); it.Advance()) { 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->IsUsedAtStart()) ++used_at_start; 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Output() != NULL) { 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 8963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (TempIterator it(instr); !it.Done(); it.Advance()) { 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->HasFixedPolicy()) ++fixed; 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(fixed == 0 || used_at_start == 0); 9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 9043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignPointerMap(instr); 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_environments && !instr->HasEnvironment()) { 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignEnvironment(instr); 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(instr, current_block_); 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->IsCall()) { 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* instruction_needing_environment = NULL; 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen_val->HasObservableSideEffects()) { 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instruction_needing_environment = instr; 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sim->ReplayEnvironment(current_block_->last_environment()); 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen_value_for_lazy_bailout = sim; 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(bailout, current_block_); 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instruction_needing_environment != NULL) { 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Store the lazy deopt environment with the instruction if needed. 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Right now it is only used for LInstanceOfKnownGlobal. 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instruction_needing_environment-> 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LGoto(instr->FirstSuccessor()); 9373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 9413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = value->representation(); 9433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HType type = value->type(); 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ToBooleanStub::Types expected = instr->expected_input_types(); 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!easy_case && 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !expected.IsGeneric())) { 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch branch = AssignEnvironment(branch); 9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return branch; 9563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 9613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 9623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 9633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpMapAndBranch(value, temp); 9643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister( 9703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LArgumentsLength(UseRegister(length->value()))); 9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsElements); 9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 9823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstanceOf* result = 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LInstanceOf(context, UseFixed(instr->left(), a0), 9843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseFixed(instr->right(), a1)); 9853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 9863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstanceOfKnownGlobal* instr) { 9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstanceOfKnownGlobal* result = 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LInstanceOfKnownGlobal( 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->context(), cp), 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->left(), a0), 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedTemp(t0)); 9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseRegisterAtStart(instr->receiver()); 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 10053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseFixed(instr->receiver(), a0); 10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* length = UseFixed(instr->length(), a2); 10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* elements = UseFixed(instr->elements(), a3); 10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LApplyArguments* result = new(zone()) LApplyArguments(function, 10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch receiver, 10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length, 10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements); 10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argc = instr->OperandCount(); 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < argc; ++i) { 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* argument = Use(instr->argument(i)); 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(new(zone()) LPushArgument(argument), instr); 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry( 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreCodeEntry* store_code_entry) { 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseRegister(store_code_entry->function()); 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreCodeEntry(function, code_object); 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInnerAllocatedObject* instr) { 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister( 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LInnerAllocatedObject(base_object, offset)); 10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() 10503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? NULL 10513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(new(zone()) LThisFunction); 10523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasNoUses()) return NULL; 10573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (info()->IsStub()) { 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(new(zone()) LContext, cp); 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LContext); 10633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallJSFunction( 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallJSFunction* instr) { 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallJSFunction* result = new(zone()) LCallJSFunction(function); 1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 10793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor( 1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor* instr) { 1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor = instr->descriptor(); 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(target, zone()); 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 1; i < instr->OperandCount(); i++) { 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* op = 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1)); 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(op, zone()); 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch descriptor, ops, zone()); 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache( 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTailCallThroughMegamorphicCache* instr) { 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* receiver_register = 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister()); 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* name_register = 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->name(), LoadDescriptor::NameRegister()); 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Not marked as call. It can't deoptimize, and it never returns. 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new (zone()) LTailCallThroughMegamorphicCache( 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context, receiver_register, name_register); 11113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 11163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 11183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->op()) { 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFloor: 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFloor(instr); 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathRound: 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathRound(instr); 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFround: 1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFround(instr); 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathAbs: 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathAbs(instr); 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathLog: 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathLog(instr); 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathExp: 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathExp(instr); 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathSqrt: 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathSqrt(instr); 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathPowHalf: 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathPowHalf(instr); 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathClz32: 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathClz32(instr); 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 11453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 11463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f4); 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr); 11543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathClz32* result = new(zone()) LMathClz32(input); 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 11613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* double_temp = TempDoubleRegister(); 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2); 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 11733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf. 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f8); 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempDoubleRegister(); 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixedDouble(result, f4); 11823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFround* result = new (zone()) LMathFround(input); 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 11893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->value()->representation(); 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? NULL 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseFixed(instr->context(), cp); 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LMathAbs(context, input)); 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble()) result = AssignEnvironment(result); 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFloor* result = new(zone()) LMathFloor(input, temp); 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathSqrt* result = new(zone()) LMathSqrt(input); 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempDoubleRegister(); 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathRound* result = new(zone()) LMathRound(input, temp); 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* constructor = UseFixed(instr->constructor(), a1); 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallNew* result = new(zone()) LCallNew(context, constructor); 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* constructor = UseFixed(instr->constructor(), a1); 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallFunction* call = new(zone()) LCallFunction(context, function); 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(call, v0), instr); 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr); 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::ROR, instr); 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SHR, instr); 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SAR, instr); 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) { 12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoShift(Token::SHL, instr); 12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LBitI(left, right)); 12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(instr->op(), instr); 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 12923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch divisor != 1 && divisor != -1)) { 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) && 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) || 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!instr->IsMathFloorOfDiv() && 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13503ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByPowerOf2I(instr); 1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByConstI(instr); 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivI(instr); 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::DIV, instr); 13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::DIV, instr); 13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I( 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 13783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NULL : TempRegister(); 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister( 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LFlooringDivByConstI(dividend, divisor, temp)); 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor); 1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(div)); 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByPowerOf2I(instr); 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByConstI(instr); 14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivI(instr); 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LModI( 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr); 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticD(Token::MOD, instr); 1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(Token::MOD, instr); 14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left = instr->BetterLeftOperand(); 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right = instr->BetterRightOperand(); 1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left_op; 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right_op; 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero); 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right->IsConstant()) { 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* constant = HConstant::cast(right); 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t constant_value = constant->Integer32Value(); 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Constants -1, 0 and 1 can be optimized if the result can overflow. 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For other constants, it can be optimized only without overflow. 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) { 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegisterAtStart(left); 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_op = UseConstant(right); 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bailout_on_minus_zero) { 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegister(left); 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegisterAtStart(left); 1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_op = UseRegister(right); 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bailout_on_minus_zero) { 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegister(left); 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegisterAtStart(left); 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_op = UseRegister(right); 15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMulI* mul = new(zone()) LMulI(left_op, right_op); 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (can_overflow || bailout_on_minus_zero) { 15173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(mul); 15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(mul); 15203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasOneUse() && instr->uses().value()->IsAdd()) { 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAdd* add = HAdd::cast(instr->uses().value()); 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr == add->left()) { 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This mul is the lhs of an add. The add and mul will be folded 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // into a multiply-add. 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr == add->right() && !add->left()->IsMul()) { 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This mul is the rhs of an add, where the lhs is not another mul. 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The add and mul will be folded into a multiply-add. 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::MUL, instr); 15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::MUL, instr); 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstantAtStart(instr->right()); 15503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LSubI* sub = new(zone()) LSubI(left, right); 15513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineAsRegister(sub); 15523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 15533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 15543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 15573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::SUB, instr); 15583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 15593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::SUB, instr); 15603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* multiplier_op = UseRegisterAtStart(mul->left()); 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* addend_op = UseRegisterAtStart(addend); 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch multiplicand_op)); 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineAsRegister(add); 15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsExternal()) { 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsExternal()); 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsInteger32()); 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseOrConstantAtStart(instr->right()); 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(add); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 15943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->left()->IsMul()) 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->right()->IsMul()) { 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->left()->IsMul()); 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::ADD, instr); 16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 16063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::ADD, instr); 16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = NULL; 1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->BetterLeftOperand()); 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseOrConstantAtStart(instr->BetterRightOperand()); 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->left()); 1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(instr->right()); 1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LMathMinMax(left, right)); 1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We call a C function for double power. It can't trigger a GC. 16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We need to use fixed result register for the call. 16343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation exponent_type = instr->right()->representation(); 1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 16363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixedDouble(instr->left(), f2); 1637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exponent_type.IsDouble() 1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseFixedDouble(instr->right(), f4) 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 16413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LPower* result = new(zone()) LPower(left, right); 16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, f0), 16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr, 16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CAN_DEOPTIMIZE_EAGERLY); 16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 16523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCmpT* result = new(zone()) LCmpT(context, left, right); 16553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareNumericAndBranch* instr) { 1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->representation(); 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmiOrInteger32()) { 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(r)); 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(r)); 16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(r.IsDouble()); 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCompareObjectEqAndBranch* instr) { 16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpObjectEqAndBranch(left, right); 16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareHoleAndBranch* instr) { 1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCmpHoleAndBranch(value); 16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareMinusZeroAndBranch* instr) { 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(instr->value()); 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* scratch = TempRegister(); 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()), 17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp); 17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()), 17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp); 17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsSmiAndBranch(Use(instr->value())); 17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HIsUndetectableAndBranch* instr) { 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsUndetectableAndBranch( 17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseRegisterAtStart(instr->value()), TempRegister()); 17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch( 17333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch* instr) { 1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 17373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCompareAndBranch* result = 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCompareAndBranch(context, left, right); 17413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HHasInstanceTypeAndBranch* instr) { 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasInstanceTypeAndBranch(value); 17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HGetCachedArrayIndex* instr) { 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HHasCachedArrayIndexAndBranch* instr) { 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasCachedArrayIndexAndBranch( 17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseRegisterAtStart(instr->value())); 17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HClassOfTestAndBranch* instr) { 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()), 17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister()); 17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* map = UseRegisterAtStart(instr->value()); 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LMapEnumLength(map)); 17813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = UseFixed(instr->value(), a0); 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LDateField* result = 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LDateField(object, FixedTemp(a1), instr->index()); 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 17893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 17963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = FLAG_debug_code 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterAtStart(instr->index()) 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->index()); 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL; 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LSeqStringSetChar(context, string, index, value); 18073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code && instr->skip_check()) return NULL; 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length = !index->IsConstantOperand() 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterOrConstantAtStart(instr->length()) 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterAtStart(instr->length()); 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LBoundsCheck(index, length); 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code || !instr->skip_check()) { 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheckBaseIndexInformation* instr) { 1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 18283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The control instruction marking the end of a block that completed 18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // abruptly (e.g., threw an exception). There is nothing specific to do. 18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 18393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 18403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // All HForceRepresentation instructions should be eliminated in the 18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // representation change phase of Hydrogen. 18463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 18473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 18483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) { 18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation from = instr->from(); 18533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation to = instr->to(); 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* val = instr->value(); 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (from.IsSmi()) { 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) { 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch from = Representation::Tagged(); 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (from.IsTagged()) { 18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsDouble()) { 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi()) { 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi() || val->representation().IsSmi()) { 1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 18813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempDoubleRegister(); 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from.IsDouble()) { 18903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsTagged()) { 1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp2 = TempRegister(); 18953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* result_temp = TempRegister(); 18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(Define(result, result_temp)); 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LDoubleToSmi(value))); 19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from.IsInteger32()) { 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsTagged()) { 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CheckFlag(HValue::kCanOverflow)) { 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LSmiTag(value)); 1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (val->CheckFlag(HInstruction::kUint32)) { 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 19213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 19333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsDouble()); 1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->CheckFlag(HInstruction::kUint32)) { 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val))); 1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 19453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LCheckNonSmi(value); 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->value()->type().IsHeapObject()) { 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckSmi(value)); 19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LCheckInstanceType(value); 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckValue(value)); 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasMigrationTarget()) { 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignPointerMap(result); 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation input_rep = value->representation(); 19933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* reg = UseRegister(value); 19943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (input_rep.IsDouble()) { 19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Revisit this decision, here and 8 lines below. 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LClampDToUint8(reg, 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TempDoubleRegister())); 19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (input_rep.IsInteger32()) { 19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 20003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(input_rep.IsSmiOrTagged()); 2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LClampTToUint8* result = 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LClampTToUint8(reg, TempDoubleRegister()); 20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 20053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value = instr->value(); 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->representation().IsDouble()); 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* lo = UseRegister(instr->lo()); 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* hi = UseRegister(instr->hi()); 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = info()->IsStub() 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseFixed(instr->context(), cp) 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : NULL; 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LReturn(UseFixed(instr->value(), v0), context, 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parameter_count); 20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation r = instr->representation(); 2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmi()) { 2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantS); 2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsInteger32()) { 20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantI); 20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (r.IsDouble()) { 20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantD); 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsExternal()) { 2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantE); 20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (r.IsTagged()) { 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantT); 20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 20543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() 20553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? AssignEnvironment(DefineAsRegister(result)) 20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(result); 20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* global_object = 2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* vector = NULL; 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_vector_ics) { 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadGlobalGeneric* result = 2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LLoadGlobalGeneric(context, global_object, vector); 20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 20713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 20753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 20763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Use a temp to check the value in the cell in the case where we perform 20773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a hole check. 20783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() 20793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 20803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone()) LStoreGlobalCell(value, NULL); 20813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20843ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 20853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 20863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 20873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LLoadContextSlot(context)); 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context; 20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value; 20983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->NeedsWriteBarrier()) { 20993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch context = UseTempRegister(instr->context()); 21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value = UseTempRegister(instr->value()); 21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch context = UseRegister(instr->context()); 21033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value = UseRegister(instr->value()); 21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreContextSlot(context, value); 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = UseRegisterAtStart(instr->object()); 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* vector = NULL; 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_vector_ics) { 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), v0); 21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadFunctionPrototype* instr) { 21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LLoadRoot); 21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->key()->representation().IsSmiOrInteger32()); 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = NULL; 21513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->is_typed_elements()) { 2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = NULL; 2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsDouble()) { 2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = UseRegister(instr->elements()); 2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrTagged()); 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = UseRegisterAtStart(instr->elements()); 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsInteger32() && 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !IsDoubleOrFloatElementsKind(elements_kind)) || 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsDouble() && 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsDoubleOrFloatElementsKind(elements_kind))); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key)); 2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->is_external() || instr->is_fixed_typed_array()) ? 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // see LCodeGen::DoLoadKeyedExternalArray 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((elements_kind == EXTERNAL_UINT32_ELEMENTS || 2174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind == UINT32_ELEMENTS) && 2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HInstruction::kUint32)) : 2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // see LCodeGen::DoLoadKeyedFixedDoubleArray and 2177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // LCodeGen::DoLoadKeyedFixedArray 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->RequiresHoleCheck()) { 2179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = 2188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* vector = NULL; 2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_vector_ics) { 2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), 2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v0); 21983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 21993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->is_typed_elements()) { 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->elements()->representation().IsTagged()); 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = NULL; 2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = NULL; 2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->value()->representation().IsDouble()) { 2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegister(instr->value()); 2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsSmiOrTagged()); 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseTempRegister(instr->elements()); 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseTempRegister(instr->key()); 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreKeyed(object, key, val); 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsInteger32() && 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsDouble() && 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsDoubleOrFloatElementsKind(instr->elements_kind()))); 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((instr->is_fixed_typed_array() && 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->elements()->representation().IsTagged()) || 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->is_external() && 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->elements()->representation().IsExternal())); 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = UseRegister(instr->value()); 22403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreKeyed(backing_store, key, val); 22433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = 2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->object()->representation().IsTagged()); 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->key()->representation().IsTagged()); 2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr); 22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind( 22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr) { 2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = TempRegister(); 22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), a0); 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTransitionElementsKind(object, context, NULL); 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(result, instr); 22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento( 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTrapAllocationMemento* instr) { 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = UseRegister(instr->object()); 2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTrapAllocationMemento* result = 2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTrapAllocationMemento(object, temp); 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_in_object = instr->access().IsInobject(); 22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier_for_map = instr->has_transition() && 2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->NeedsWriteBarrierForMap(); 2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj; 2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = is_in_object 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(instr->object()); 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = needs_write_barrier_for_map 2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterAtStart(instr->object()); 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val; 2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->field_representation().IsDouble()) { 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegister(instr->value()); 2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We need a temporary register for write barrier of the map field. 2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL; 23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreNamedField(obj, val, temp); 23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val); 23303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LStringAdd(context, left, right), v0), 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr); 23413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 23453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* string = UseTempRegister(instr->string()); 23463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharCodeAt* result = 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharCodeAt(context, string, index); 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 23513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 23553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* char_code = UseRegister(instr->value()); 2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharFromCode* result = 2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharFromCode(context, char_code); 23593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 23603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* size = UseRegisterOrConstant(instr->size()); 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); 23703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 23713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LRegExpLiteral(context), v0), instr); 23783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23813ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LFunctionLiteral(context), v0), instr); 23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ == 0); 23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch allocator_->MarkAsOsrEntry(); 23913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->last_environment()->set_ast_id(instr->ast_id()); 23923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LOsrEntry); 23933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LParameter* result = new(zone()) LParameter; 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->kind() == HParameter::STACK_PARAMETER) { 2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsSpilled(result, spill_index); 2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(info()->IsStub()); 2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor = 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->code_stub()->GetCallInterfaceDescriptor(); 2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = static_cast<int>(instr->index()); 2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Register reg = descriptor.GetEnvironmentParameterRegister(index); 2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(result, reg); 2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 24093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use an index that corresponds to the location in the unoptimized frame, 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which the optimized frame will subsume. 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int env_index = instr->index(); 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = 0; 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->environment()->is_parameter_index(env_index)) { 2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = chunk()->GetParameterStackSlot(env_index); 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = env_index - instr->environment()->first_local_index(); 2421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Retry(kTooManySpillSlotsNeededForOSR); 2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = 0; 2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 24253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 24263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 24273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), v0), instr); 24333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // There are no real uses of the arguments object. 24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // arguments.length and element access are supported directly on 24393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // stack arguments, and any real arguments object use causes a bailout. 24403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // So this value is never used. 24413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 24423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // There are no real uses of a captured object. 2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 2455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* args = UseRegister(instr->arguments()); 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length = UseRegisterOrConstantAtStart(instr->length()); 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 24593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 24633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->value(), a0); 24643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LToFastProperties* result = new(zone()) LToFastProperties(object); 24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 24663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0)); 24723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 24733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 24773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 24783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24813ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 24823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HIsConstructCallAndBranch* instr) { 24833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsConstructCallAndBranch(TempRegister()); 24843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24873ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 24893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 24903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24933ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 24943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->is_function_entry()) { 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LStackCheck(context), instr); 24973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->is_backwards_branch()); 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AssignPointerMap(new(zone()) LStackCheck(context))); 25023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 25033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 25073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment(); 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch outer->set_ast_id(instr->ReturnId()); 25093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* undefined = graph()->GetConstantUndefined(); 25103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* inner = outer->CopyForInlining(instr->closure(), 25113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->arguments_count(), 25123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->function(), 25133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch undefined, 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->inlining_kind()); 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only replay binding of arguments object if it wasn't removed from graph. 2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->Bind(instr->arguments_var(), instr->arguments_object()); 25183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->BindContext(instr->closure_context()); 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->set_entry(instr); 25213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->UpdateEnvironment(inner); 25223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunk_->AddInlinedClosure(instr->closure()); 25233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 25243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* pop = NULL; 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironment* env = current_block_->last_environment(); 2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (env->entry()->arguments_pushed()) { 2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count = env->arguments_environment()->parameter_count(); 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pop = new(zone()) LDrop(argument_count); 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->argument_delta() == -argument_count); 2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment()-> 25393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DiscardInlined(false); 25403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->UpdateEnvironment(outer); 25413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pop; 25433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 25483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->enumerable(), a0); 2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 25503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 25513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 25553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegister(instr->map()); 2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); 25573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 25613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 25623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegisterAtStart(instr->map()); 25633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 25643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 25683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 2569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(load); 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(result); 2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseRegisterAtStart(instr->context()); 2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreFrameContext(context); 25803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 25813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocateBlockContext( 2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAllocateBlockContext* instr) { 2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAllocateBlockContext* result = 2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LAllocateBlockContext(context, function); 2589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, cp), instr); 2590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} } // namespace v8::internal 2593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_TARGET_ARCH_MIPS 2595