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 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips/lithium-mips.h" 6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <sstream> 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_MIPS 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen-osr.h" 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-inl.h" 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips/lithium-codegen-mips.h" 143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 { 163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal { 173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_COMPILE(type) \ 193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void L##type::CompileToNative(LCodeGen* generator) { \ 203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch generator->Do##type(this); \ 213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_COMPILE 243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::VerifyCall() { 273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Call instructions can use only fixed registers as temporaries and 283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // outputs because all registers are blocked by the calling convention. 293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Inputs operands must use a fixed register or use-at-start policy or 303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a non-register policy. 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Output() == NULL || 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::cast(Output())->HasFixedPolicy() || 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !LUnallocated::cast(Output())->HasRegisterPolicy()); 343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (UseIterator it(this); !it.Done(); it.Advance()) { 353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() || 373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->IsUsedAtStart()); 383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (TempIterator it(this); !it.Done(); it.Advance()) { 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::PrintTo(StringStream* stream) { 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("%s ", this->Mnemonic()); 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintOutputOperandTo(stream); 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PrintDataTo(stream); 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasEnvironment()) { 553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch environment()->PrintTo(stream); 573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (HasPointerMap()) { 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" "); 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pointer_map()->PrintTo(stream); 623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) { 673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i > 0) stream->Add(" "); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (InputAt(i) == NULL) { 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("NULL"); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasResult()) result()->PrintTo(stream); 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLabel::PrintDataTo(StringStream* stream) { 853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LGap::PrintDataTo(stream); 863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLabel* rep = replacement(); 873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (rep != NULL) { 883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" Dead block replaced with B%d", rep->block_id()); 893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LGap::IsRedundant() const { 943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < 4; i++) { 953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGap::PrintDataTo(StringStream* stream) { 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < 4; i++) { 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("("); 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (parallel_moves_[i] != NULL) { 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch parallel_moves_[i]->PrintDataTo(stream); 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") "); 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticD::Mnemonic() const { 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op()) { 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::ADD: return "add-d"; 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SUB: return "sub-d"; 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MUL: return "mul-d"; 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::DIV: return "div-d"; 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MOD: return "mod-d"; 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticT::Mnemonic() const { 1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (op()) { 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::ADD: return "add-t"; 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SUB: return "sub-t"; 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MUL: return "mul-t"; 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::MOD: return "mod-t"; 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::DIV: return "div-t"; 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_AND: return "bit-and-t"; 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_OR: return "bit-or-t"; 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::BIT_XOR: return "bit-xor-t"; 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case Token::ROR: return "ror-t"; 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SHL: return "sll-t"; 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SAR: return "sra-t"; 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case Token::SHR: return "srl-t"; 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const { 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !gen->IsNextEmittedBlock(block_id()); 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGoto::PrintDataTo(StringStream* stream) { 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("B%d", block_id()); 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LBranch::PrintDataTo(StringStream* stream) { 1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LDebugBreak(); 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if "); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" %s ", Token::String(op())); 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_string("); 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_smi("); 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_undetectable("); 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if string_compare("); 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if has_instance_type("); 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if class_of_test("); 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(", \"%o\") then B%d else B%d", 2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *hydrogen()->class_name(), 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch true_block_id(), 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch false_block_id()); 2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if typeof "); 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" == \"%s\" then B%d else B%d", 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->type_literal()->ToCString().get(), 2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch true_block_id(), false_block_id()); 2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(".code_entry = "); 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_object()->PrintTo(stream); 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_object()->PrintTo(stream); 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + "); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset()->PrintTo(stream); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" "); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("#%d / ", arity()); 2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d]", slot_index()); 2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("[%d] <- ", slot_index()); 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" #%d / ", arity()); 2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) { 2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("= "); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constructor()->PrintTo(stream); 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" #%d / ", arity()); 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind = hydrogen()->elements_kind(); 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" (%s) ", ElementsKindToString(kind)); 2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments()->PrintTo(stream); 2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" length "); 2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length()->PrintTo(stream); 2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" index "); 2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index()->PrintTo(stream); 2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::ostringstream os; 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << hydrogen()->access() << " <- "; 301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream->Add(os.str().c_str()); 3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value()->PrintTo(stream); 3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements()->PrintTo(stream); 3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d]", base_offset()); 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("]"); 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements()->PrintTo(stream); 3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("["); 3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key()->PrintTo(stream); 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d] <-", base_offset()); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("] <- "); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value() == NULL) { 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(hydrogen()->IsConstantHoleStore() && 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->value()->representation().IsDouble()); 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("<the hole(nan)>"); 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Skip a slot if for a double-width slot. 346109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (kind == DOUBLE_REGISTERS) current_frame_slots_++; 347109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return current_frame_slots_++; 3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = GetNextSpillIndex(kind); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS) { 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LDoubleStackSlot::Create(index, zone()); 3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kind == GENERAL_REGISTERS); 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LStackSlot::Create(index, zone()); 3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() { 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_unused()); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_ = new(zone()) LPlatformChunk(info(), graph()); 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LPhase phase("L_Building chunk", chunk_); 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch status_ = BUILDING; 3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If compiling for OSR, reserve space for the unoptimized frame, 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which will be subsumed into this frame. 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (graph()->has_osr()) { 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < blocks->length(); i++) { 3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* next = NULL; 3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (i < blocks->length() - 1) next = blocks->at(i + 1); 3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DoBasicBlock(blocks->at(i), next); 3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_aborted()) return NULL; 3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch status_ = DONE; 3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return chunk_; 3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LUnallocated(LUnallocated::FIXED_REGISTER, reg.code()); 3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) { 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, reg.code()); 3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, ToUnallocated(fixed_register)); 4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) { 4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, ToUnallocated(reg)); 4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) { 4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, 4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 4173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::USED_AT_START)); 4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value) { 4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) { 4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated::USED_AT_START)); 4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value); 4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseAtStart(value); 4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegister(value); 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : UseRegisterAtStart(value); 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) { 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return chunk_->DefineConstantOperand(HConstant::cast(value)); 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAny(HValue* value) { 4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value->IsConstant() 4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->EmitAtUses()) { 4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* instr = HInstruction::cast(value); 4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VisitInstruction(instr); 4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(value->id()); 4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* result) { 4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->set_virtual_register(current_instruction_->id()); 4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_result(result); 4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsRegister( 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsSpilled( 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, int index) { 5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineSameAsFirst( 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixed( 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, Register reg) { 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, ToUnallocated(reg)); 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixedDouble( 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, DoubleRegister reg) { 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, ToUnallocated(reg)); 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* hydrogen_env = current_block_->last_environment(); 5303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return LChunkBuilderBase::AssignEnvironment(instr, hydrogen_env); 5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* hinstr, 5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CanDeoptimize can_deoptimize) { 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsNonDeferredCalling(); 5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->VerifyCall(); 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->MarkAsCall(); 5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignPointerMap(instr); 5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If instruction does not have side-effects lazy deoptimization 5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // after the call will try to deoptimize to the point before the call. 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Thus we still need to attach environment to this call even if 5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // call sequence can not deoptimize eagerly. 5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_environment = 5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !hinstr->HasObservableSideEffects(); 5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (needs_environment && !instr->HasEnvironment()) { 5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr = AssignEnvironment(instr); 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We can't really figure out if the environment is needed or not. 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->environment()->set_has_been_used(); 5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->HasPointerMap()); 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_pointer_map(new(zone()) LPointerMap(zone())); 5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr; 5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::TempRegister() { 5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = 5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int vreg = allocator_->GetVirtualRegister(); 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!allocator_->AllocationOk()) { 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vreg = 0; 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand->set_virtual_register(vreg); 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return operand; 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLUnallocated* LChunkBuilder::TempDoubleRegister() { 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER); 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int vreg = allocator_->GetVirtualRegister(); 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!allocator_->AllocationOk()) { 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vreg = 0; 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand->set_virtual_register(vreg); 5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) { 5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = ToUnallocated(reg); 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { 6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = ToUnallocated(reg); 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return operand; 6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LLabel(instr->block()); 6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShift(Token::Value op, 6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBitwiseBinaryOperation* instr) { 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_value = instr->right(); 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant_value = 0; 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool does_deopt = false; 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right_value->IsConstant()) { 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* constant = HConstant::cast(right_value); 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = chunk_->DefineConstantOperand(constant); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constant_value = constant->Integer32Value() & 0x1f; 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Left shifts can deoptimize if we shift by > 0 and the result cannot be 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // truncated to smi. 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmi() && constant_value > 0) { 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(right_value); 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shift operations can only deoptimize if we do a logical shift 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // by 0 and the result cannot be truncated to int32. 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::SHR && constant_value == 0) { 656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier does_deopt = !instr->CheckFlag(HInstruction::kUint32); 6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt)); 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return does_deopt ? AssignEnvironment(result) : result; 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(op, instr); 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HArithmeticBinaryOperation* instr) { 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::MOD) { 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseFixedDouble(instr->left(), f2); 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixedDouble(instr->right(), f4); 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We call a C function for double modulo. It can't trigger a GC. We need 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to use fixed result register for the call. 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(fschneider): Allow any register as input registers. 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixedDouble(result, f2), instr); 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation* instr) { 6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left = instr->left(); 6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right = instr->right(); 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left->representation().IsTagged()); 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(right->representation().IsTagged()); 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 6973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left_operand = UseFixed(left, a1); 6983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right_operand = UseFixed(right, a0); 6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LArithmeticT(op, context, left_operand, right_operand); 7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 7023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_building()); 7073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_ = block; 7083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_block_ = next_block; 7093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (block->IsStartBlock()) { 7103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(graph_->start_environment()); 7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = 0; 7123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (block->predecessors()->length() == 1) { 7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We have a single predecessor => copy environment and outgoing 7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // argument count from the predecessor. 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(block->phis()->length() == 0); 7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* pred = block->predecessors()->at(0); 7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* last_environment = pred->last_environment(); 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(last_environment != NULL); 7193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Only copy the environment, if it is later used again. 7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pred->end()->SecondSuccessor() == NULL) { 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->end()->FirstSuccessor() == block); 7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch last_environment = last_environment->Copy(); 7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(last_environment); 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->argument_count() >= 0); 7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = pred->argument_count(); 7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We are at a state join => process phis. 7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* pred = block->predecessors()->at(0); 7343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // No need to copy the environment, it cannot be used later. 7353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* last_environment = pred->last_environment(); 7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < block->phis()->length(); ++i) { 7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* phi = block->phis()->at(i); 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (phi->HasMergedIndex()) { 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(phi->merged_index(), phi); 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < block->deleted_phis()->length(); ++i) { 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->deleted_phis()->at(i) < last_environment->length()) { 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(block->deleted_phis()->at(i), 745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch graph_->GetConstantUndefined()); 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->UpdateEnvironment(last_environment); 7493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Pick up the outgoing argument count of one of the predecessors. 7503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_ = pred->argument_count(); 7513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* current = block->first(); 7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int start = chunk_->instructions()->length(); 7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (current != NULL && !is_aborted()) { 7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Code for constants in registers is generated lazily. 7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!current->EmitAtUses()) { 7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VisitInstruction(current); 7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current = current->next(); 7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int end = chunk_->instructions()->length() - 1; 7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (end >= start) { 7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_first_instruction_index(start); 7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_last_instruction_index(end); 7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch block->set_argument_count(argument_count_); 7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_block_ = NULL; 7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_ = NULL; 7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 7733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HInstruction* old_current = current_instruction_; 7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_instruction_ = current; 7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* instr = NULL; 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->CanReplaceWithDummyUses()) { 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandCount() == 0) { 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) LDummy()); 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!current->OperandAt(0)->IsControlInstruction()); 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LDummyUse(UseAny(current->OperandAt(0)))); 7843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 1; i < current->OperandCount(); ++i) { 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandAt(i)->IsControlInstruction()) continue; 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* dummy = 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dummy->set_hydrogen_value(current); 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(dummy, current_block_); 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* successor; 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->IsControlInstruction() && 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch successor != NULL) { 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = new(zone()) LGoto(successor); 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = current->CompileToLithium(this); 8003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch argument_count_ += current->argument_delta(); 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ >= 0); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr != NULL) { 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(instr, current); 808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_instruction_ = old_current; 8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr, 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* hydrogen_val) { 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Associate the hydrogen instruction first, since we may need it for 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_hydrogen_value(hydrogen_val); 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that the lithium instruction has either no fixed register 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constraints in temps or the result OR no uses that are only used at 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // start. If this invariant doesn't hold, the register allocator can decide 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to insert a split of a range immediately before the instruction due to an 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // already allocated register needing to be used for the instruction's fixed 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // register constraint. In this case, The register allocator won't see an 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // interference between the split child and the use-at-start (it would if 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the it was just a plain use), so it is free to move the split child into 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the same register that is used for the use-at-start. 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // See https://code.google.com/p/chromium/issues/detail?id=201590 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!(instr->ClobbersRegisters() && 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ClobbersDoubleRegisters(isolate()))) { 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int fixed = 0; 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int used_at_start = 0; 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (UseIterator it(instr); !it.Done(); it.Advance()) { 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->IsUsedAtStart()) ++used_at_start; 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Output() != NULL) { 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (TempIterator it(instr); !it.Done(); it.Advance()) { 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->HasFixedPolicy()) ++fixed; 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(fixed == 0 || used_at_start == 0); 8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignPointerMap(instr); 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_environments && !instr->HasEnvironment()) { 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignEnvironment(instr); 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(instr, current_block_); 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CreateLazyBailoutForCall(current_block_, instr, hydrogen_val); 8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) { 8633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LInstruction* result = new (zone()) LPrologue(); 864f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (info_->scope()->NeedsContext()) { 8653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch result = MarkAsCall(result, instr); 8663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 8673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return result; 868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LGoto(instr->FirstSuccessor()); 8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = value->representation(); 8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HType type = value->type(); 880c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ToBooleanHints expected = instr->expected_input_types(); 881c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (expected == ToBooleanHint::kNone) expected = ToBooleanHint::kAny; 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 886c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (!easy_case && ((!(expected & ToBooleanHint::kSmallInteger) && 887c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch (expected & ToBooleanHint::kNeedsMap)) || 888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch expected != ToBooleanHint::kAny)) { 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch branch = AssignEnvironment(branch); 8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return branch; 8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpMapAndBranch(value, temp); 9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister( 9063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LArgumentsLength(UseRegister(length->value()))); 9073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsElements); 9133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch( 917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HHasInPrototypeChainAndBranch* instr) { 918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object = UseRegister(instr->object()); 919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* prototype = UseRegister(instr->prototype()); 920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LHasInPrototypeChainAndBranch* result = 921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LHasInPrototypeChainAndBranch(object, prototype); 922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignEnvironment(result); 9233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 9273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseRegisterAtStart(instr->receiver()); 9283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 9293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 9313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 9353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 9363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseFixed(instr->receiver(), a0); 9373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* length = UseFixed(instr->length(), a2); 9383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* elements = UseFixed(instr->elements(), a3); 9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LApplyArguments* result = new(zone()) LApplyArguments(function, 9403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch receiver, 9413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch length, 9423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements); 9433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 9443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argc = instr->OperandCount(); 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < argc; ++i) { 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* argument = Use(instr->argument(i)); 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(new(zone()) LPushArgument(argument), instr); 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry( 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreCodeEntry* store_code_entry) { 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseRegister(store_code_entry->function()); 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreCodeEntry(function, code_object); 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject( 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInnerAllocatedObject* instr) { 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* base_object = UseRegisterAtStart(instr->base_object()); 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister( 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LInnerAllocatedObject(base_object, offset)); 9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() 9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? NULL 9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(new(zone()) LThisFunction); 9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoContext(HContext* instr) { 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasNoUses()) return NULL; 9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (info()->IsStub()) { 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(new(zone()) LContext, cp); 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LContext); 9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor( 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor* instr) { 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor = instr->descriptor(); 1001f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_EQ(descriptor.GetParameterCount() + 1002f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch LCallWithDescriptor::kImplicitRegisterParameterCount, 1003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch instr->OperandCount()); 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Target 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(target, zone()); 1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Context 1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* op = UseFixed(instr->OperandAt(1), cp); 1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ops.Add(op, zone()); 1012f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Load register parameters. 1013f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int i = 0; 1014f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (; i < descriptor.GetRegisterParameterCount(); i++) { 1015f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch op = UseFixed(instr->OperandAt( 1016f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch i + LCallWithDescriptor::kImplicitRegisterParameterCount), 1017f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch descriptor.GetRegisterParameter(i)); 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(op, zone()); 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1020f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Push stack parameters. 1021f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (; i < descriptor.GetParameterCount(); i++) { 1022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch op = UseAny(instr->OperandAt( 1023f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch i + LCallWithDescriptor::kImplicitRegisterParameterCount)); 1024f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AddInstruction(new (zone()) LPushArgument(op), instr); 1025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch descriptor, ops, zone()); 10293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { 10303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch result->MarkAsSyntacticTailCall(); 10313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), a1); 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 10403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { 10413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch result->MarkAsSyntacticTailCall(); 10423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY); 10443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->op()) { 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFloor: 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFloor(instr); 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathRound: 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathRound(instr); 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFround: 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFround(instr); 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathAbs: 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathAbs(instr); 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathLog: 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathLog(instr); 105913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case kMathCos: 106013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return DoMathCos(instr); 106113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case kMathSin: 106213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return DoMathSin(instr); 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathExp: 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathExp(instr); 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathSqrt: 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathSqrt(instr); 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathPowHalf: 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathPowHalf(instr); 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathClz32: 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathClz32(instr); 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f4); 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr); 10833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathClz32* result = new(zone()) LMathClz32(input); 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 109213e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathCos(HUnaryMathOperation* instr) { 109313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->representation().IsDouble()); 109413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 109513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f4); 109613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathCos(input), f4), instr); 109713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 109813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 109913e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathSin(HUnaryMathOperation* instr) { 110013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->representation().IsDouble()); 110113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 110213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f4); 110313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathSin(input), f4), instr); 110413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 11053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 110913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f4); 111013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathExp(input), f4), instr); 11113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf. 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseFixedDouble(instr->value(), f8); 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempDoubleRegister(); 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp); 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixedDouble(result, f4); 11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFround* result = new (zone()) LMathFround(input); 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 11273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->value()->representation(); 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32()) 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? NULL 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseFixed(instr->context(), cp); 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LMathAbs(context, input)); 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble()) result = AssignEnvironment(result); 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFloor* result = new(zone()) LMathFloor(input, temp); 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathSqrt* result = new(zone()) LMathSqrt(input); 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempDoubleRegister(); 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathRound* result = new(zone()) LMathRound(input, temp); 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 11643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* constructor = UseFixed(instr->constructor(), a1); 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr); 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::ROR, instr); 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SHR, instr); 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SAR, instr); 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) { 11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoShift(Token::SHL, instr); 11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LBitI(left, right)); 12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(instr->op(), instr); 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch divisor != 1 && divisor != -1)) { 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp)); 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) && 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) || 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!instr->IsMathFloorOfDiv() && 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByPowerOf2I(instr); 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByConstI(instr); 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivI(instr); 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::DIV, instr); 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::DIV, instr); 12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I( 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NULL : TempRegister(); 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister( 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LFlooringDivByConstI(dividend, divisor, temp)); 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* result = 1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DefineAsRegister(new (zone()) LFlooringDivI(dividend, divisor)); 1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier (instr->CheckFlag(HValue::kCanOverflow))) { 1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier result = AssignEnvironment(result); 1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return result; 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByPowerOf2I(instr); 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByConstI(instr); 13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivI(instr); 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LModI( 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr); 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticD(Token::MOD, instr); 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(Token::MOD, instr); 14043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left = instr->BetterLeftOperand(); 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right = instr->BetterRightOperand(); 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left_op; 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right_op; 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero); 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t constant_value = 0; 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right->IsConstant()) { 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* constant = HConstant::cast(right); 1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch constant_value = constant->Integer32Value(); 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Constants -1, 0 and 1 can be optimized if the result can overflow. 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For other constants, it can be optimized only without overflow. 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) { 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegisterAtStart(left); 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_op = UseConstant(right); 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bailout_on_minus_zero) { 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegister(left); 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegisterAtStart(left); 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_op = UseRegister(right); 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (bailout_on_minus_zero) { 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegister(left); 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left_op = UseRegisterAtStart(left); 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right_op = UseRegister(right); 14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMulI* mul = new(zone()) LMulI(left_op, right_op); 1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (right_op->IsConstantOperand() 1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ? ((can_overflow && constant_value == -1) || 1447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (bailout_on_minus_zero && constant_value <= 0)) 1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : (can_overflow || bailout_on_minus_zero)) { 14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(mul); 14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(mul); 14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (IsMipsArchVariant(kMips32r2)) { 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasOneUse() && instr->uses().value()->IsAdd()) { 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAdd* add = HAdd::cast(instr->uses().value()); 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr == add->left()) { 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This mul is the lhs of an add. The add and mul will be folded 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // into a multiply-add. 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr == add->right() && !add->left()->IsMul()) { 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This mul is the rhs of an add, where the lhs is not another mul. 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The add and mul will be folded into a multiply-add. 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 14693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::MUL, instr); 14703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 14713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::MUL, instr); 14723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstantAtStart(instr->right()); 14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LSubI* sub = new(zone()) LSubI(left, right); 14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineAsRegister(sub); 14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::SUB, instr); 14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::SUB, instr); 14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) { 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* multiplier_op = UseRegisterAtStart(mul->left()); 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* multiplicand_op = UseRegisterAtStart(mul->right()); 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* addend_op = UseRegisterAtStart(addend); 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op, 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch multiplicand_op)); 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = DefineAsRegister(add); 15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result = AssignEnvironment(result); 15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsExternal()) { 1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(instr->IsConsistentExternalRepresentation()); 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseOrConstantAtStart(instr->right()); 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(add); 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (instr->representation().IsDouble()) { 1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (IsMipsArchVariant(kMips32r2)) { 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->left()->IsMul()) 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->right()->IsMul()) { 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->left()->IsMul()); 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticD(Token::ADD, instr); 15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoArithmeticT(Token::ADD, instr); 15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = NULL; 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->BetterLeftOperand()); 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseOrConstantAtStart(instr->BetterRightOperand()); 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->left()); 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(instr->right()); 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LMathMinMax(left, right)); 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We call a C function for double power. It can't trigger a GC. 15643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We need to use fixed result register for the call. 15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation exponent_type = instr->right()->representation(); 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 15673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixedDouble(instr->left(), f2); 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exponent_type.IsDouble() 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseFixedDouble(instr->right(), f4) 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LPower* result = new(zone()) LPower(left, right); 15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, f0), 15743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr, 15753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CAN_DEOPTIMIZE_EAGERLY); 15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCmpT* result = new(zone()) LCmpT(context, left, right); 15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareNumericAndBranch* instr) { 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->representation(); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmiOrInteger32()) { 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(r)); 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(r)); 15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 15993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(r.IsDouble()); 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCompareObjectEqAndBranch* instr) { 16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpObjectEqAndBranch(left, right); 16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareHoleAndBranch* instr) { 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCmpHoleAndBranch(value); 16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 16283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()), 16293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch temp); 16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsSmiAndBranch(Use(instr->value())); 16363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 16403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HIsUndetectableAndBranch* instr) { 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsUndetectableAndBranch( 16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UseRegisterAtStart(instr->value()), TempRegister()); 16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch( 16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch* 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); 16543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCompareAndBranch* result = 1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCompareAndBranch(context, left, right); 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HHasInstanceTypeAndBranch* instr) { 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 16643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasInstanceTypeAndBranch(value); 16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HClassOfTestAndBranch* instr) { 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()), 16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister()); 16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = FLAG_debug_code 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterAtStart(instr->index()) 1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->index()); 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL; 1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LSeqStringSetChar(context, string, index, value); 16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code && instr->skip_check()) return NULL; 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length = !index->IsConstantOperand() 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterOrConstantAtStart(instr->length()) 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterAtStart(instr->length()); 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LBoundsCheck(index, length); 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code || !instr->skip_check()) { 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The control instruction marking the end of a block that completed 17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // abruptly (e.g., threw an exception). There is nothing specific to do. 17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 17113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // All HForceRepresentation instructions should be eliminated in the 17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // representation change phase of Hydrogen. 17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) { 17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation from = instr->from(); 17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation to = instr->to(); 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* val = instr->value(); 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (from.IsSmi()) { 1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) { 1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch from = Representation::Tagged(); 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (from.IsTagged()) { 17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsDouble()) { 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi()) { 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi() || val->representation().IsSmi()) { 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSmiUntag(value, false)); 17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempDoubleRegister(); 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2)); 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from.IsDouble()) { 17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsTagged()) { 1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp1 = TempRegister(); 17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp2 = TempRegister(); 17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* result_temp = TempRegister(); 17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(Define(result, result_temp)); 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LDoubleToSmi(value))); 17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (from.IsInteger32()) { 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 17873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to.IsTagged()) { 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CheckFlag(HValue::kCanOverflow)) { 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LSmiTag(value)); 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (val->CheckFlag(HInstruction::kUint32)) { 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegisterAtStart(val); 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsDouble()); 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->CheckFlag(HInstruction::kUint32)) { 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val))); 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 18263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LCheckNonSmi(value); 1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->value()->type().IsHeapObject()) { 1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckSmi(value)); 18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoCheckArrayBufferNotNeutered( 1842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HCheckArrayBufferNotNeutered* instr) { 1843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* view = UseRegisterAtStart(instr->value()); 1844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LCheckArrayBufferNotNeutered* result = 1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LCheckArrayBufferNotNeutered(view); 1846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignEnvironment(result); 1847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LCheckInstanceType(value); 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 18583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckValue(value)); 18603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 18653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasMigrationTarget()) { 1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignPointerMap(result); 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 18763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation input_rep = value->representation(); 18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* reg = UseRegister(value); 18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (input_rep.IsDouble()) { 18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Revisit this decision, here and 8 lines below. 1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LClampDToUint8(reg, 1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TempDoubleRegister())); 18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (input_rep.IsInteger32()) { 18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LClampIToUint8(reg)); 18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(input_rep.IsSmiOrTagged()); 1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LClampTToUint8* result = 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LClampTToUint8(reg, TempDoubleRegister()); 18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 18903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 18913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = info()->IsStub() 1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseFixed(instr->context(), cp) 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : NULL; 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LReturn(UseFixed(instr->value(), v0), context, 1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch parameter_count); 19013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 19053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation r = instr->representation(); 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmi()) { 1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantS); 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsInteger32()) { 19093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantI); 19103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (r.IsDouble()) { 19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantD); 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsExternal()) { 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantE); 19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else if (r.IsTagged()) { 19153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantT); 19163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 19173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); 19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 19253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 19263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LLoadContextSlot(context)); 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 19353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* context; 19363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value; 19373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->NeedsWriteBarrier()) { 19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch context = UseTempRegister(instr->context()); 19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value = UseTempRegister(instr->value()); 19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch context = UseRegister(instr->context()); 19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value = UseRegister(instr->value()); 19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreContextSlot(context, value); 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = UseRegisterAtStart(instr->object()); 1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadFunctionPrototype* instr) { 19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LLoadRoot); 19673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->key()->representation().IsSmiOrInteger32()); 1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = NULL; 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!instr->is_fixed_typed_array()) { 1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = NULL; 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsDouble()) { 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = UseRegister(instr->elements()); 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrTagged()); 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = UseRegisterAtStart(instr->elements()); 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = DefineAsRegister(new (zone()) LLoadKeyed(obj, key, nullptr)); 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsInteger32() && 1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !IsDoubleOrFloatElementsKind(elements_kind)) || 1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsDouble() && 1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsDoubleOrFloatElementsKind(elements_kind))); 1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner = UseAny(instr->backing_store_owner()); 1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = DefineAsRegister( 1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LLoadKeyed(backing_store, key, backing_store_owner)); 1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool needs_environment; 1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->is_fixed_typed_array()) { 1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // see LCodeGen::DoLoadKeyedExternalArray 2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch needs_environment = elements_kind == UINT32_ELEMENTS && 2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch !instr->CheckFlag(HInstruction::kUint32); 2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // see LCodeGen::DoLoadKeyedFixedDoubleArray and 2004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // LCodeGen::DoLoadKeyedFixedArray 2005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch needs_environment = 2006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->RequiresHoleCheck() || 2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (instr->hole_mode() == CONVERT_HOLE_TO_UNDEFINED && info()->IsStub()); 2008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (needs_environment) { 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!instr->is_fixed_typed_array()) { 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->elements()->representation().IsTagged()); 2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = NULL; 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = NULL; 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->value()->representation().IsDouble()) { 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegister(instr->value()); 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsSmiOrTagged()); 2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseTempRegister(instr->elements()); 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseTempRegister(instr->key()); 2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LStoreKeyed(object, key, val, nullptr); 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsInteger32() && 2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !IsDoubleOrFloatElementsKind(instr->elements_kind())) || 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsDouble() && 2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsDoubleOrFloatElementsKind(instr->elements_kind()))); 2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(instr->elements()->representation().IsExternal()); 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = UseRegister(instr->value()); 20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner = UseAny(instr->backing_store_owner()); 2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LStoreKeyed(backing_store, key, val, backing_store_owner); 20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind( 20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr) { 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 20623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 20633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = TempRegister(); 20643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTransitionElementsKind(object, NULL, new_map_reg); 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 20673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), a0); 2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTransitionElementsKind(object, context, NULL); 2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(result, instr); 20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento( 2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTrapAllocationMemento* instr) { 2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = UseRegister(instr->object()); 2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTrapAllocationMemento* result = 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTrapAllocationMemento(object, temp); 2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoMaybeGrowElements(HMaybeGrowElements* instr) { 2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info()->MarkAsDeferredCalling(); 2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* context = UseFixed(instr->context(), cp); 2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object = Use(instr->object()); 2091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* elements = Use(instr->elements()); 2092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 2093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* current_capacity = UseRegisterOrConstant(instr->current_capacity()); 2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements* result = new (zone()) 2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements(context, object, elements, key, current_capacity); 2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DefineFixed(result, v0); 2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignPointerMap(AssignEnvironment(result)); 2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_in_object = instr->access().IsInobject(); 21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier_for_map = instr->has_transition() && 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->NeedsWriteBarrierForMap(); 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj; 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = is_in_object 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(instr->object()); 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = needs_write_barrier_for_map 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterAtStart(instr->object()); 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val; 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->field_representation().IsDouble()) { 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegister(instr->value()); 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We need a temporary register for write barrier of the map field. 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL; 21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreNamedField(obj, val, temp); 21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseFixed(instr->left(), a1); 2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixed(instr->right(), a0); 2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LStringAdd(context, left, right), v0), 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr); 21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* string = UseTempRegister(instr->string()); 21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharCodeAt* result = 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharCodeAt(context, string, index); 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 21523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* char_code = UseRegister(instr->value()); 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharFromCode* result = 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharFromCode(context, char_code); 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 21613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* size = UseRegisterOrConstant(instr->size()); 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 2168bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (instr->IsAllocationFolded()) { 2169bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LFastAllocate* result = new (zone()) LFastAllocate(size, temp1, temp2); 2170bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return DefineAsRegister(result); 2171bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } else { 2172bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch info()->MarkAsDeferredCalling(); 2173bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* context = UseAny(instr->context()); 2174bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LAllocate* result = new (zone()) LAllocate(context, size, temp1, temp2); 2175bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AssignPointerMap(DefineAsRegister(result)); 2176bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ == 0); 21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch allocator_->MarkAsOsrEntry(); 21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->last_environment()->set_ast_id(instr->ast_id()); 21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LOsrEntry); 21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LParameter* result = new(zone()) LParameter; 2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->kind() == HParameter::STACK_PARAMETER) { 2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsSpilled(result, spill_index); 2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(info()->IsStub()); 2195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CallInterfaceDescriptor descriptor = graph()->descriptor(); 2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = static_cast<int>(instr->index()); 2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Register reg = descriptor.GetRegisterParameter(index); 2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(result, reg); 2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use an index that corresponds to the location in the unoptimized frame, 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which the optimized frame will subsume. 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int env_index = instr->index(); 2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = 0; 2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->environment()->is_parameter_index(env_index)) { 2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = chunk()->GetParameterStackSlot(env_index); 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = env_index - instr->environment()->first_local_index(); 2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Retry(kTooManySpillSlotsNeededForOSR); 2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = 0; 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2216109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch spill_index += StandardFrameConstants::kFixedSlotCount; 22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // There are no real uses of the arguments object. 22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // arguments.length and element access are supported directly on 22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // stack arguments, and any real arguments object use causes a bailout. 22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // So this value is never used. 22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // There are no real uses of a captured object. 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* args = UseRegister(instr->arguments()); 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length = UseRegisterOrConstantAtStart(instr->length()); 2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* value = UseFixed(instr->value(), a3); 2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LTypeof* result = new (zone()) LTypeof(context, value); 22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr); 22533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 22573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 22583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->is_function_entry()) { 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LStackCheck(context), instr); 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->is_backwards_branch()); 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AssignPointerMap(new(zone()) LStackCheck(context))); 22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment(); 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch outer->set_ast_id(instr->ReturnId()); 22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HConstant* undefined = graph()->GetConstantUndefined(); 22843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch HEnvironment* inner = outer->CopyForInlining( 22853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr->closure(), instr->arguments_count(), instr->function(), undefined, 22863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr->inlining_kind(), instr->syntactic_tail_call_mode()); 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only replay binding of arguments object if it wasn't removed from graph. 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->Bind(instr->arguments_var(), instr->arguments_object()); 22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->BindContext(instr->closure_context()); 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->set_entry(instr); 22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->UpdateEnvironment(inner); 22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* pop = NULL; 2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironment* env = current_block_->last_environment(); 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (env->entry()->arguments_pushed()) { 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count = env->arguments_environment()->parameter_count(); 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pop = new(zone()) LDrop(argument_count); 2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->argument_delta() == -argument_count); 2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 23093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment()-> 23103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DiscardInlined(false); 23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch current_block_->UpdateEnvironment(outer); 23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pop; 23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), cp); 23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->enumerable(), a0); 2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY); 23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 23263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegister(instr->map()); 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map))); 23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 23333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegisterAtStart(instr->map()); 23343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 23353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 23393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(load); 2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(result); 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_TARGET_ARCH_MIPS 2350