lithium-x64.cc revision 109988c7ccb6f3fd1a58574fa3dfb88beaef6632
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/x64/lithium-x64.h" 6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <sstream> 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_X64 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen-osr.h" 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-inl.h" 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x64/lithium-codegen-x64.h" 149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 15086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace v8 { 16086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace internal { 179fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 18b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DEFINE_COMPILE(type) \ 19b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void L##type::CompileToNative(LCodeGen* generator) { \ 20b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch generator->Do##type(this); \ 21b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 22b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 23b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DEFINE_COMPILE 24b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 25b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG 271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LInstruction::VerifyCall() { 28257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Call instructions can use only fixed registers as temporaries and 29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // outputs because all registers are blocked by the calling convention. 30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Inputs operands must use a fixed register or use-at-start policy or 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // a non-register policy. 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Output() == NULL || 331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LUnallocated::cast(Output())->HasFixedPolicy() || 341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block !LUnallocated::cast(Output())->HasRegisterPolicy()); 353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (UseIterator it(this); !it.Done(); it.Advance()) { 363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() || 38257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch operand->IsUsedAtStart()); 391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (TempIterator it(this); !it.Done(); it.Advance()) { 413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif 461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LInstruction::PrintTo(StringStream* stream) { 49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("%s ", this->Mnemonic()); 501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block PrintOutputOperandTo(stream); 52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch PrintDataTo(stream); 54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (HasEnvironment()) { 56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" "); 57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch environment()->PrintTo(stream); 58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (HasPointerMap()) { 61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" "); 62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pointer_map()->PrintTo(stream); 63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) { 68b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("= "); 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (i > 0) stream->Add(" "); 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (InputAt(i) == NULL) { 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("NULL"); 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 77b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 79b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasResult()) result()->PrintTo(stream); 82b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 84b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLabel::PrintDataTo(StringStream* stream) { 86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LGap::PrintDataTo(stream); 87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LLabel* rep = replacement(); 88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (rep != NULL) { 89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" Dead block replaced with B%d", rep->block_id()); 90b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 91b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LGap::IsRedundant() const { 95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < 4; i++) { 96b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 97b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return false; 98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return true; 102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGap::PrintDataTo(StringStream* stream) { 106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < 4; i++) { 107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("("); 108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (parallel_moves_[i] != NULL) { 109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch parallel_moves_[i]->PrintDataTo(stream); 110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") "); 112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticD::Mnemonic() const { 117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (op()) { 118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::ADD: return "add-d"; 119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::SUB: return "sub-d"; 120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MUL: return "mul-d"; 121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::DIV: return "div-d"; 122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MOD: return "mod-d"; 123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticT::Mnemonic() const { 131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (op()) { 132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::ADD: return "add-t"; 133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::SUB: return "sub-t"; 134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MUL: return "mul-t"; 135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MOD: return "mod-t"; 136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::DIV: return "div-t"; 1371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_AND: return "bit-and-t"; 1381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_OR: return "bit-or-t"; 1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_XOR: return "bit-xor-t"; 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case Token::ROR: return "ror-t"; 1411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SHL: return "sal-t"; 1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SAR: return "sar-t"; 1431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SHR: return "shr-t"; 144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const { 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !gen->IsNextEmittedBlock(block_id()); 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int R> 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LTemplateResultInstruction<R>::MustSignExtendResult( 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LPlatformChunk* chunk) const { 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* hvalue = this->hydrogen_value(); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return hvalue != NULL && 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hvalue->representation().IsInteger32() && 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk->GetDehoistedKeyIds()->Contains(hvalue->id()); 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGoto::PrintDataTo(StringStream* stream) { 167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("B%d", block_id()); 168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LBranch::PrintDataTo(StringStream* stream) { 172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if "); 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" %s ", Token::String(op())); 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 182b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_string("); 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if is_smi("); 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("if is_undetectable("); 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 204257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if string_compare("); 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if has_instance_type("); 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if has_cached_array_index("); 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if class_of_test("); 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(", \"%o\") then B%d else B%d", 233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch *hydrogen()->class_name(), 234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch true_block_id(), 235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch false_block_id()); 236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if typeof "); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" == \"%s\" then B%d else B%d", 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->type_literal()->ToCString().get(), 244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch true_block_id(), false_block_id()); 245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(".code_entry = "); 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_object()->PrintTo(stream); 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_object()->PrintTo(stream); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + "); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset()->PrintTo(stream); 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCallFunction::PrintDataTo(StringStream* stream) { 265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context()->PrintTo(stream); 266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch stream->Add(" "); 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function()->PrintTo(stream); 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (hydrogen()->HasVectorAndSlot()) { 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch stream->Add(" (type-feedback-vector "); 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch temp_vector()->PrintTo(stream); 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch stream->Add(" "); 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch temp_slot()->PrintTo(stream); 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch stream->Add(")"); 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("= "); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("#%d / ", arity()); 282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" "); 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("#%d / ", arity()); 291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 2961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d]", slot_index()); 297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("[%d] <- ", slot_index()); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("= "); 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" #%d / ", arity()); 311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) { 315b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("= "); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constructor()->PrintTo(stream); 317b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" #%d / ", arity()); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind = hydrogen()->elements_kind(); 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" (%s) ", ElementsKindToString(kind)); 320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 322b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch arguments()->PrintTo(stream); 325b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" length "); 327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch length()->PrintTo(stream); 328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" index "); 330b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch index()->PrintTo(stream); 331b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 332b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 333b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS && kDoubleSize == 2 * kPointerSize) { 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Skip a slot if for a double-width slot for x32 port. 337109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch current_frame_slots_++; 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The spill slot's address is at rbp - (index + 1) * kPointerSize - 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // StandardFrameConstants::kFixedFrameSizeFromFp. kFixedFrameSizeFromFp is 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 2 * kPointerSize, if rbp is aligned at 8-byte boundary, the below "|= 1" 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // will make sure the spilled doubles are aligned at 8-byte boundary. 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(haitao): make sure rbp is aligned at 8-byte boundary for x32 port. 343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch current_frame_slots_ |= 1; 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 345109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return current_frame_slots_++; 346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // All stack slots are Double stack slots on x64. 351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Alternatively, at some point, start using half-size 352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // stack slots for int32 values. 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = GetNextSpillIndex(kind); 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS) { 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LDoubleStackSlot::Create(index, zone()); 356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kind == GENERAL_REGISTERS); 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LStackSlot::Create(index, zone()); 359b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 361b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 362b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintTo(stream); 365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::ostringstream os; 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << hydrogen()->access() << " <- "; 367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream->Add(os.str().c_str()); 368e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintTo(stream); 369e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 371e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch object()->PrintTo(stream); 374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("."); 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(String::cast(*name())->ToCString().get()); 376b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" <- "); 377b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch value()->PrintTo(stream); 378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements()->PrintTo(stream); 383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintTo(stream); 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d]", base_offset()); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("]"); 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 390e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 391e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 392e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 3943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch elements()->PrintTo(stream); 3953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("["); 3963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key()->PrintTo(stream); 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d] <-", base_offset()); 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("] <- "); 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value() == NULL) { 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(hydrogen()->IsConstantHoleStore() && 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->value()->representation().IsDouble()); 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("<the hole(nan)>"); 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 4113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 413e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch object()->PrintTo(stream); 415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("["); 416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch key()->PrintTo(stream); 417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("] <- "); 418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch value()->PrintTo(stream); 419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() { 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_unused()); 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_ = new(zone()) LPlatformChunk(info(), graph()); 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LPhase phase("L_Building chunk", chunk_); 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch status_ = BUILDING; 433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If compiling for OSR, reserve space for the unoptimized frame, 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which will be subsumed into this frame. 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (graph()->has_osr()) { 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 441b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 442086aeeaae12517475c22695a200be45495516549Ben Murdoch const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 443086aeeaae12517475c22695a200be45495516549Ben Murdoch for (int i = 0; i < blocks->length(); i++) { 444086aeeaae12517475c22695a200be45495516549Ben Murdoch HBasicBlock* next = NULL; 445086aeeaae12517475c22695a200be45495516549Ben Murdoch if (i < blocks->length() - 1) next = blocks->at(i + 1); 446086aeeaae12517475c22695a200be45495516549Ben Murdoch DoBasicBlock(blocks->at(i), next); 447086aeeaae12517475c22695a200be45495516549Ben Murdoch if (is_aborted()) return NULL; 448086aeeaae12517475c22695a200be45495516549Ben Murdoch } 449086aeeaae12517475c22695a200be45495516549Ben Murdoch status_ = DONE; 450086aeeaae12517475c22695a200be45495516549Ben Murdoch return chunk_; 4519fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block} 4529fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 4539fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 454b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LUnallocated(LUnallocated::FIXED_REGISTER, reg.code()); 456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) { 460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) 461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, reg.code()); 462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, ToUnallocated(fixed_register)); 467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) { 471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, ToUnallocated(reg)); 472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) { 4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, 4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated::USED_AT_START)); 484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseTempRegisterOrConstant(HValue* value) { 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value->IsConstant() 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(value); 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value) { 5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) { 5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated::USED_AT_START)); 507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : Use(value); 514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseAtStart(value); 521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseRegister(value); 528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseRegisterAtStart(value); 535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) { 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return chunk_->DefineConstantOperand(HConstant::cast(value)); 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAny(HValue* value) { 544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 545b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 547b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 548b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 549b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 551b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (value->EmitAtUses()) { 552b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* instr = HInstruction::cast(value); 553b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch VisitInstruction(instr); 554b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(value->id()); 556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* result) { 5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->set_virtual_register(current_instruction_->id()); 563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr->set_result(result); 564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsRegister( 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 572b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 573b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsSpilled( 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, 577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int index) { 5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineSameAsFirst( 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr, 591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Register reg) { 592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Define(instr, ToUnallocated(reg)); 593b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 594b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixedDouble( 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, 598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch XMMRegister reg) { 599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Define(instr, ToUnallocated(reg)); 600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* hydrogen_env = current_block_->last_environment(); 6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int argument_index_accumulator = 0; 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HValue*> objects_to_materialize(0, zone()); 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_environment(CreateEnvironment( 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen_env, &argument_index_accumulator, &objects_to_materialize)); 609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* hinstr, 615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch CanDeoptimize can_deoptimize) { 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsNonDeferredCalling(); 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG 6191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->VerifyCall(); 6201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif 6211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->MarkAsCall(); 622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignPointerMap(instr); 623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // If instruction does not have side-effects lazy deoptimization 625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // after the call will try to deoptimize to the point before the call. 626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Thus we still need to attach environment to this call even if 627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // call sequence can not deoptimize eagerly. 628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch bool needs_environment = 6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !hinstr->HasObservableSideEffects(); 631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (needs_environment && !instr->HasEnvironment()) { 632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignEnvironment(instr); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We can't really figure out if the environment is needed or not. 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->environment()->set_has_been_used(); 635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 641b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->HasPointerMap()); 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_pointer_map(new(zone()) LPointerMap(zone())); 644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::TempRegister() { 6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = 6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int vreg = allocator_->GetVirtualRegister(); 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!allocator_->AllocationOk()) { 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vreg = 0; 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand->set_virtual_register(vreg); 657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 658b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 660b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 661b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) { 662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* operand = ToUnallocated(reg); 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 664b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 665b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 666b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 667b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) { 669b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* operand = ToUnallocated(reg); 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 671b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 672b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 673b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 674b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 675b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LLabel(instr->block()); 677b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 678b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 679b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 6883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 6893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 693b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 694b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 6961e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoShift(Token::Value op, 6971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBitwiseBinaryOperation* instr) { 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 7021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_value = instr->right(); 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant_value = 0; 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool does_deopt = false; 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right_value->IsConstant()) { 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* constant = HConstant::cast(right_value); 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = chunk_->DefineConstantOperand(constant); 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constant_value = constant->Integer32Value() & 0x1f; 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre31Bits() && instr->representation().IsSmi() && 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constant_value > 0) { 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Left shift can deoptimize if we shift by > 0 and the result 714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // cannot be truncated to smi. 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseFixed(right_value, rcx); 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shift operations can only deoptimize if we do a logical shift by 0 and 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the result cannot be truncated to int32. 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::SHR && constant_value == 0) { 724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier does_deopt = !instr->CheckFlag(HInstruction::kUint32); 7251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 7261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt)); 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return does_deopt ? AssignEnvironment(result) : result; 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(op, instr); 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 735b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 736b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HArithmeticBinaryOperation* instr) { 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::MOD) { 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixedDouble(instr->BetterRightOperand(), xmm1); 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineSameAsFirst(result), instr); 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return CpuFeatures::IsSupported(AVX) ? DefineAsRegister(result) 751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : DefineSameAsFirst(result); 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 755b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 756b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation* instr) { 758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* left = instr->left(); 759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* right = instr->right(); 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left->representation().IsTagged()); 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(right->representation().IsTagged()); 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 763b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* left_operand = UseFixed(left, rdx); 764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* right_operand = UseFixed(right, rax); 7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LArithmeticT(op, context, left_operand, right_operand); 767b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_building()); 773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_block_ = block; 774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch next_block_ = next_block; 775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (block->IsStartBlock()) { 776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(graph_->start_environment()); 777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = 0; 778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (block->predecessors()->length() == 1) { 779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // We have a single predecessor => copy environment and outgoing 780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // argument count from the predecessor. 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(block->phis()->length() == 0); 782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* pred = block->predecessors()->at(0); 783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* last_environment = pred->last_environment(); 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(last_environment != NULL); 785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Only copy the environment, if it is later used again. 786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pred->end()->SecondSuccessor() == NULL) { 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->end()->FirstSuccessor() == block); 788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 791b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_environment = last_environment->Copy(); 792b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 793b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 794b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(last_environment); 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->argument_count() >= 0); 796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = pred->argument_count(); 797b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 798b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // We are at a state join => process phis. 799b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* pred = block->predecessors()->at(0); 800b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // No need to copy the environment, it cannot be used later. 801b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* last_environment = pred->last_environment(); 802b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < block->phis()->length(); ++i) { 803b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HPhi* phi = block->phis()->at(i); 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (phi->HasMergedIndex()) { 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(phi->merged_index(), phi); 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 807b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 808b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < block->deleted_phis()->length(); ++i) { 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->deleted_phis()->at(i) < last_environment->length()) { 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(block->deleted_phis()->at(i), 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch graph_->GetConstantUndefined()); 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 814b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(last_environment); 815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Pick up the outgoing argument count of one of the predecessors. 816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = pred->argument_count(); 817b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 818b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* current = block->first(); 819b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int start = chunk_->instructions()->length(); 820b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch while (current != NULL && !is_aborted()) { 821b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Code for constants in registers is generated lazily. 822b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (!current->EmitAtUses()) { 823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch VisitInstruction(current); 824b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current = current->next(); 826b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int end = chunk_->instructions()->length() - 1; 828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (end >= start) { 829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_first_instruction_index(start); 830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_last_instruction_index(end); 831b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 832b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_argument_count(argument_count_); 833b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch next_block_ = NULL; 834b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_block_ = NULL; 835b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 836b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 837b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 838b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 839b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* old_current = current_instruction_; 840b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_instruction_ = current; 841b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* instr = NULL; 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->CanReplaceWithDummyUses()) { 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandCount() == 0) { 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) LDummy()); 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!current->OperandAt(0)->IsControlInstruction()); 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LDummyUse(UseAny(current->OperandAt(0)))); 850b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 1; i < current->OperandCount(); ++i) { 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandAt(i)->IsControlInstruction()) continue; 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* dummy = 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dummy->set_hydrogen_value(current); 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(dummy, current_block_); 857b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* successor; 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->IsControlInstruction() && 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch successor != NULL) { 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = new(zone()) LGoto(successor); 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = current->CompileToLithium(this); 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch argument_count_ += current->argument_delta(); 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ >= 0); 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr != NULL) { 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(instr, current); 874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_instruction_ = old_current; 877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr, 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* hydrogen_val) { 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Associate the hydrogen instruction first, since we may need it for 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_hydrogen_value(hydrogen_val); 885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that the lithium instruction has either no fixed register 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constraints in temps or the result OR no uses that are only used at 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // start. If this invariant doesn't hold, the register allocator can decide 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to insert a split of a range immediately before the instruction due to an 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // already allocated register needing to be used for the instruction's fixed 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // register constraint. In this case, The register allocator won't see an 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // interference between the split child and the use-at-start (it would if 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the it was just a plain use), so it is free to move the split child into 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the same register that is used for the use-at-start. 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // See https://code.google.com/p/chromium/issues/detail?id=201590 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!(instr->ClobbersRegisters() && 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ClobbersDoubleRegisters(isolate()))) { 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int fixed = 0; 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int used_at_start = 0; 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (UseIterator it(instr); !it.Done(); it.Advance()) { 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->IsUsedAtStart()) ++used_at_start; 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Output() != NULL) { 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (TempIterator it(instr); !it.Done(); it.Advance()) { 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->HasFixedPolicy()) ++fixed; 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(fixed == 0 || used_at_start == 0); 913b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignPointerMap(instr); 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_environments && !instr->HasEnvironment()) { 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignEnvironment(instr); 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(instr, current_block_); 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->IsCall() || instr->IsPrologue()) { 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen_val->HasObservableSideEffects()) { 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sim->ReplayEnvironment(current_block_->last_environment()); 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen_value_for_lazy_bailout = sim; 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(bailout, current_block_); 9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LGoto(instr->FirstSuccessor()); 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) { 944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LPrologue(); 945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LDebugBreak(); 950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 952b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 9533fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = value->representation(); 9563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HType type = value->type(); 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ToBooleanStub::Types expected = instr->expected_input_types(); 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!easy_case && 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !expected.IsGeneric())) { 966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch branch = AssignEnvironment(branch); 9673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return branch; 969b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 9721e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 9741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpMapAndBranch(value); 976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 979b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); 982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 983b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 984b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 985b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsElements); 988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 990b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 991b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* left = 993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UseFixed(instr->left(), InstanceOfDescriptor::LeftRegister()); 994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* right = 995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UseFixed(instr->right(), InstanceOfDescriptor::RightRegister()); 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LInstanceOf* result = new (zone()) LInstanceOf(context, left, right); 998e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 999b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1000b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1001b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch( 1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HHasInPrototypeChainAndBranch* instr) { 1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object = UseRegister(instr->object()); 1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* prototype = UseRegister(instr->prototype()); 1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LHasInPrototypeChainAndBranch* result = 1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LHasInPrototypeChainAndBranch(object, prototype); 1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignEnvironment(result); 1009b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1010b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1011b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseRegister(instr->receiver()); 10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1020b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 1021e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1022e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* receiver = UseFixed(instr->receiver(), rax); 1023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* length = UseFixed(instr->length(), rbx); 1024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* elements = UseFixed(instr->elements(), rcx); 10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LApplyArguments* result = new(zone()) LApplyArguments(function, 1026e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch receiver, 1027e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch length, 1028e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch elements); 1029e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1032b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argc = instr->OperandCount(); 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < argc; ++i) { 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* argument = UseOrConstant(instr->argument(i)); 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(new(zone()) LPushArgument(argument), instr); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry( 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreCodeEntry* store_code_entry) { 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseRegister(store_code_entry->function()); 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreCodeEntry(function, code_object); 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInnerAllocatedObject* instr) { 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister( 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LInnerAllocatedObject(base_object, offset)); 10571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 10581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 10591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 10603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 10613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() 10623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? NULL 10633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(new(zone()) LThisFunction); 10643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 10653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10671e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasNoUses()) return NULL; 10691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (info()->IsStub()) { 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(new(zone()) LContext, rsi); 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LContext); 10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 1081b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1082b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1083b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallJSFunction( 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallJSFunction* instr) { 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallJSFunction* result = new(zone()) LCallJSFunction(function); 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1091b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1092b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1093b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor( 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor* instr) { 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor = instr->descriptor(); 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Target 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(target, zone()); 1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Context 1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* op = UseFixed(instr->OperandAt(1), rsi); 1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ops.Add(op, zone()); 1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Other register parameters 1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = LCallWithDescriptor::kImplicitRegisterParameterCount; 1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch i < instr->OperandCount(); i++) { 1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch op = 1109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UseFixed(instr->OperandAt(i), 1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch descriptor.GetRegisterParameter( 1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch i - LCallWithDescriptor::kImplicitRegisterParameterCount)); 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(op, zone()); 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch descriptor, ops, zone()); 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 1125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->op()) { 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFloor: 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFloor(instr); 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathRound: 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathRound(instr); 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFround: 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFround(instr); 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathAbs: 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathAbs(instr); 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathLog: 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathLog(instr); 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathExp: 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathExp(instr); 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathSqrt: 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathSqrt(instr); 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathPowHalf: 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathPowHalf(instr); 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathClz32: 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathClz32(instr); 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFloor* result = new(zone()) LMathFloor(input); 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 1160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(xmm4); 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathRound* result = new(zone()) LMathRound(input, temp); 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 1168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFround* result = new (zone()) LMathFround(input); 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 1175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LMathAbs(context, input)); 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->value()->representation(); 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble()) result = AssignEnvironment(result); 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1188b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1189b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineSameAsFirst(new(zone()) LMathLog(input)), instr); 1195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathClz32* result = new(zone()) LMathClz32(input); 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 1202b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseTempRegister(instr->value()); 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = TempRegister(); 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathExp* result = new(zone()) LMathExp(value, temp1, temp2); 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 1213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseAtStart(instr->value()); 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LMathSqrt(input)); 1219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathPowHalf* result = new(zone()) LMathPowHalf(input); 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(result); 1226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* constructor = UseFixed(instr->constructor(), rdi); 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* slot = NULL; 1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* vector = NULL; 1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->HasVectorAndSlot()) { 1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch slot = FixedTemp(rdx); 1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch vector = FixedTemp(rbx); 1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LCallFunction* call = 1247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LCallFunction(context, function, slot, vector); 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(call, rax), instr); 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallRuntime* result = new(zone()) LCallRuntime(context); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::ROR, instr); 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SHR, instr); 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SAR, instr); 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) { 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SHL, instr); 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* right; 1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We don't support tagged immediates, so we request it in a register. 1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseRegisterAtStart(instr->BetterRightOperand()); 1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseOrConstantAtStart(instr->BetterRightOperand()); 1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LBitI(left, right)); 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(instr->op(), instr); 12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch divisor != 1 && divisor != -1)) { 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = FixedTemp(rax); 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(rdx); 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LDivByConstI( 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp1, temp2), rdx); 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseFixed(instr->left(), rax); 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(rdx); 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LDivI( 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp), rax); 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kCanOverflow) || 1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) { 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1355b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByPowerOf2I(instr); 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByConstI(instr); 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivI(instr); 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 13661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::DIV, instr); 13671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::DIV, instr); 13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1370b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1371b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I( 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = FixedTemp(rax); 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(rdx); 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp3 = 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NULL : TempRegister(); 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LFlooringDivByConstI(dividend, 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch divisor, 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp1, 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp2, 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp3), 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rdx); 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseFixed(instr->left(), rax); 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(rdx); 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LFlooringDivI( 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp), rax); 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kCanOverflow)) { 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByPowerOf2I(instr); 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByConstI(instr); 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivI(instr); 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = FixedTemp(rax); 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(rdx); 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LModByConstI( 1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp1, temp2), rax); 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseFixed(instr->left(), rax); 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(rdx); 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LModI( 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp), rdx); 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoModByPowerOf2I(instr); 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoModByConstI(instr); 149844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoModI(instr); 150044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticD(Token::MOD, instr); 1503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(Token::MOD, instr); 1505e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1514109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch HValue* h_right = instr->BetterRightOperand(); 1515109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LOperand* right = UseOrConstant(h_right); 15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LMulI* mul = new(zone()) LMulI(left, right); 1517109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int constant_value = 1518109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch h_right->IsConstant() ? HConstant::cast(h_right)->Integer32Value() : 0; 1519109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // |needs_environment| must mirror the cases where LCodeGen::DoMulI calls 1520109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // |DeoptimizeIf|. 1521109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool needs_environment = 1522109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch instr->CheckFlag(HValue::kCanOverflow) || 1523109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && 1524109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch (!right->IsConstantOperand() || constant_value <= 0)); 1525109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (needs_environment) { 15263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(mul); 15273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(mul); 15291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsDouble()) { 15301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::MUL, instr); 15311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 15321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::MUL, instr); 15331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 15411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->left()); 1542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* right; 1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We don't support tagged immediates, so we request it in a register. 1545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseRegisterAtStart(instr->right()); 1546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseOrConstantAtStart(instr->right()); 1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LSubI* sub = new(zone()) LSubI(left, right); 15501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LInstruction* result = DefineSameAsFirst(sub); 15511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->CheckFlag(HValue::kCanOverflow)) { 15521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block result = AssignEnvironment(result); 15531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 15541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return result; 15551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsDouble()) { 15561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::SUB, instr); 15571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 15581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::SUB, instr); 15591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check to see if it would be advantageous to use an lea instruction rather 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // than an add. This is the case when no overflow check is needed and there 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // are multiple uses of the add's inputs, so using a 3-register add will 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // preserve all input values for later uses. 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_lea = LAddI::UseLea(instr); 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_candidate = instr->BetterRightOperand(); 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right; 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We cannot add a tagged immediate to a tagged value, 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // so we request it in a register. 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(right_candidate); 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = use_lea ? UseRegisterOrConstantAtStart(right_candidate) 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseOrConstantAtStart(right_candidate); 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = use_lea ? DefineAsRegister(add) 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : DefineSameAsFirst(add); 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (can_overflow) { 1588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch result = AssignEnvironment(result); 1589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return result; 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsExternal()) { 1592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(instr->IsConsistentExternalRepresentation()); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_lea = LAddI::UseLea(instr); 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_candidate = instr->right(); 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = use_lea 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterOrConstantAtStart(right_candidate) 1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseOrConstantAtStart(right_candidate); 1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = use_lea 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? DefineAsRegister(add) 1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : DefineSameAsFirst(add); 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (instr->representation().IsDouble()) { 1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DoArithmeticD(Token::ADD, instr); 1607b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 1608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return DoArithmeticT(Token::ADD, instr); 1609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = NULL; 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmi()) { 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->BetterLeftOperand()); 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseAtStart(instr->BetterRightOperand()); 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsInteger32()) { 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->BetterLeftOperand()); 1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseOrConstantAtStart(instr->BetterRightOperand()); 1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->left()); 1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(instr->right()); 1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathMinMax* minmax = new(zone()) LMathMinMax(left, right); 1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(minmax); 1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We call a C function for double power. It can't trigger a GC. 1638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We need to use fixed result register for the call. 1639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation exponent_type = instr->right()->representation(); 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* left = UseFixedDouble(instr->left(), xmm2); 1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = 1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exponent_type.IsDouble() 1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseFixedDouble(instr->right(), xmm1) 1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LPower* result = new(zone()) LPower(left, right); 16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm3), instr, 1648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch CAN_DEOPTIMIZE_EAGERLY); 1649b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1650b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1651b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 16523fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCmpT* result = new(zone()) LCmpT(context, left, right); 16593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 16603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareNumericAndBranch* instr) { 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->representation(); 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmiOrInteger32()) { 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(r)); 1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(r)); 16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 16701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseOrConstantAtStart(instr->right()); 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(r.IsDouble()); 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left; 16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right; 16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->left()->IsConstant() && instr->right()->IsConstant()) { 16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterOrConstantAtStart(instr->left()); 16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterOrConstantAtStart(instr->right()); 16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterAtStart(instr->left()); 16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterAtStart(instr->right()); 16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 16903fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareObjectEqAndBranch* instr) { 16921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->left()); 1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpObjectEqAndBranch(left, right); 1695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1696b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1697b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareHoleAndBranch* instr) { 17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCmpHoleAndBranch(value); 1702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsStringAndBranch(value, temp); 1710592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1711592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1712592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 17133fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1716b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1717b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 17203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HIsUndetectableAndBranch* instr) { 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsUndetectableAndBranch(value, temp); 17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch( 17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch* instr) { 17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 17353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCompareAndBranch* result = 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCompareAndBranch(context, left, right); 17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 1740592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1741592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1742592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 17433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 17443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch* instr) { 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasInstanceTypeAndBranch(value); 1748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 1752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HGetCachedArrayIndex* instr) { 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 1754e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1755e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 1757b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 17613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasCachedArrayIndexAndBranch* instr) { 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasCachedArrayIndexAndBranch(value); 1765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1767b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 17693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HClassOfTestAndBranch* instr) { 17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LClassOfTestAndBranch(value, 17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister(), 17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister()); 1774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 17813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = FLAG_debug_code 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterAtStart(instr->index()) 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->index()); 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = FLAG_debug_code 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterAtStart(instr->value()) 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->value()); 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), rsi) : NULL; 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LSeqStringSetChar(context, string, 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index, value); 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_debug_code) { 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = MarkAsCall(result, instr); 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 18003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code && instr->skip_check()) return NULL; 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length = !index->IsConstantOperand() 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseOrConstantAtStart(instr->length()) 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseAtStart(instr->length()); 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LBoundsCheck(index, length); 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code || !instr->skip_check()) { 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18135d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 18145d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 18155d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheckBaseIndexInformation* instr) { 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 18201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 18211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18231e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 18241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The control instruction marking the end of a block that completed 18251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // abruptly (e.g., threw an exception). There is nothing specific to do. 1826b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 18303fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 18313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 18323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 18333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 18343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1835257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // All HForceRepresentation instructions should be eliminated in the 1837257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // representation change phase of Hydrogen. 1838257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch UNREACHABLE(); 1839257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 1840257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1841257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1842257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1843b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) { 18441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation from = instr->from(); 18451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation to = instr->to(); 1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* val = instr->value(); 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (from.IsSmi()) { 1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) { 1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch from = Representation::Tagged(); 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (from.IsTagged()) { 18551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsDouble()) { 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi()) { 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 18661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi() || val->representation().IsSmi()) { 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LSmiUntag(value, false)); 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 18733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool truncating = instr->CanTruncateToInt32(); 18743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1); 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp)); 1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (from.IsDouble()) { 18821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsTagged()) { 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 18851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* temp = TempRegister(); 18861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LUnallocated* result_temp = TempRegister(); 18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagD* result = new(zone()) LNumberTagD(value, temp); 18881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignPointerMap(Define(result, result_temp)); 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LDoubleToSmi(value))); 18931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (from.IsInteger32()) { 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 19021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsTagged()) { 1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CheckFlag(HValue::kCanOverflow)) { 1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSmiTag(value)); 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (val->CheckFlag(HInstruction::kUint32)) { 1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(xmm1); 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineSameAsFirst(result)); 19121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = SmiValuesAre32Bits() ? NULL : TempRegister(); 1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = SmiValuesAre32Bits() ? NULL : FixedTemp(xmm1); 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineSameAsFirst(result)); 19181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 19261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsDouble()); 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->CheckFlag(HInstruction::kUint32)) { 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = Use(val); 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LInteger32ToDouble(value)); 1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 19341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 1937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1939b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1940b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 19421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LCheckNonSmi(value); 1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->value()->type().IsHeapObject()) { 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1948b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1949b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 19521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckSmi(value)); 1954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoCheckArrayBufferNotNeutered( 1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HCheckArrayBufferNotNeutered* instr) { 1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* view = UseRegisterAtStart(instr->value()); 1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LCheckArrayBufferNotNeutered* result = 1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LCheckArrayBufferNotNeutered(view); 1962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignEnvironment(result); 1963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 19671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCheckInstanceType* result = new(zone()) LCheckInstanceType(value); 1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 1970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 19741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckValue(value)); 1976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 19811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasMigrationTarget()) { 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignPointerMap(result); 1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1990b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 1992257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value = instr->value(); 1993257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Representation input_rep = value->representation(); 1994257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* reg = UseRegister(value); 1995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (input_rep.IsDouble()) { 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LClampDToUint8(reg)); 1997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (input_rep.IsInteger32()) { 19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LClampIToUint8(reg)); 1999257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(input_rep.IsSmiOrTagged()); 2001257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Register allocator doesn't (yet) support allocation of double 2002257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // temps. Reserve xmm1 explicitly. 20033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LClampTToUint8* result = new(zone()) LClampTToUint8(reg, 20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(xmm1)); 2005257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 2006257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2007257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value = instr->value(); 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->representation().IsDouble()); 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* lo = UseRegister(instr->lo()); 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* hi = UseRegister(instr->hi()); 2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2024b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = info()->IsStub() ? UseFixed(instr->context(), rsi) : NULL; 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LReturn( 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->value(), rax), context, parameter_count); 2029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2032b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 2033b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Representation r = instr->representation(); 2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmi()) { 2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantS); 2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsInteger32()) { 20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantI); 2038b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (r.IsDouble()) { 2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return DefineAsRegister(new (zone()) LConstantD); 2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsExternal()) { 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantE); 2042b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (r.IsTagged()) { 20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantT); 2044b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 2045b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 2046b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2047b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 2048b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2049b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2050b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 20518b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* global_object = 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* vector = NULL; 2056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (instr->HasVectorAndSlot()) { 2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadGlobalGeneric* result = 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LLoadGlobalGeneric(context, global_object, vector); 20628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 20638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 20648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 20658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2066b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 2067e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 20693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LLoadContextSlot(context)); 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 2074b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2075b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2076b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 20771e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 2078e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context; 2079e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value; 2080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* temp; 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context = UseRegister(instr->context()); 2082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (instr->NeedsWriteBarrier()) { 2083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value = UseTempRegister(instr->value()); 2084e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch temp = TempRegister(); 2085e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 2086e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value = UseRegister(instr->value()); 2087e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch temp = NULL; 2088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 20893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp); 2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 2094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 20971e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use the special mov rax, moffs64 encoding for external 2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // memory accesses with 64-bit word-sized values. 2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->access().IsExternalMemory() && 2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().offset() == 0 && 2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->access().representation().IsSmi() || 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().representation().IsTagged() || 2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().representation().IsHeapObject() || 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().representation().IsExternal())) { 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = UseRegisterOrConstantAtStart(instr->object()); 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(new(zone()) LLoadNamedField(obj), rax); 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* obj = UseRegisterAtStart(instr->object()); 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 21111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 21121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* vector = NULL; 2119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (instr->HasVectorAndSlot()) { 2120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric( 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context, object, vector); 21241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return MarkAsCall(DefineFixed(result, rax), instr); 2125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 2129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadFunctionPrototype* instr) { 21301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(DefineAsRegister( 21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 2132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LLoadRoot); 21371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 21381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) { 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We sign extend the dehoisted key at the definition point when the pointer 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use 2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // points and should not invoke this function. We can't use STATIC_ASSERT 2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // here as the pointer size is 32-bit for x32. 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kPointerSize == kInt64Size); 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* dehoisted_key_ids = chunk_->GetDehoistedKeyIds(); 2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (dehoisted_key_ids->Contains(candidate->id())) return; 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dehoisted_key_ids->Add(candidate->id()); 2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!candidate->IsPhi()) return; 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < candidate->OperandCount(); ++i) { 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FindDehoistedKeyDefinitions(candidate->OperandAt(i)); 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((kPointerSize == kInt64Size && 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation().IsInteger32()) || 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (kPointerSize == kInt32Size && 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation().IsSmiOrInteger32())); 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = NULL; 21641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize == kInt64Size) { 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool clobbers_key = ExternalArrayOpRequiresTemp( 2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation(), elements_kind); 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = clobbers_key 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseTempRegister(instr->key()) 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->key()); 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { 2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FindDehoistedKeyDefinitions(instr->key()); 2177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!instr->is_fixed_typed_array()) { 2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = UseRegisterAtStart(instr->elements()); 2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = DefineAsRegister(new (zone()) LLoadKeyed(obj, key, nullptr)); 2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsInteger32() && 2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !(IsDoubleOrFloatElementsKind(elements_kind))) || 2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsDouble() && 2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (IsDoubleOrFloatElementsKind(elements_kind)))); 2188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner = UseAny(instr->backing_store_owner()); 2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = DefineAsRegister( 2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LLoadKeyed(backing_store, key, backing_store_owner)); 2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool needs_environment; 2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->is_fixed_typed_array()) { 2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // see LCodeGen::DoLoadKeyedExternalArray 2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch needs_environment = elements_kind == UINT32_ELEMENTS && 2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch !instr->CheckFlag(HInstruction::kUint32); 2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // see LCodeGen::DoLoadKeyedFixedDoubleArray and 2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // LCodeGen::DoLoadKeyedFixedArray 2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch needs_environment = 2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->RequiresHoleCheck() || 2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (instr->hole_mode() == CONVERT_HOLE_TO_UNDEFINED && info()->IsStub()); 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (needs_environment) { 2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 2211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = 2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* vector = NULL; 2220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (instr->HasVectorAndSlot()) { 2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2223e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadKeyedGeneric* result = 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LLoadKeyedGeneric(context, object, key, vector); 2226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 2227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 22323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FindDehoistedKeyDefinitions(instr->key()); 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!instr->is_fixed_typed_array()) { 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->elements()->representation().IsTagged()); 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = NULL; 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = NULL; 2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation value_representation = instr->value()->representation(); 2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value_representation.IsDouble()) { 2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value_representation.IsSmiOrTagged() || 2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value_representation.IsInteger32()); 2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseTempRegister(instr->elements()); 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseTempRegister(instr->key()); 2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterOrConstantAtStart(instr->value()); 2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LStoreKeyed(object, key, val, nullptr); 2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsInteger32() && 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !IsDoubleOrFloatElementsKind(elements_kind)) || 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsDouble() && 2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsDoubleOrFloatElementsKind(elements_kind))); 2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(instr->elements()->representation().IsExternal()); 2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool val_is_temp_register = elements_kind == UINT8_CLAMPED_ELEMENTS || 2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch elements_kind == FLOAT32_ELEMENTS; 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = val_is_temp_register ? UseTempRegister(instr->value()) 22758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : UseRegister(instr->value()); 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize == kInt64Size) { 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool clobbers_key = ExternalArrayOpRequiresTemp( 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation(), elements_kind); 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = clobbers_key 2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseTempRegister(instr->key()) 2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->key()); 2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner = UseAny(instr->backing_store_owner()); 2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LStoreKeyed(backing_store, key, val, backing_store_owner); 2289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 2290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = 2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->object()->representation().IsTagged()); 2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->key()->representation().IsTagged()); 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 2302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* slot = NULL; 2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* vector = NULL; 2305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->HasVectorAndSlot()) { 2306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch slot = FixedTemp(VectorStoreICDescriptor::SlotRegister()); 2307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch vector = FixedTemp(VectorStoreICDescriptor::VectorRegister()); 2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LStoreKeyedGeneric* result = new (zone()) 2311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LStoreKeyedGeneric(context, object, key, value, slot, vector); 2312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(result, instr); 2313b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2314b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2315b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind( 23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr) { 2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = TempRegister(); 23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp_reg = TempRegister(); 2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTransitionElementsKind* result = new(zone()) LTransitionElementsKind( 2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object, NULL, new_map_reg, temp_reg); 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 23263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), rax); 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTransitionElementsKind(object, context, NULL, NULL); 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(result, instr); 23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento( 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTrapAllocationMemento* instr) { 2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = UseRegister(instr->object()); 2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTrapAllocationMemento* result = 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTrapAllocationMemento(object, temp); 2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoMaybeGrowElements(HMaybeGrowElements* instr) { 2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info()->MarkAsDeferredCalling(); 2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object = Use(instr->object()); 2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* elements = Use(instr->elements()); 2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* current_capacity = UseRegisterOrConstant(instr->current_capacity()); 2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements* result = new (zone()) 2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements(context, object, elements, key, current_capacity); 2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DefineFixed(result, rax); 2356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignPointerMap(AssignEnvironment(result)); 2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_in_object = instr->access().IsInobject(); 2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_external_location = instr->access().IsExternalMemory() && 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().offset() == 0; 23641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool needs_write_barrier = instr->NeedsWriteBarrier(); 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier_for_map = instr->has_transition() && 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->NeedsWriteBarrierForMap(); 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj; 2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = is_in_object 2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(instr->object()); 2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_external_location) { 2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_in_object); 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!needs_write_barrier); 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!needs_write_barrier_for_map); 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = UseRegisterOrConstant(instr->object()); 2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = needs_write_barrier_for_map 2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterAtStart(instr->object()); 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 23831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_be_constant = instr->value()->IsConstant() && 2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(instr->value())->NotInNewSpace() && 2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->field_representation().IsDouble(); 2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val; 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_external_location) { 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseFixed(instr->value(), rax); 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (can_be_constant) { 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterOrConstant(instr->value()); 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->field_representation().IsDouble()) { 2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegister(instr->value()); 2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 24001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 24011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // We only need a scratch register if we have a write barrier or we 24021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // have a store into the properties array (not in-object-property). 2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = (!is_in_object || needs_write_barrier || 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch needs_write_barrier_for_map) ? TempRegister() : NULL; 24051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreNamedField(obj, val, temp); 2407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2408b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 2415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* slot = NULL; 2416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* vector = NULL; 2417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->HasVectorAndSlot()) { 2418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch slot = FixedTemp(VectorStoreICDescriptor::SlotRegister()); 2419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch vector = FixedTemp(VectorStoreICDescriptor::VectorRegister()); 2420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStoreNamedGeneric* result = 2423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LStoreNamedGeneric(context, object, value, slot, vector); 2424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(result, instr); 2425b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2426b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2427b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LStringAdd(context, left, right), rax), instr); 2434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 24371e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 243869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* string = UseTempRegister(instr->string()); 243969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharCodeAt* result = 2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharCodeAt(context, string, index); 2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 2444b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2446b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 244744f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 244844f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* char_code = UseRegister(instr->value()); 2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharFromCode* result = 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharFromCode(context, char_code); 245244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return AssignPointerMap(DefineAsRegister(result)); 245344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 245444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 245544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* size = instr->size()->IsConstant() 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseConstant(instr->size()) 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(instr->size()); 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAllocate* result = new(zone()) LAllocate(context, size, temp); 24643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ == 0); 2470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch allocator_->MarkAsOsrEntry(); 2471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch current_block_->last_environment()->set_ast_id(instr->ast_id()); 24723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LOsrEntry); 2473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LParameter* result = new(zone()) LParameter; 2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->kind() == HParameter::STACK_PARAMETER) { 2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsSpilled(result, spill_index); 2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(info()->IsStub()); 2483109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CallInterfaceDescriptor descriptor = graph()->descriptor(); 2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = static_cast<int>(instr->index()); 2485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Register reg = descriptor.GetRegisterParameter(index); 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(result, reg); 2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use an index that corresponds to the location in the unoptimized frame, 2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which the optimized frame will subsume. 2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int env_index = instr->index(); 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = 0; 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->environment()->is_parameter_index(env_index)) { 2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = chunk()->GetParameterStackSlot(env_index); 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = env_index - instr->environment()->first_local_index(); 2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Retry(kTooManySpillSlotsNeededForOSR); 2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = 0; 2503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2504109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch spill_index += StandardFrameConstants::kFixedSlotCount; 25057d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch } 25063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 2511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // There are no real uses of the arguments object. 2512e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // arguments.length and element access are supported directly on 2513e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // stack arguments, and any real arguments object use causes a bailout. 2514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // So this value is never used. 2515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // There are no real uses of a captured object. 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* args = UseRegister(instr->arguments()); 2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length; 2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index; 2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->length()->IsConstant() && instr->index()->IsConstant()) { 2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch length = UseRegisterOrConstant(instr->length()); 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index = UseOrConstant(instr->index()); 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch length = UseTempRegister(instr->length()); 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index = Use(instr->index()); 2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 2540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 254344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 254444f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* object = UseFixed(instr->value(), rax); 25453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LToFastProperties* result = new(zone()) LToFastProperties(object); 254644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return MarkAsCall(DefineFixed(result, rax), instr); 254744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 254844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 254944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* value = UseFixed(instr->value(), rbx); 2553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTypeof* result = new(zone()) LTypeof(context, value); 2554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 2555b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 25583fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 25593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 2560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 25621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 2565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2569b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 25713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (instr->is_function_entry()) { 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LStackCheck(context), instr); 25743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->is_backwards_branch()); 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AssignPointerMap(new(zone()) LStackCheck(context))); 25793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 25841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HEnvironment* outer = current_block_->last_environment(); 2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch outer->set_ast_id(instr->ReturnId()); 25861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HConstant* undefined = graph()->GetConstantUndefined(); 25871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HEnvironment* inner = outer->CopyForInlining(instr->closure(), 25883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->arguments_count(), 25891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->function(), 2590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch undefined, 2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->inlining_kind()); 2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only replay binding of arguments object if it wasn't removed from graph. 2593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->Bind(instr->arguments_var(), instr->arguments_object()); 25953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->BindContext(instr->closure_context()); 2597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->set_entry(instr); 25981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block current_block_->UpdateEnvironment(inner); 2599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch chunk_->AddInlinedFunction(instr->shared()); 2600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* pop = NULL; 2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironment* env = current_block_->last_environment(); 2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (env->entry()->arguments_pushed()) { 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count = env->arguments_environment()->parameter_count(); 2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pop = new(zone()) LDrop(argument_count); 2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->argument_delta() == -argument_count); 2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment()-> 26163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DiscardInlined(false); 26171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block current_block_->UpdateEnvironment(outer); 2618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pop; 2620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2622257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 26233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 26253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->enumerable(), rax); 2626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 26273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 26283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 26293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 26303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 26313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 26323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegister(instr->map()); 26333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 26343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LForInCacheArray(map))); 26353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 26363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 26373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 26383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 26393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 26403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegisterAtStart(instr->map()); 26413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 26423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 26433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 26443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 26453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 26463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 26473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 2649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(load); 2650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(result); 2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseRegisterAtStart(instr->context()); 2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreFrameContext(context); 2657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 2661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 2662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2663b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif // V8_TARGET_ARCH_X64 2664