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" 1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h" 159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 16086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace v8 { 17086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace internal { 189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 19b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DEFINE_COMPILE(type) \ 20b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void L##type::CompileToNative(LCodeGen* generator) { \ 21b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch generator->Do##type(this); \ 22b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 23b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 24b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DEFINE_COMPILE 25b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 26b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG 281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LInstruction::VerifyCall() { 29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Call instructions can use only fixed registers as temporaries and 30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // outputs because all registers are blocked by the calling convention. 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Inputs operands must use a fixed register or use-at-start policy or 32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // a non-register policy. 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Output() == NULL || 341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LUnallocated::cast(Output())->HasFixedPolicy() || 351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block !LUnallocated::cast(Output())->HasRegisterPolicy()); 363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (UseIterator it(this); !it.Done(); it.Advance()) { 373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() || 39257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch operand->IsUsedAtStart()); 401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (TempIterator it(this); !it.Done(); it.Advance()) { 423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif 471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LInstruction::PrintTo(StringStream* stream) { 50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("%s ", this->Mnemonic()); 511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block PrintOutputOperandTo(stream); 53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch PrintDataTo(stream); 55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (HasEnvironment()) { 57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" "); 58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch environment()->PrintTo(stream); 59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (HasPointerMap()) { 62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" "); 63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pointer_map()->PrintTo(stream); 64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 67b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) { 69b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("= "); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (i > 0) stream->Add(" "); 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (InputAt(i) == NULL) { 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("NULL"); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 79b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasResult()) result()->PrintTo(stream); 83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 84b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLabel::PrintDataTo(StringStream* stream) { 87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LGap::PrintDataTo(stream); 88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LLabel* rep = replacement(); 89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (rep != NULL) { 90b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" Dead block replaced with B%d", rep->block_id()); 91b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LGap::IsRedundant() const { 96b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < 4; i++) { 97b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return false; 99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return true; 103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGap::PrintDataTo(StringStream* stream) { 107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < 4; i++) { 108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("("); 109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (parallel_moves_[i] != NULL) { 110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch parallel_moves_[i]->PrintDataTo(stream); 111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") "); 113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticD::Mnemonic() const { 118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (op()) { 119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::ADD: return "add-d"; 120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::SUB: return "sub-d"; 121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MUL: return "mul-d"; 122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::DIV: return "div-d"; 123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MOD: return "mod-d"; 124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticT::Mnemonic() const { 132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (op()) { 133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::ADD: return "add-t"; 134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::SUB: return "sub-t"; 135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MUL: return "mul-t"; 136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MOD: return "mod-t"; 137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::DIV: return "div-t"; 1381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_AND: return "bit-and-t"; 1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_OR: return "bit-or-t"; 1401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_XOR: return "bit-xor-t"; 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case Token::ROR: return "ror-t"; 1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SHL: return "sal-t"; 1431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SAR: return "sar-t"; 1441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SHR: return "shr-t"; 145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const { 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !gen->IsNextEmittedBlock(block_id()); 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int R> 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LTemplateResultInstruction<R>::MustSignExtendResult( 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LPlatformChunk* chunk) const { 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* hvalue = this->hydrogen_value(); 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return hvalue != NULL && 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hvalue->representation().IsInteger32() && 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk->GetDehoistedKeyIds()->Contains(hvalue->id()); 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGoto::PrintDataTo(StringStream* stream) { 168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("B%d", block_id()); 169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LBranch::PrintDataTo(StringStream* stream) { 173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if "); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" %s ", Token::String(op())); 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_string("); 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if is_smi("); 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("if is_undetectable("); 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 204257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if string_compare("); 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->PrintTo(stream); 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->PrintTo(stream); 2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 217b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if has_instance_type("); 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if class_of_test("); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(", \"%o\") then B%d else B%d", 227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch *hydrogen()->class_name(), 228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch true_block_id(), 229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch false_block_id()); 230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if typeof "); 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" == \"%s\" then B%d else B%d", 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->type_literal()->ToCString().get(), 238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch true_block_id(), false_block_id()); 239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(".code_entry = "); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_object()->PrintTo(stream); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" = "); 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_object()->PrintTo(stream); 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + "); 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset()->PrintTo(stream); 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < InputCount(); i++) { 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InputAt(i)->PrintTo(stream); 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" "); 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("#%d / ", arity()); 264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 265b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 2691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d]", slot_index()); 270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 273e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context()->PrintTo(stream); 275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("[%d] <- ", slot_index()); 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 279e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("= "); 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function()->PrintTo(stream); 283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" #%d / ", arity()); 284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) { 288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("= "); 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constructor()->PrintTo(stream); 290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" #%d / ", arity()); 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind = hydrogen()->elements_kind(); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" (%s) ", ElementsKindToString(kind)); 293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 295b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch arguments()->PrintTo(stream); 298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" length "); 300b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch length()->PrintTo(stream); 301b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 302b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" index "); 303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch index()->PrintTo(stream); 304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS && kDoubleSize == 2 * kPointerSize) { 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Skip a slot if for a double-width slot for x32 port. 310109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch current_frame_slots_++; 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The spill slot's address is at rbp - (index + 1) * kPointerSize - 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // StandardFrameConstants::kFixedFrameSizeFromFp. kFixedFrameSizeFromFp is 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 2 * kPointerSize, if rbp is aligned at 8-byte boundary, the below "|= 1" 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // will make sure the spilled doubles are aligned at 8-byte boundary. 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(haitao): make sure rbp is aligned at 8-byte boundary for x32 port. 316109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch current_frame_slots_ |= 1; 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 318109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return current_frame_slots_++; 319b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // All stack slots are Double stack slots on x64. 324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Alternatively, at some point, start using half-size 325b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // stack slots for int32 values. 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = GetNextSpillIndex(kind); 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == DOUBLE_REGISTERS) { 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LDoubleStackSlot::Create(index, zone()); 329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kind == GENERAL_REGISTERS); 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LStackSlot::Create(index, zone()); 332b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 333b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 334b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 335b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintTo(stream); 338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::ostringstream os; 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << hydrogen()->access() << " <- "; 340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stream->Add(os.str().c_str()); 341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintTo(stream); 342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements()->PrintTo(stream); 347e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintTo(stream); 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d]", base_offset()); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("]"); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 354e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 355e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 3583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch elements()->PrintTo(stream); 3593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("["); 3603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key()->PrintTo(stream); 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hydrogen()->IsDehoisted()) { 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add(" + %d] <-", base_offset()); 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("] <- "); 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value() == NULL) { 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(hydrogen()->IsConstantHoleStore() && 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hydrogen()->value()->representation().IsDouble()); 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stream->Add("<the hole(nan)>"); 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value()->PrintTo(stream); 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 3753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() { 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_unused()); 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_ = new(zone()) LPlatformChunk(info(), graph()); 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LPhase phase("L_Building chunk", chunk_); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch status_ = BUILDING; 388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If compiling for OSR, reserve space for the unoptimized frame, 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which will be subsumed into this frame. 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (graph()->has_osr()) { 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 396b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 397086aeeaae12517475c22695a200be45495516549Ben Murdoch const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 398086aeeaae12517475c22695a200be45495516549Ben Murdoch for (int i = 0; i < blocks->length(); i++) { 399086aeeaae12517475c22695a200be45495516549Ben Murdoch HBasicBlock* next = NULL; 400086aeeaae12517475c22695a200be45495516549Ben Murdoch if (i < blocks->length() - 1) next = blocks->at(i + 1); 401086aeeaae12517475c22695a200be45495516549Ben Murdoch DoBasicBlock(blocks->at(i), next); 402086aeeaae12517475c22695a200be45495516549Ben Murdoch if (is_aborted()) return NULL; 403086aeeaae12517475c22695a200be45495516549Ben Murdoch } 404086aeeaae12517475c22695a200be45495516549Ben Murdoch status_ = DONE; 405086aeeaae12517475c22695a200be45495516549Ben Murdoch return chunk_; 4069fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block} 4079fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 4089fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LUnallocated(LUnallocated::FIXED_REGISTER, reg.code()); 411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) { 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) 416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, reg.code()); 417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, ToUnallocated(fixed_register)); 422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 423b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 424b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 425b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) { 426b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, ToUnallocated(reg)); 427b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 428b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 429b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 430b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) { 4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 432b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 438b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated::USED_AT_START)); 439b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 440b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 441b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 442b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 444b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 446b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseTempRegisterOrConstant(HValue* value) { 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value->IsConstant() 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(value); 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 454b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value) { 4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) { 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated::USED_AT_START)); 462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : Use(value); 469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseAtStart(value); 476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseRegister(value); 483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseRegisterAtStart(value); 490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) { 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return chunk_->DefineConstantOperand(HConstant::cast(value)); 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAny(HValue* value) { 499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 500b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (value->EmitAtUses()) { 507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* instr = HInstruction::cast(value); 508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch VisitInstruction(instr); 509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(value->id()); 511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* result) { 5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->set_virtual_register(current_instruction_->id()); 518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr->set_result(result); 519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsRegister( 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsSpilled( 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, 532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int index) { 5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 538b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineSameAsFirst( 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr) { 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr, 546b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Register reg) { 547b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Define(instr, ToUnallocated(reg)); 548b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 549b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 551b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixedDouble( 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTemplateResultInstruction<1>* instr, 553b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch XMMRegister reg) { 554b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Define(instr, ToUnallocated(reg)); 555b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* hydrogen_env = current_block_->last_environment(); 5603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return LChunkBuilderBase::AssignEnvironment(instr, hydrogen_env); 561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* hinstr, 566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch CanDeoptimize can_deoptimize) { 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsNonDeferredCalling(); 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG 5701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->VerifyCall(); 5711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif 5721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->MarkAsCall(); 573b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignPointerMap(instr); 574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // If instruction does not have side-effects lazy deoptimization 576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // after the call will try to deoptimize to the point before the call. 577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Thus we still need to attach environment to this call even if 578b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // call sequence can not deoptimize eagerly. 579b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch bool needs_environment = 5803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !hinstr->HasObservableSideEffects(); 582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (needs_environment && !instr->HasEnvironment()) { 583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignEnvironment(instr); 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We can't really figure out if the environment is needed or not. 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->environment()->set_has_been_used(); 586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->HasPointerMap()); 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_pointer_map(new(zone()) LPointerMap(zone())); 595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::TempRegister() { 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = 6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int vreg = allocator_->GetVirtualRegister(); 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!allocator_->AllocationOk()) { 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch vreg = 0; 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand->set_virtual_register(vreg); 608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) { 613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* operand = ToUnallocated(reg); 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 617b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) { 620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* operand = ToUnallocated(reg); 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operand->HasFixedPolicy()); 622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LLabel(instr->block()); 628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 6393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 6403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 642b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoShift(Token::Value op, 6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBitwiseBinaryOperation* instr) { 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 6531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_value = instr->right(); 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int constant_value = 0; 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool does_deopt = false; 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right_value->IsConstant()) { 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* constant = HConstant::cast(right_value); 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = chunk_->DefineConstantOperand(constant); 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constant_value = constant->Integer32Value() & 0x1f; 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre31Bits() && instr->representation().IsSmi() && 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch constant_value > 0) { 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Left shift can deoptimize if we shift by > 0 and the result 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // cannot be truncated to smi. 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseFixed(right_value, rcx); 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shift operations can only deoptimize if we do a logical shift by 0 and 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the result cannot be truncated to int32. 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::SHR && constant_value == 0) { 675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier does_deopt = !instr->CheckFlag(HInstruction::kUint32); 6761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 6771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt)); 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return does_deopt ? AssignEnvironment(result) : result; 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(op, instr); 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 684b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 685b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HArithmeticBinaryOperation* instr) { 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::MOD) { 69313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* left = UseFixedDouble(instr->BetterLeftOperand(), xmm0); 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixedDouble(instr->BetterRightOperand(), xmm1); 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 69613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm0), instr); 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return CpuFeatures::IsSupported(AVX) ? DefineAsRegister(result) 702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : DefineSameAsFirst(result); 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 704b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 705b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 706b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation* instr) { 709b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* left = instr->left(); 710b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* right = instr->right(); 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left->representation().IsTagged()); 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(right->representation().IsTagged()); 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* left_operand = UseFixed(left, rdx); 715b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* right_operand = UseFixed(right, rax); 7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LArithmeticT(op, context, left_operand, right_operand); 718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 719b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 720b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 721b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 722b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_building()); 724b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_block_ = block; 725b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch next_block_ = next_block; 726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (block->IsStartBlock()) { 727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(graph_->start_environment()); 728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = 0; 729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (block->predecessors()->length() == 1) { 730b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // We have a single predecessor => copy environment and outgoing 731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // argument count from the predecessor. 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(block->phis()->length() == 0); 733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* pred = block->predecessors()->at(0); 734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* last_environment = pred->last_environment(); 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(last_environment != NULL); 736b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Only copy the environment, if it is later used again. 737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pred->end()->SecondSuccessor() == NULL) { 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->end()->FirstSuccessor() == block); 739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 741b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 742b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_environment = last_environment->Copy(); 743b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 745b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(last_environment); 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(pred->argument_count() >= 0); 747b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = pred->argument_count(); 748b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 749b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // We are at a state join => process phis. 750b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* pred = block->predecessors()->at(0); 751b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // No need to copy the environment, it cannot be used later. 752b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* last_environment = pred->last_environment(); 753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < block->phis()->length(); ++i) { 754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HPhi* phi = block->phis()->at(i); 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (phi->HasMergedIndex()) { 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(phi->merged_index(), phi); 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < block->deleted_phis()->length(); ++i) { 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->deleted_phis()->at(i) < last_environment->length()) { 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_environment->SetValueAt(block->deleted_phis()->at(i), 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch graph_->GetConstantUndefined()); 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(last_environment); 766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Pick up the outgoing argument count of one of the predecessors. 767b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = pred->argument_count(); 768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* current = block->first(); 770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int start = chunk_->instructions()->length(); 771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch while (current != NULL && !is_aborted()) { 772b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Code for constants in registers is generated lazily. 773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (!current->EmitAtUses()) { 774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch VisitInstruction(current); 775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current = current->next(); 777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int end = chunk_->instructions()->length() - 1; 779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (end >= start) { 780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_first_instruction_index(start); 781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_last_instruction_index(end); 782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_argument_count(argument_count_); 784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch next_block_ = NULL; 785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_block_ = NULL; 786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* old_current = current_instruction_; 791b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_instruction_ = current; 792b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* instr = NULL; 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->CanReplaceWithDummyUses()) { 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandCount() == 0) { 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) LDummy()); 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!current->OperandAt(0)->IsControlInstruction()); 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = DefineAsRegister(new(zone()) 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LDummyUse(UseAny(current->OperandAt(0)))); 801b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 1; i < current->OperandCount(); ++i) { 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->OperandAt(i)->IsControlInstruction()) continue; 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* dummy = 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dummy->set_hydrogen_value(current); 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(dummy, current_block_); 808b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* successor; 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (current->IsControlInstruction() && 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch successor != NULL) { 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = new(zone()) LGoto(successor); 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = current->CompileToLithium(this); 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch argument_count_ += current->argument_delta(); 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ >= 0); 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr != NULL) { 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(instr, current); 825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_instruction_ = old_current; 828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr, 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* hydrogen_val) { 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Associate the hydrogen instruction first, since we may need it for 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->set_hydrogen_value(hydrogen_val); 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that the lithium instruction has either no fixed register 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constraints in temps or the result OR no uses that are only used at 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // start. If this invariant doesn't hold, the register allocator can decide 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to insert a split of a range immediately before the instruction due to an 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // already allocated register needing to be used for the instruction's fixed 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // register constraint. In this case, The register allocator won't see an 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // interference between the split child and the use-at-start (it would if 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the it was just a plain use), so it is free to move the split child into 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the same register that is used for the use-at-start. 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // See https://code.google.com/p/chromium/issues/detail?id=201590 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!(instr->ClobbersRegisters() && 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ClobbersDoubleRegisters(isolate()))) { 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int fixed = 0; 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int used_at_start = 0; 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (UseIterator it(instr); !it.Done(); it.Advance()) { 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->IsUsedAtStart()) ++used_at_start; 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->Output() != NULL) { 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 858b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (TempIterator it(instr); !it.Done(); it.Advance()) { 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand->HasFixedPolicy()) ++fixed; 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(fixed == 0 || used_at_start == 0); 864b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 866b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignPointerMap(instr); 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stress_environments && !instr->HasEnvironment()) { 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = AssignEnvironment(instr); 872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chunk_->AddInstruction(instr, current_block_); 874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CreateLazyBailoutForCall(current_block_, instr, hydrogen_val); 876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LGoto(instr->FirstSuccessor()); 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) { 8853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LInstruction* result = new (zone()) LPrologue(); 886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (info_->scope()->NeedsContext()) { 8873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch result = MarkAsCall(result, instr); 8883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 8893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return result; 890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LDebugBreak(); 895b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 8983fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = value->representation(); 9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HType type = value->type(); 902c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ToBooleanHints expected = instr->expected_input_types(); 903c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (expected == ToBooleanHint::kNone) expected = ToBooleanHint::kAny; 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 908c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (!easy_case && ((!(expected & ToBooleanHint::kSmallInteger) && 909c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch (expected & ToBooleanHint::kNeedsMap)) || 910c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch expected != ToBooleanHint::kAny)) { 911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch branch = AssignEnvironment(branch); 9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return branch; 914b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 9171e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 9191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 9203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpMapAndBranch(value); 921b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 922b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 923b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 924b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); 927b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 928b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 929b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 930b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsElements); 933b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 934b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch( 937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HHasInPrototypeChainAndBranch* instr) { 938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object = UseRegister(instr->object()); 939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* prototype = UseRegister(instr->prototype()); 940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LHasInPrototypeChainAndBranch* result = 941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LHasInPrototypeChainAndBranch(object, prototype); 942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignEnvironment(result); 943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 9463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 9473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseRegister(instr->receiver()); 9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 9513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 955e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* function = UseFixed(instr->function(), rdi); 956e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* receiver = UseFixed(instr->receiver(), rax); 957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* length = UseFixed(instr->length(), rbx); 958e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* elements = UseFixed(instr->elements(), rcx); 9593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LApplyArguments* result = new(zone()) LApplyArguments(function, 960e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch receiver, 961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch length, 962e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch elements); 963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 964b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 965b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 966b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argc = instr->OperandCount(); 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < argc; ++i) { 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* argument = UseOrConstant(instr->argument(i)); 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddInstruction(new(zone()) LPushArgument(argument), instr); 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry( 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreCodeEntry* store_code_entry) { 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* function = UseRegister(store_code_entry->function()); 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LStoreCodeEntry(function, code_object); 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject( 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInnerAllocatedObject* instr) { 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* base_object = UseRegisterAtStart(instr->base_object()); 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister( 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LInnerAllocatedObject(base_object, offset)); 9911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 9921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 9931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 9943fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() 9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? NULL 9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(new(zone()) LThisFunction); 9983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 9993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10011e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasNoUses()) return NULL; 10031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (info()->IsStub()) { 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(new(zone()) LContext, rsi); 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LContext); 10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 1015b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor( 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor* instr) { 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor = instr->descriptor(); 1021f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_EQ(descriptor.GetParameterCount() + 1022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch LCallWithDescriptor::kImplicitRegisterParameterCount, 1023f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch instr->OperandCount()); 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Target 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(target, zone()); 1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Context 1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* op = UseFixed(instr->OperandAt(1), rsi); 1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ops.Add(op, zone()); 1032f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Load register parameters. 1033f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int i = 0; 1034f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (; i < descriptor.GetRegisterParameterCount(); i++) { 1035f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch op = UseFixed(instr->OperandAt( 1036f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch i + LCallWithDescriptor::kImplicitRegisterParameterCount), 1037f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch descriptor.GetRegisterParameter(i)); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ops.Add(op, zone()); 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1040f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Push stack parameters. 1041f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (; i < descriptor.GetParameterCount(); i++) { 1042f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch op = UseAny(instr->OperandAt( 1043f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch i + LCallWithDescriptor::kImplicitRegisterParameterCount)); 1044f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AddInstruction(new (zone()) LPushArgument(op), instr); 1045f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch descriptor, ops, zone()); 10493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { 10503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch result->MarkAsSyntacticTailCall(); 10513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1053b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1054b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1055b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1056257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1058257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 10603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) { 10613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch result->MarkAsSyntacticTailCall(); 10623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1063257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1064257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1065257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1066257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1067b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->op()) { 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFloor: 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFloor(instr); 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathRound: 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathRound(instr); 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFround: 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathFround(instr); 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathAbs: 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathAbs(instr); 107713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case kMathCos: 107813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return DoMathCos(instr); 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathLog: 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathLog(instr); 1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathExp: 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathExp(instr); 108313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case kMathSin: 108413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return DoMathSin(instr); 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathSqrt: 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathSqrt(instr); 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathPowHalf: 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathPowHalf(instr); 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathClz32: 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoMathClz32(instr); 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 1094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 10983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(instr->value()->representation().IsDouble()); 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 11003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (instr->representation().IsInteger32()) { 11013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LMathFloorI* result = new (zone()) LMathFloorI(input); 11023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 11033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 11043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(instr->representation().IsDouble()); 11053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LMathFloorD* result = new (zone()) LMathFloorD(input); 11063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return DefineAsRegister(result); 11073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 11113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(instr->value()->representation().IsDouble()); 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 11133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (instr->representation().IsInteger32()) { 11143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LOperand* temp = FixedTemp(xmm4); 11153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LMathRoundI* result = new (zone()) LMathRoundI(input, temp); 11163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 11173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 11183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK(instr->representation().IsDouble()); 11193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LMathRoundD* result = new (zone()) LMathRoundD(input); 11203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return DefineAsRegister(result); 11213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 1122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegister(instr->value()); 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathFround* result = new (zone()) LMathFround(input); 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 1128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LMathAbs(context, input)); 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->value()->representation(); 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!r.IsDouble()) result = AssignEnvironment(result); 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 114613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), xmm0); 114713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathLog(input), xmm0), 114813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch instr); 1149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathClz32* result = new(zone()) LMathClz32(input); 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(result); 1156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 115813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathCos(HUnaryMathOperation* instr) { 115913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->representation().IsDouble()); 116013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 116113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), xmm0); 116213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathCos(input), xmm0), 116313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch instr); 116413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1165b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 116913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), xmm0); 117013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathExp(input), xmm0), 117113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch instr); 1172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 117413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathSin(HUnaryMathOperation* instr) { 117513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->representation().IsDouble()); 117613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(instr->value()->representation().IsDouble()); 117713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* input = UseFixedDouble(instr->value(), xmm0); 117813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return MarkAsCall(DefineFixedDouble(new (zone()) LMathSin(input), xmm0), 117913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch instr); 118013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 1181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseAtStart(instr->value()); 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LMathSqrt(input)); 1185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathPowHalf* result = new(zone()) LMathPowHalf(input); 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(result); 1192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* constructor = UseFixed(instr->constructor(), rdi); 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCallRuntime* result = new(zone()) LCallRuntime(context); 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::ROR, instr); 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) { 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SHR, instr); 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) { 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SAR, instr); 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) { 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoShift(Token::SHL, instr); 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* right; 1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We don't support tagged immediates, so we request it in a register. 1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseRegisterAtStart(instr->BetterRightOperand()); 1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseOrConstantAtStart(instr->BetterRightOperand()); 1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LBitI(left, right)); 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(instr->op(), instr); 12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch divisor != 1 && divisor != -1)) { 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = FixedTemp(rax); 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(rdx); 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LDivByConstI( 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp1, temp2), rdx); 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseFixed(instr->left(), rax); 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(rdx); 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LDivI( 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp), rax); 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kCanOverflow) || 1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) { 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1307b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByPowerOf2I(instr); 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivByConstI(instr); 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoDivI(instr); 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 13171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::DIV, instr); 13181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 13191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::DIV, instr); 13201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1322b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I( 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsInteger32()); 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = FixedTemp(rax); 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(rdx); 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp3 = 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NULL : TempRegister(); 1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LFlooringDivByConstI(dividend, 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch divisor, 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp1, 1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp2, 1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp3), 1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rdx); 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseFixed(instr->left(), rax); 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(rdx); 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LFlooringDivI( 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp), rax); 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kCanOverflow)) { 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByPowerOf2I(instr); 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivByConstI(instr); 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoFlooringDivI(instr); 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegisterAtStart(instr->left()); 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor)); 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseRegister(instr->left()); 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t divisor = instr->right()->GetInteger32Constant(); 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = FixedTemp(rax); 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(rdx); 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LModByConstI( 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp1, temp2), rax); 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsSmiOrInteger32()); 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* dividend = UseFixed(instr->left(), rax); 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* divisor = UseRegister(instr->right()); 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = FixedTemp(rdx); 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineFixed(new(zone()) LModI( 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dividend, divisor, temp), rdx); 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1443b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RightIsPowerOf2()) { 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoModByPowerOf2I(instr); 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->right()->IsConstant()) { 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoModByConstI(instr); 144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoModI(instr); 145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsDouble()) { 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticD(Token::MOD, instr); 1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DoArithmeticT(Token::MOD, instr); 1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1460b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1465109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch HValue* h_right = instr->BetterRightOperand(); 1466109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LOperand* right = UseOrConstant(h_right); 14673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LMulI* mul = new(zone()) LMulI(left, right); 1468109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int constant_value = 1469109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch h_right->IsConstant() ? HConstant::cast(h_right)->Integer32Value() : 0; 1470109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // |needs_environment| must mirror the cases where LCodeGen::DoMulI calls 1471109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // |DeoptimizeIf|. 1472109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool needs_environment = 1473109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch instr->CheckFlag(HValue::kCanOverflow) || 1474109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch (instr->CheckFlag(HValue::kBailoutOnMinusZero) && 1475109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch (!right->IsConstantOperand() || constant_value <= 0)); 1476109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (needs_environment) { 14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(mul); 14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(mul); 14801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsDouble()) { 14811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::MUL, instr); 14821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 14831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::MUL, instr); 14841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 14921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->left()); 1493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* right; 1494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We don't support tagged immediates, so we request it in a register. 1496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseRegisterAtStart(instr->right()); 1497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch right = UseOrConstantAtStart(instr->right()); 1499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LSubI* sub = new(zone()) LSubI(left, right); 15011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LInstruction* result = DefineSameAsFirst(sub); 15021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->CheckFlag(HValue::kCanOverflow)) { 15031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block result = AssignEnvironment(result); 15041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 15051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return result; 15061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsDouble()) { 15071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::SUB, instr); 15081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 15091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::SUB, instr); 15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmiOrInteger32()) { 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check to see if it would be advantageous to use an lea instruction rather 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // than an add. This is the case when no overflow check is needed and there 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // are multiple uses of the add's inputs, so using a 3-register add will 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // preserve all input values for later uses. 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_lea = LAddI::UseLea(instr); 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_candidate = instr->BetterRightOperand(); 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right; 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We cannot add a tagged immediate to a tagged value, 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // so we request it in a register. 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(right_candidate); 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = use_lea ? UseRegisterOrConstantAtStart(right_candidate) 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseOrConstantAtStart(right_candidate); 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = use_lea ? DefineAsRegister(add) 1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : DefineSameAsFirst(add); 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (can_overflow) { 1539b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch result = AssignEnvironment(result); 1540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return result; 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsExternal()) { 1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(instr->IsConsistentExternalRepresentation()); 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_lea = LAddI::UseLea(instr); 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right_candidate = instr->right(); 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = use_lea 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterOrConstantAtStart(right_candidate) 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseOrConstantAtStart(right_candidate); 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = use_lea 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? DefineAsRegister(add) 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : DefineSameAsFirst(add); 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (instr->representation().IsDouble()) { 1557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DoArithmeticD(Token::ADD, instr); 1558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 1559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return DoArithmeticT(Token::ADD, instr); 1560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = NULL; 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = NULL; 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(instr->representation())); 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(instr->representation())); 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->representation().IsSmi()) { 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->BetterLeftOperand()); 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseAtStart(instr->BetterRightOperand()); 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->representation().IsInteger32()) { 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->BetterLeftOperand()); 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseOrConstantAtStart(instr->BetterRightOperand()); 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left = UseRegisterAtStart(instr->left()); 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right = UseRegisterAtStart(instr->right()); 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LMathMinMax* minmax = new(zone()) LMathMinMax(left, right); 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(minmax); 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->representation().IsDouble()); 1588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We call a C function for double power. It can't trigger a GC. 1589e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We need to use fixed result register for the call. 1590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation exponent_type = instr->right()->representation(); 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* left = UseFixedDouble(instr->left(), xmm2); 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch exponent_type.IsDouble() 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseFixedDouble(instr->right(), xmm1) 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LPower* result = new(zone()) LPower(left, right); 15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm3), instr, 1599e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch CAN_DEOPTIMIZE_EAGERLY); 1600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 16033fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCmpT* result = new(zone()) LCmpT(context, left, right); 16103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 16113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareNumericAndBranch* instr) { 1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = instr->representation(); 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmiOrInteger32()) { 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().Equals(r)); 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().Equals(r)); 16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseOrConstantAtStart(instr->right()); 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(r.IsDouble()); 1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsDouble()); 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsDouble()); 16273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left; 16283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right; 16293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->left()->IsConstant() && instr->right()->IsConstant()) { 16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterOrConstantAtStart(instr->left()); 16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterOrConstantAtStart(instr->right()); 16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterAtStart(instr->left()); 16343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterAtStart(instr->right()); 16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCompareNumericAndBranch(left, right); 16371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 16413fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareObjectEqAndBranch* instr) { 16431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->left()); 1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpObjectEqAndBranch(left, right); 1646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareHoleAndBranch* instr) { 16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LCmpHoleAndBranch(value); 1653257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsStringAndBranch(value, temp); 1661592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1662592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1663592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 16643fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1667b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1669b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 16703fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 16713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HIsUndetectableAndBranch* instr) { 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsUndetectableAndBranch(value, temp); 16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch( 16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch* instr) { 16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->left()->representation().IsTagged()); 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->right()->representation().IsTagged()); 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 16873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCompareAndBranch* result = 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCompareAndBranch(context, left, right); 16893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 1691592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1692592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1693592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 16943fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 16953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch* instr) { 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->value()->representation().IsTagged()); 16973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 16983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasInstanceTypeAndBranch(value); 1699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 17013fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 17023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HClassOfTestAndBranch* instr) { 17033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LClassOfTestAndBranch(value, 17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister(), 17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister()); 1707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1708b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1709b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 17143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* string = UseRegisterAtStart(instr->string()); 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = FLAG_debug_code 1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterAtStart(instr->index()) 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->index()); 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = FLAG_debug_code 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegisterAtStart(instr->value()) 1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->value()); 1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), rsi) : NULL; 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LSeqStringSetChar(context, string, 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index, value); 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_debug_code) { 1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = MarkAsCall(result, instr); 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code && instr->skip_check()) return NULL; 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length = !index->IsConstantOperand() 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseOrConstantAtStart(instr->length()) 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseAtStart(instr->length()); 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LBoundsCheck(index, length); 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_debug_code || !instr->skip_check()) { 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 17465d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 17475d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 17485d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 17491e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 17501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The control instruction marking the end of a block that completed 17511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // abruptly (e.g., threw an exception). There is nothing specific to do. 1752b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1755b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17563fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 17573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 17583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1761257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1762257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // All HForceRepresentation instructions should be eliminated in the 1763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // representation change phase of Hydrogen. 1764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch UNREACHABLE(); 1765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 1766257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1768257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) { 17701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation from = instr->from(); 17711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation to = instr->to(); 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* val = instr->value(); 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (from.IsSmi()) { 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) { 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch from = Representation::Tagged(); 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 17801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (from.IsTagged()) { 17811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsDouble()) { 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi()) { 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 17921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->type().IsSmi() || val->representation().IsSmi()) { 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineSameAsFirst(new(zone()) LSmiUntag(value, false)); 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 17993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool truncating = instr->CanTruncateToInt32(); 18003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1); 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp)); 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (from.IsDouble()) { 18081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsTagged()) { 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 18111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* temp = TempRegister(); 18121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LUnallocated* result_temp = TempRegister(); 18133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagD* result = new(zone()) LNumberTagD(value, temp); 18141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignPointerMap(Define(result, result_temp)); 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineAsRegister(new(zone()) LDoubleToSmi(value))); 18191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsInteger32()); 1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (from.IsInteger32()) { 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 18281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsTagged()) { 1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->CheckFlag(HValue::kCanOverflow)) { 1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LSmiTag(value)); 1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (val->CheckFlag(HInstruction::kUint32)) { 1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = TempRegister(); 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = FixedTemp(xmm1); 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineSameAsFirst(result)); 18381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp1 = SmiValuesAre32Bits() ? NULL : TempRegister(); 1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp2 = SmiValuesAre32Bits() ? NULL : FixedTemp(xmm1); 1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineSameAsFirst(result)); 18441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (to.IsSmi()) { 1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = UseRegister(val); 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 18521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to.IsDouble()); 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (val->CheckFlag(HInstruction::kUint32)) { 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* value = Use(val); 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LInteger32ToDouble(value)); 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 18601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 18621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 1863b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1864b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1865b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1866b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 18681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = new(zone()) LCheckNonSmi(value); 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->value()->type().IsHeapObject()) { 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1875b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 18781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckSmi(value)); 1880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1881b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1882b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoCheckArrayBufferNotNeutered( 1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HCheckArrayBufferNotNeutered* instr) { 1885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* view = UseRegisterAtStart(instr->value()); 1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LCheckArrayBufferNotNeutered* result = 1887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LCheckArrayBufferNotNeutered(view); 1888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignEnvironment(result); 1889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 18931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LCheckInstanceType* result = new(zone()) LCheckInstanceType(value); 1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 1896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 19001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(new(zone()) LCheckValue(value)); 1902b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1904b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 19071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->HasMigrationTarget()) { 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignPointerMap(result); 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1914b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 1918257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value = instr->value(); 1919257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Representation input_rep = value->representation(); 1920257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* reg = UseRegister(value); 1921257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (input_rep.IsDouble()) { 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LClampDToUint8(reg)); 1923257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (input_rep.IsInteger32()) { 19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LClampIToUint8(reg)); 1925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(input_rep.IsSmiOrTagged()); 1927257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Register allocator doesn't (yet) support allocation of double 1928257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // temps. Reserve xmm1 explicitly. 19293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LClampTToUint8* result = new(zone()) LClampTToUint8(reg, 19303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(xmm1)); 1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 1932257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1933257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = info()->IsStub() ? UseFixed(instr->context(), rsi) : NULL; 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone()) LReturn( 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UseFixed(instr->value(), rax), context, parameter_count); 1941b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1942b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 1945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Representation r = instr->representation(); 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsSmi()) { 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantS); 1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsInteger32()) { 19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantI); 1950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (r.IsDouble()) { 1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return DefineAsRegister(new (zone()) LConstantD); 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (r.IsExternal()) { 1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LConstantE); 1954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (r.IsTagged()) { 19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantT); 1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 1957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 1958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1961b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1963b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 1964e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 19653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LLoadContextSlot(context)); 1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 19741e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 1975e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context; 1976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value; 1977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* temp; 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context = UseRegister(instr->context()); 1979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (instr->NeedsWriteBarrier()) { 1980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value = UseTempRegister(instr->value()); 1981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch temp = TempRegister(); 1982e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 1983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value = UseRegister(instr->value()); 1984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch temp = NULL; 1985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp); 1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1991b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1992b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1993b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 19941e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use the special mov rax, moffs64 encoding for external 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // memory accesses with 64-bit word-sized values. 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->access().IsExternalMemory() && 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().offset() == 0 && 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->access().representation().IsSmi() || 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().representation().IsTagged() || 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().representation().IsHeapObject() || 2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().representation().IsExternal())) { 2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = UseRegisterOrConstantAtStart(instr->object()); 2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(new(zone()) LLoadNamedField(obj), rax); 2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 20061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* obj = UseRegisterAtStart(instr->object()); 20073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 20081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 20091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2011b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 2012b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadFunctionPrototype* instr) { 20131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(DefineAsRegister( 20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 2015b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LLoadRoot); 20201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 20211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) { 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We sign extend the dehoisted key at the definition point when the pointer 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // points and should not invoke this function. We can't use STATIC_ASSERT 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // here as the pointer size is 32-bit for x32. 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(kPointerSize == kInt64Size); 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* dehoisted_key_ids = chunk_->GetDehoistedKeyIds(); 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (dehoisted_key_ids->Contains(candidate->id())) return; 2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dehoisted_key_ids->Add(candidate->id()); 2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!candidate->IsPhi()) return; 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < candidate->OperandCount(); ++i) { 2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FindDehoistedKeyDefinitions(candidate->OperandAt(i)); 2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2036b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2037b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2038b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((kPointerSize == kInt64Size && 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation().IsInteger32()) || 2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (kPointerSize == kInt32Size && 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation().IsSmiOrInteger32())); 2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = NULL; 20471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize == kInt64Size) { 2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool clobbers_key = ExternalArrayOpRequiresTemp( 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation(), elements_kind); 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = clobbers_key 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseTempRegister(instr->key()) 2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->key()); 2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 20571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { 2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FindDehoistedKeyDefinitions(instr->key()); 2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 20613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!instr->is_fixed_typed_array()) { 2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj = UseRegisterAtStart(instr->elements()); 2064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = DefineAsRegister(new (zone()) LLoadKeyed(obj, key, nullptr)); 2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsInteger32() && 2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !(IsDoubleOrFloatElementsKind(elements_kind))) || 2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->representation().IsDouble() && 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (IsDoubleOrFloatElementsKind(elements_kind)))); 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner = UseAny(instr->backing_store_owner()); 2073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result = DefineAsRegister( 2074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new (zone()) LLoadKeyed(backing_store, key, backing_store_owner)); 2075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool needs_environment; 2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->is_fixed_typed_array()) { 2079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // see LCodeGen::DoLoadKeyedExternalArray 2080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch needs_environment = elements_kind == UINT32_ELEMENTS && 2081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch !instr->CheckFlag(HInstruction::kUint32); 2082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // see LCodeGen::DoLoadKeyedFixedDoubleArray and 2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // LCodeGen::DoLoadKeyedFixedArray 2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch needs_environment = 2086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->RequiresHoleCheck() || 2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (instr->hole_mode() == CONVERT_HOLE_TO_UNDEFINED && info()->IsStub()); 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 20893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (needs_environment) { 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = AssignEnvironment(result); 2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 2094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = instr->elements_kind(); 20993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { 2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FindDehoistedKeyDefinitions(instr->key()); 2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!instr->is_fixed_typed_array()) { 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->elements()->representation().IsTagged()); 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier = instr->NeedsWriteBarrier(); 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = NULL; 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = NULL; 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation value_representation = instr->value()->representation(); 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value_representation.IsDouble()) { 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value_representation.IsSmiOrTagged() || 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value_representation.IsInteger32()); 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseTempRegister(instr->elements()); 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseTempRegister(instr->key()); 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = UseRegisterAtStart(instr->elements()); 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterOrConstantAtStart(instr->value()); 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LStoreKeyed(object, key, val, nullptr); 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 21323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK( 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsInteger32() && 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !IsDoubleOrFloatElementsKind(elements_kind)) || 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (instr->value()->representation().IsDouble() && 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsDoubleOrFloatElementsKind(elements_kind))); 2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(instr->elements()->representation().IsExternal()); 2139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool val_is_temp_register = elements_kind == UINT8_CLAMPED_ELEMENTS || 2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch elements_kind == FLOAT32_ELEMENTS; 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val = val_is_temp_register ? UseTempRegister(instr->value()) 21428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : UseRegister(instr->value()); 2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* key = NULL; 2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kPointerSize == kInt64Size) { 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = UseRegisterOrConstantAtStart(instr->key()); 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool clobbers_key = ExternalArrayOpRequiresTemp( 2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->key()->representation(), elements_kind); 2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key = clobbers_key 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseTempRegister(instr->key()) 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterOrConstantAtStart(instr->key()); 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* backing_store = UseRegister(instr->elements()); 2154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner = UseAny(instr->backing_store_owner()); 2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return new (zone()) LStoreKeyed(backing_store, key, val, backing_store_owner); 2156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 2157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind( 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr) { 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = TempRegister(); 21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp_reg = TempRegister(); 2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTransitionElementsKind* result = new(zone()) LTransitionElementsKind( 2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object, NULL, new_map_reg, temp_reg); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), rax); 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTransitionElementsKind(object, context, NULL, NULL); 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(result, instr); 21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento( 2179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTrapAllocationMemento* instr) { 2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* object = UseRegister(instr->object()); 2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = TempRegister(); 2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTrapAllocationMemento* result = 2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LTrapAllocationMemento(object, temp); 2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment(result); 2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoMaybeGrowElements(HMaybeGrowElements* instr) { 2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info()->MarkAsDeferredCalling(); 2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object = Use(instr->object()); 2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* elements = Use(instr->elements()); 2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* current_capacity = UseRegisterOrConstant(instr->current_capacity()); 2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements* result = new (zone()) 2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements(context, object, elements, key, current_capacity); 2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DefineFixed(result, rax); 2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return AssignPointerMap(AssignEnvironment(result)); 2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_in_object = instr->access().IsInobject(); 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_external_location = instr->access().IsExternalMemory() && 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->access().offset() == 0; 22071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool needs_write_barrier = instr->NeedsWriteBarrier(); 2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool needs_write_barrier_for_map = instr->has_transition() && 2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->NeedsWriteBarrierForMap(); 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* obj; 2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = is_in_object 2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseTempRegister(instr->object()); 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_external_location) { 2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_in_object); 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!needs_write_barrier); 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!needs_write_barrier_for_map); 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = UseRegisterOrConstant(instr->object()); 2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj = needs_write_barrier_for_map 2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? UseRegister(instr->object()) 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : UseRegisterAtStart(instr->object()); 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_be_constant = instr->value()->IsConstant() && 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(instr->value())->NotInNewSpace() && 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !instr->field_representation().IsDouble(); 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* val; 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (needs_write_barrier) { 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseTempRegister(instr->value()); 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_external_location) { 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseFixed(instr->value(), rax); 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (can_be_constant) { 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterOrConstant(instr->value()); 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (instr->field_representation().IsDouble()) { 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegisterAtStart(instr->value()); 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch val = UseRegister(instr->value()); 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // We only need a scratch register if we have a write barrier or we 22451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // have a store into the properties array (not in-object-property). 2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* temp = (!is_in_object || needs_write_barrier || 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch needs_write_barrier_for_map) ? TempRegister() : NULL; 22481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreNamedField(obj, val, temp); 2250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall( 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DefineFixed(new(zone()) LStringAdd(context, left, right), rax), instr); 2259257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2260257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2261257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 22621e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 226369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* string = UseTempRegister(instr->string()); 226469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharCodeAt* result = 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharCodeAt(context, string, index); 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 2269b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 227244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 227344f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* char_code = UseRegister(instr->value()); 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LStringCharFromCode* result = 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) LStringCharFromCode(context, char_code); 227744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return AssignPointerMap(DefineAsRegister(result)); 227844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 227944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 228044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 2282bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* size = instr->size()->IsConstant() ? UseConstant(instr->size()) 2283bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch : UseRegister(instr->size()); 2284bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (instr->IsAllocationFolded()) { 2285bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* temp = TempRegister(); 2286bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LFastAllocate* result = new (zone()) LFastAllocate(size, temp); 2287bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return DefineAsRegister(result); 2288bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } else { 2289bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch info()->MarkAsDeferredCalling(); 2290bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* context = UseAny(instr->context()); 2291bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* temp = TempRegister(); 2292bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LAllocate* result = new (zone()) LAllocate(context, size, temp); 2293bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return AssignPointerMap(DefineAsRegister(result)); 2294bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(argument_count_ == 0); 2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch allocator_->MarkAsOsrEntry(); 2301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch current_block_->last_environment()->set_ast_id(instr->ast_id()); 23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LOsrEntry); 2303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LParameter* result = new(zone()) LParameter; 2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->kind() == HParameter::STACK_PARAMETER) { 2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsSpilled(result, spill_index); 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(info()->IsStub()); 2313109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CallInterfaceDescriptor descriptor = graph()->descriptor(); 2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = static_cast<int>(instr->index()); 2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Register reg = descriptor.GetRegisterParameter(index); 2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineFixed(result, reg); 2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2318b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2319b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use an index that corresponds to the location in the unoptimized frame, 2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which the optimized frame will subsume. 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int env_index = instr->index(); 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int spill_index = 0; 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->environment()->is_parameter_index(env_index)) { 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = chunk()->GetParameterStackSlot(env_index); 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = env_index - instr->environment()->first_local_index(); 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Retry(kTooManySpillSlotsNeededForOSR); 2332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch spill_index = 0; 2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2334109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch spill_index += StandardFrameConstants::kFixedSlotCount; 23357d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch } 23363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2337b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2338b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2339b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2340b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 2341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // There are no real uses of the arguments object. 2342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // arguments.length and element access are supported directly on 2343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // stack arguments, and any real arguments object use causes a bailout. 2344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // So this value is never used. 2345b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // There are no real uses of a captured object. 2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2357b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsRequiresFrame(); 2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* args = UseRegister(instr->arguments()); 2360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* length; 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* index; 2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->length()->IsConstant() && instr->index()->IsConstant()) { 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch length = UseRegisterOrConstant(instr->length()); 2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index = UseOrConstant(instr->index()); 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch length = UseTempRegister(instr->length()); 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index = Use(instr->index()); 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 2370b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2371b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* value = UseFixed(instr->value(), rbx); 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LTypeof* result = new(zone()) LTypeof(context, value); 2377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 2378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 23813fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 23823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 2383b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2384b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 23851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2386b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->ReplayEnvironment(current_block_->last_environment()); 2388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2389b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2390b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2391b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info()->MarkAsDeferredCalling(); 23943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (instr->is_function_entry()) { 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MarkAsCall(new(zone()) LStackCheck(context), instr); 23973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->is_backwards_branch()); 2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseAny(instr->context()); 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignEnvironment( 2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AssignPointerMap(new(zone()) LStackCheck(context))); 24023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 24071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HEnvironment* outer = current_block_->last_environment(); 2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch outer->set_ast_id(instr->ReturnId()); 24091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HConstant* undefined = graph()->GetConstantUndefined(); 24103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch HEnvironment* inner = outer->CopyForInlining( 24113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr->closure(), instr->arguments_count(), instr->function(), undefined, 24123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch instr->inlining_kind(), instr->syntactic_tail_call_mode()); 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only replay binding of arguments object if it wasn't removed from graph. 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->Bind(instr->arguments_var(), instr->arguments_object()); 24163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->BindContext(instr->closure_context()); 2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inner->set_entry(instr); 24191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block current_block_->UpdateEnvironment(inner); 2420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2423b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2424b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* pop = NULL; 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironment* env = current_block_->last_environment(); 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (env->entry()->arguments_pushed()) { 2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count = env->arguments_environment()->parameter_count(); 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pop = new(zone()) LDrop(argument_count); 2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->argument_delta() == -argument_count); 2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment()-> 24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DiscardInlined(false); 24371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block current_block_->UpdateEnvironment(outer); 2438b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pop; 2440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 24433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LOperand* context = UseFixed(instr->context(), rsi); 24453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->enumerable(), rax); 2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 24473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 24483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 24523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegister(instr->map()); 24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 24543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LForInCacheArray(map))); 24553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 24593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 24603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegisterAtStart(instr->map()); 24613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 24623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 24663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 24673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseTempRegister(instr->index()); 2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LInstruction* result = DefineSameAsFirst(load); 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AssignPointerMap(result); 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 2474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 2475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif // V8_TARGET_ARCH_X64 2477