13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 29fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// Redistribution and use in source and binary forms, with or without 39fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// modification, are permitted provided that the following conditions are 49fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// met: 59fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// 69fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// * Redistributions of source code must retain the above copyright 79fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// notice, this list of conditions and the following disclaimer. 89fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// * Redistributions in binary form must reproduce the above 99fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// copyright notice, this list of conditions and the following 109fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// disclaimer in the documentation and/or other materials provided 119fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// with the distribution. 129fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// * Neither the name of Google Inc. nor the names of its 139fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// contributors may be used to endorse or promote products derived 149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// from this software without specific prior written permission. 159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// 169fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 28b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#include "v8.h" 29b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 30b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#if defined(V8_TARGET_ARCH_X64) 31b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "lithium-allocator-inl.h" 33086aeeaae12517475c22695a200be45495516549Ben Murdoch#include "x64/lithium-x64.h" 34086aeeaae12517475c22695a200be45495516549Ben Murdoch#include "x64/lithium-codegen-x64.h" 359fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 36086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace v8 { 37086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace internal { 389fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 39b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DEFINE_COMPILE(type) \ 40b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void L##type::CompileToNative(LCodeGen* generator) { \ 41b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch generator->Do##type(this); \ 42b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 43b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 44b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DEFINE_COMPILE 45b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 46b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOsrEntry::LOsrEntry() { 47b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < Register::kNumAllocatableRegisters; ++i) { 48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch register_spills_[i] = NULL; 49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; ++i) { 51b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch double_register_spills_[i] = NULL; 52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LOsrEntry::MarkSpilledRegister(int allocation_index, 57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* spill_operand) { 58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(spill_operand->IsStackSlot()); 59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(register_spills_[allocation_index] == NULL); 60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch register_spills_[allocation_index] = spill_operand; 61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LOsrEntry::MarkSpilledDoubleRegister(int allocation_index, 65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* spill_operand) { 66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(spill_operand->IsDoubleStackSlot()); 67b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(double_register_spills_[allocation_index] == NULL); 68b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch double_register_spills_[allocation_index] = spill_operand; 69b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 70b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 71b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG 731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LInstruction::VerifyCall() { 74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Call instructions can use only fixed registers as temporaries and 75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // outputs because all registers are blocked by the calling convention. 76257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Inputs operands must use a fixed register or use-at-start policy or 77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // a non-register policy. 781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(Output() == NULL || 791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LUnallocated::cast(Output())->HasFixedPolicy() || 801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block !LUnallocated::cast(Output())->HasRegisterPolicy()); 813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (UseIterator it(this); !it.Done(); it.Advance()) { 823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(operand->HasFixedPolicy() || 84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch operand->IsUsedAtStart()); 851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (TempIterator it(this); !it.Done(); it.Advance()) { 873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LUnallocated* operand = LUnallocated::cast(it.Current()); 88257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif 921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LInstruction::PrintTo(StringStream* stream) { 95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("%s ", this->Mnemonic()); 961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block PrintOutputOperandTo(stream); 98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch PrintDataTo(stream); 100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (HasEnvironment()) { 102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" "); 103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch environment()->PrintTo(stream); 104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (HasPointerMap()) { 107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" "); 108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pointer_map()->PrintTo(stream); 109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int R, int I, int T> 114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) { 115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("= "); 1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (int i = 0; i < inputs_.length(); i++) { 1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (i > 0) stream->Add(" "); 1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inputs_[i]->PrintTo(stream); 1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int R, int I, int T> 124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) { 1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (int i = 0; i < results_.length(); i++) { 126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (i > 0) stream->Add(" "); 1273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch results_[i]->PrintTo(stream); 128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLabel::PrintDataTo(StringStream* stream) { 133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LGap::PrintDataTo(stream); 134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LLabel* rep = replacement(); 135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (rep != NULL) { 136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" Dead block replaced with B%d", rep->block_id()); 137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 138b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 139b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LGap::IsRedundant() const { 142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < 4; i++) { 143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return false; 145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return true; 149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 152b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGap::PrintDataTo(StringStream* stream) { 153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < 4; i++) { 154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("("); 155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (parallel_moves_[i] != NULL) { 156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch parallel_moves_[i]->PrintDataTo(stream); 157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") "); 159b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticD::Mnemonic() const { 164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (op()) { 165b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::ADD: return "add-d"; 166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::SUB: return "sub-d"; 167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MUL: return "mul-d"; 168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::DIV: return "div-d"; 169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MOD: return "mod-d"; 170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticT::Mnemonic() const { 178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (op()) { 179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::ADD: return "add-t"; 180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::SUB: return "sub-t"; 181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MUL: return "mul-t"; 182b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::MOD: return "mod-t"; 183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch case Token::DIV: return "div-t"; 1841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_AND: return "bit-and-t"; 1851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_OR: return "bit-or-t"; 1861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::BIT_XOR: return "bit-xor-t"; 1871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SHL: return "sal-t"; 1881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SAR: return "sar-t"; 1891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case Token::SHR: return "shr-t"; 190b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 191b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGoto::PrintDataTo(StringStream* stream) { 198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("B%d", block_id()); 199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 201b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 202b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LBranch::PrintDataTo(StringStream* stream) { 203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 205b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCmpIDAndBranch::PrintDataTo(StringStream* stream) { 209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if "); 210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" %s ", Token::String(op())); 212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(1)->PrintTo(stream); 213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsNilAndBranch::PrintDataTo(StringStream* stream) { 218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if "); 219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(kind() == kStrictEquality ? " === " : " == "); 2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(nil() == kNullValue ? "null" : "undefined"); 222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if is_object("); 228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if is_string("); 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if is_smi("); 242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 247257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 248257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("if is_undetectable("); 249257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch InputAt(0)->PrintTo(stream); 250257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 252257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add("if string_compare("); 2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(0)->PrintTo(stream); 2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InputAt(1)->PrintTo(stream); 2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if has_instance_type("); 264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 265b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 268b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 269b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if has_cached_array_index("); 271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 273b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 274b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 275b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 276b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if class_of_test("); 278b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 279b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(", \"%o\") then B%d else B%d", 280b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch *hydrogen()->class_name(), 281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch true_block_id(), 282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch false_block_id()); 283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 287b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("if typeof "); 288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 289b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" == \"%s\" then B%d else B%d", 290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch *hydrogen()->type_literal()->ToCString(), 291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch true_block_id(), false_block_id()); 292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 295b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallConstantFunction::PrintDataTo(StringStream* stream) { 296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("#%d / ", arity()); 297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 300b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LUnaryMathOperation::PrintDataTo(StringStream* stream) { 301b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("/%s ", hydrogen()->OpName()); 302b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 3071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block InputAt(0)->PrintTo(stream); 3081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block stream->Add("[%d]", slot_index()); 309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 311b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch InputAt(0)->PrintTo(stream); 314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("[%d] <- ", slot_index()); 315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch InputAt(1)->PrintTo(stream); 316e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add("= "); 321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch InputAt(0)->PrintTo(stream); 322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stream->Add(" #%d / ", arity()); 323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallKeyed::PrintDataTo(StringStream* stream) { 327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("[rcx] #%d / ", arity()); 328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 330b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 331b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallNamed::PrintDataTo(StringStream* stream) { 332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch SmartArrayPointer<char> name_string = name()->ToCString(); 333b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("%s #%d / ", *name_string, arity()); 334b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 335b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 336b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 337b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallGlobal::PrintDataTo(StringStream* stream) { 338589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch SmartArrayPointer<char> name_string = name()->ToCString(); 339b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("%s #%d / ", *name_string, arity()); 340b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 341b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 342b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 343b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallKnownGlobal::PrintDataTo(StringStream* stream) { 344b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("#%d / ", arity()); 345b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallNew::PrintDataTo(StringStream* stream) { 349b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("= "); 350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch InputAt(0)->PrintTo(stream); 351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" #%d / ", arity()); 352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 355b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch arguments()->PrintTo(stream); 357b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 358b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" length "); 359b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch length()->PrintTo(stream); 360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 361b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" index "); 362b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch index()->PrintTo(stream); 363b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 364b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 365b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 366b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::GetNextSpillIndex(bool is_double) { 367b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return spill_slot_count_++; 368b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 369b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 370b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3711e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLOperand* LChunk::GetNextSpillSlot(bool is_double) { 372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // All stack slots are Double stack slots on x64. 373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Alternatively, at some point, start using half-size 374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // stack slots for int32 values. 375b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int index = GetNextSpillIndex(is_double); 376b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (is_double) { 377b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return LDoubleStackSlot::Create(index); 378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return LStackSlot::Create(index); 380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 381b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 382b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 383b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 384b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunk::MarkEmptyBlocks() { 3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhase phase("L_Mark empty blocks", this); 386b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < graph()->blocks()->length(); ++i) { 387b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* block = graph()->blocks()->at(i); 388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int first = block->first_instruction_index(); 389b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int last = block->last_instruction_index(); 390b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* first_instr = instructions()->at(first); 391b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* last_instr = instructions()->at(last); 392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 393b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LLabel* label = LLabel::cast(first_instr); 394b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (last_instr->IsGoto()) { 395b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LGoto* goto_instr = LGoto::cast(last_instr); 3963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (label->IsRedundant() && 397b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch !label->is_loop_header()) { 398b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch bool can_eliminate = true; 399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = first + 1; i < last && can_eliminate; ++i) { 400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* cur = instructions()->at(i); 401b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (cur->IsGap()) { 402b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LGap* gap = LGap::cast(cur); 403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (!gap->IsRedundant()) { 404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch can_eliminate = false; 405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch can_eliminate = false; 408b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (can_eliminate) { 412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch label->set_replacement(GetLabel(goto_instr->block_id())); 413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintTo(stream); 422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("."); 423e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add(*String::cast(*name())->ToCString()); 424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add(" <- "); 425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintTo(stream); 426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 430b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch object()->PrintTo(stream); 431b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("."); 432b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(*String::cast(*name())->ToCString()); 433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add(" <- "); 434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch value()->PrintTo(stream); 435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 437b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch object()->PrintTo(stream); 440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("["); 441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch key()->PrintTo(stream); 442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch stream->Add("] <- "); 443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value()->PrintTo(stream); 444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 445e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) { 4483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch elements()->PrintTo(stream); 4493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("["); 4503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch key()->PrintTo(stream); 4513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch stream->Add("] <- "); 4523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch value()->PrintTo(stream); 4533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 4543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch object()->PrintTo(stream); 458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("["); 459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch key()->PrintTo(stream); 460b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch stream->Add("] <- "); 461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch value()->PrintTo(stream); 462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object()->PrintTo(stream); 4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) { 4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstructionGap* gap = new(graph_->zone()) LInstructionGap(block); 473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int index = -1; 474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (instr->IsControl()) { 475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instructions_.Add(gap); 476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch index = instructions_.length(); 477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instructions_.Add(instr); 478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch index = instructions_.length(); 480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instructions_.Add(instr); 481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instructions_.Add(gap); 482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (instr->HasPointerMap()) { 484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pointer_maps_.Add(instr->pointer_map()); 485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr->pointer_map()->set_lithium_position(index); 486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLConstantOperand* LChunk::DefineConstantOperand(HConstant* constant) { 491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return LConstantOperand::Create(constant->id()); 492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::GetParameterStackSlot(int index) const { 496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // The receiver is at index 0, the first parameter at index 1, so we 497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // shift all parameter indexes down by the number of parameters, and 498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // make sure they end up negative so they are distinguishable from 499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // spill slots. 500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int result = index - info()->scope()->num_parameters() - 1; 501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(result < 0); 502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return result; 503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// A parameter relative to ebp in the arguments stub. 506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::ParameterAt(int index) { 507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(-1 <= index); // -1 is the receiver. 508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return (1 + info()->scope()->num_parameters() - index) * 509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch kPointerSize; 510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLGap* LChunk::GetGapAt(int index) const { 514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return LGap::cast(instructions_[index]); 515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LChunk::IsGapAt(int index) const { 519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instructions_[index]->IsGap(); 520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::NearestGapPos(int index) const { 524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch while (!IsGapAt(index)) index--; 525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return index; 526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunk::AddGapMove(int index, LOperand* from, LOperand* to) { 530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch GetGapAt(index)->GetOrCreateParallelMove(LGap::START)->AddMove(from, to); 531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochHandle<Object> LChunk::LookupLiteral(LConstantOperand* operand) const { 535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return HConstant::cast(graph_->LookupValue(operand->index()))->handle(); 536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 538b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 539b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochRepresentation LChunk::LookupLiteralRepresentation( 540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LConstantOperand* operand) const { 541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return graph_->LookupValue(operand->index())->representation(); 542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 545086aeeaae12517475c22695a200be45495516549Ben MurdochLChunk* LChunkBuilder::Build() { 546086aeeaae12517475c22695a200be45495516549Ben Murdoch ASSERT(is_unused()); 5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch chunk_ = new(zone()) LChunk(info(), graph()); 5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhase phase("L_Building chunk", chunk_); 549086aeeaae12517475c22695a200be45495516549Ben Murdoch status_ = BUILDING; 550086aeeaae12517475c22695a200be45495516549Ben Murdoch const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 551086aeeaae12517475c22695a200be45495516549Ben Murdoch for (int i = 0; i < blocks->length(); i++) { 552086aeeaae12517475c22695a200be45495516549Ben Murdoch HBasicBlock* next = NULL; 553086aeeaae12517475c22695a200be45495516549Ben Murdoch if (i < blocks->length() - 1) next = blocks->at(i + 1); 554086aeeaae12517475c22695a200be45495516549Ben Murdoch DoBasicBlock(blocks->at(i), next); 555086aeeaae12517475c22695a200be45495516549Ben Murdoch if (is_aborted()) return NULL; 556086aeeaae12517475c22695a200be45495516549Ben Murdoch } 557086aeeaae12517475c22695a200be45495516549Ben Murdoch status_ = DONE; 558086aeeaae12517475c22695a200be45495516549Ben Murdoch return chunk_; 5599fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block} 5609fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 5619fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 562086aeeaae12517475c22695a200be45495516549Ben Murdochvoid LChunkBuilder::Abort(const char* format, ...) { 563086aeeaae12517475c22695a200be45495516549Ben Murdoch if (FLAG_trace_bailout) { 564589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch SmartArrayPointer<char> name( 565589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch info()->shared_info()->DebugName()->ToCString()); 566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch PrintF("Aborting LChunk building in @\"%s\": ", *name); 567086aeeaae12517475c22695a200be45495516549Ben Murdoch va_list arguments; 568086aeeaae12517475c22695a200be45495516549Ben Murdoch va_start(arguments, format); 569086aeeaae12517475c22695a200be45495516549Ben Murdoch OS::VPrint(format, arguments); 570086aeeaae12517475c22695a200be45495516549Ben Murdoch va_end(arguments); 571086aeeaae12517475c22695a200be45495516549Ben Murdoch PrintF("\n"); 5729fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 573086aeeaae12517475c22695a200be45495516549Ben Murdoch status_ = ABORTED; 5749fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block} 5759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 576086aeeaae12517475c22695a200be45495516549Ben Murdoch 577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Register::ToAllocationIndex(reg)); 580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) { 5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch XMMRegister::ToAllocationIndex(reg)); 586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, ToUnallocated(fixed_register)); 591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 593b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 594b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) { 595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, ToUnallocated(reg)); 596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) { 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Use(value, 6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 607b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated::USED_AT_START)); 608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value) { 6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 621b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) { 6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated::USED_AT_START)); 624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : Use(value); 631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 634b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseAtStart(value); 638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 641b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 642b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 643b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseRegister(value); 645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 649b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 650b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 651b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : UseRegisterAtStart(value); 652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 653b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 654b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 655b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAny(HValue* value) { 656b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return value->IsConstant() 657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ? chunk_->DefineConstantOperand(HConstant::cast(value)) 6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 660b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 661b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 663b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (value->EmitAtUses()) { 664b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* instr = HInstruction::cast(value); 665b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch VisitInstruction(instr); 666b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(value->id()); 668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 669b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 670b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 671b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 672b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T> 673b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr, 674b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* result) { 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result->set_virtual_register(current_instruction_->id()); 676b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr->set_result(result); 677b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 678b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 679b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 680b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 681b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T> 682b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsRegister( 683b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LTemplateInstruction<1, I, T>* instr) { 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T> 690b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsSpilled( 691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LTemplateInstruction<1, I, T>* instr, 692b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int index) { 6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 696b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 697b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 698b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T> 699b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineSameAsFirst( 700b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LTemplateInstruction<1, I, T>* instr) { 7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Define(instr, 7023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 703b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 704b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 705b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 706b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T> 707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixed(LTemplateInstruction<1, I, T>* instr, 708b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Register reg) { 709b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Define(instr, ToUnallocated(reg)); 710b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 711b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 712b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 713b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T> 714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixedDouble( 715b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LTemplateInstruction<1, I, T>* instr, 716b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch XMMRegister reg) { 717b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Define(instr, ToUnallocated(reg)); 718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 719b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 720b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 721b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 722b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* hydrogen_env = current_block_->last_environment(); 7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int argument_index_accumulator = 0; 7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_environment(CreateEnvironment(hydrogen_env, 7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch &argument_index_accumulator)); 726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 730b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment( 731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* instr, int ast_id) { 7321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instruction_pending_deoptimization_environment_ == NULL); 733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber); 7341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instruction_pending_deoptimization_environment_ = instr; 735b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pending_deoptimization_ast_id_ = ast_id; 736b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 738b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() { 7411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instruction_pending_deoptimization_environment_ = NULL; 742b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pending_deoptimization_ast_id_ = AstNode::kNoNumber; 743b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 745b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 746b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 747b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* hinstr, 748b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch CanDeoptimize can_deoptimize) { 7491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG 7501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->VerifyCall(); 7511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif 7521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->MarkAsCall(); 753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignPointerMap(instr); 754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hinstr->HasObservableSideEffects()) { 756b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(hinstr->next()->IsSimulate()); 757b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HSimulate* sim = HSimulate::cast(hinstr->next()); 758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = SetInstructionPendingDeoptimizationEnvironment( 759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr, sim->ast_id()); 760b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 761b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 762b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // If instruction does not have side-effects lazy deoptimization 763b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // after the call will try to deoptimize to the point before the call. 764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Thus we still need to attach environment to this call even if 765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // call sequence can not deoptimize eagerly. 766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch bool needs_environment = 7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !hinstr->HasObservableSideEffects(); 769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (needs_environment && !instr->HasEnvironment()) { 770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignEnvironment(instr); 771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 772b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) { 7781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->MarkAsSaveDoubles(); 779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(!instr->HasPointerMap()); 7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->set_pointer_map(new(zone()) LPointerMap(position_)); 786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return instr; 787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::TempRegister() { 7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnallocated* operand = 7923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 7933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch operand->set_virtual_register(allocator_->GetVirtualRegister()); 7943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!allocator_->AllocationOk()) Abort("Not enough virtual registers."); 795b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 797b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 798b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 799b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) { 800b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* operand = ToUnallocated(reg); 8013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(operand->HasFixedPolicy()); 802b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 803b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 804b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 805b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 806b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) { 807b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LUnallocated* operand = ToUnallocated(reg); 8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(operand->HasFixedPolicy()); 809b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return operand; 810b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 811b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 812b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LLabel(instr->block()); 815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 817b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 8183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoSoftDeoptimize(HSoftDeoptimize* instr) { 8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 8203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 8213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LDeoptimize); 825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 826b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 8281e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoShift(Token::Value op, 8291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBitwiseBinaryOperation* instr) { 8301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->representation().IsTagged()) { 8311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->left()->representation().IsTagged()); 8321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->right()->representation().IsTagged()); 8331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseFixed(instr->left(), rdx); 8351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseFixed(instr->right(), rax); 8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = new(zone()) LArithmeticT(op, left, right); 8371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return MarkAsCall(DefineFixed(result, rax), instr); 8381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 8391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsInteger32()); 8413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->left()->representation().IsInteger32()); 8423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->right()->representation().IsInteger32()); 8433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 8441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right_value = instr->right(); 8461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = NULL; 8471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int constant_value = 0; 8481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (right_value->IsConstant()) { 8491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HConstant* constant = HConstant::cast(right_value); 8501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block right = chunk_->DefineConstantOperand(constant); 8511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block constant_value = constant->Integer32Value() & 0x1f; 8521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 8531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block right = UseFixed(right_value, rcx); 8541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 8551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 856257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Shift operations can only deoptimize if we do a logical shift by 0 and 857257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // the result cannot be truncated to int32. 858257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool may_deopt = (op == Token::SHR && constant_value == 0); 859257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool does_deopt = false; 860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (may_deopt) { 861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) { 862257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) { 863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch does_deopt = true; 8641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block break; 8651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 8661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 8671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 8681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LInstruction* result = 8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt)); 871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return does_deopt ? AssignEnvironment(result) : result; 872b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 875b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HArithmeticBinaryOperation* instr) { 877e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->representation().IsDouble()); 878e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->left()->representation().IsDouble()); 879e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->right()->representation().IsDouble()); 880e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(op != Token::MOD); 881e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* left = UseRegisterAtStart(instr->left()); 882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* right = UseRegisterAtStart(instr->right()); 8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DefineSameAsFirst(result); 885b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 886b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 887b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 888b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 889b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HArithmeticBinaryOperation* instr) { 890b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(op == Token::ADD || 891b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch op == Token::DIV || 892b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch op == Token::MOD || 893b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch op == Token::MUL || 894b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch op == Token::SUB); 895b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* left = instr->left(); 896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* right = instr->right(); 897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(left->representation().IsTagged()); 898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(right->representation().IsTagged()); 899b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* left_operand = UseFixed(left, rdx); 900b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* right_operand = UseFixed(right, rax); 9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = 9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LArithmeticT(op, left_operand, right_operand); 903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 904b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 905b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 906b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 908b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(is_building()); 909b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_block_ = block; 910b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch next_block_ = next_block; 911b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (block->IsStartBlock()) { 912b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(graph_->start_environment()); 913b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = 0; 914b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (block->predecessors()->length() == 1) { 915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // We have a single predecessor => copy environment and outgoing 916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // argument count from the predecessor. 917b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(block->phis()->length() == 0); 918b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* pred = block->predecessors()->at(0); 919b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* last_environment = pred->last_environment(); 920b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(last_environment != NULL); 921b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Only copy the environment, if it is later used again. 922b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pred->end()->SecondSuccessor() == NULL) { 923b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(pred->end()->FirstSuccessor() == block); 924b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 925b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 926b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 927b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_environment = last_environment->Copy(); 928b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 929b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 930b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(last_environment); 931b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(pred->argument_count() >= 0); 932b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = pred->argument_count(); 933b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 934b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // We are at a state join => process phis. 935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HBasicBlock* pred = block->predecessors()->at(0); 936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // No need to copy the environment, it cannot be used later. 937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* last_environment = pred->last_environment(); 938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < block->phis()->length(); ++i) { 939b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HPhi* phi = block->phis()->at(i); 940b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_environment->SetValueAt(phi->merged_index(), phi); 941b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 942b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < block->deleted_phis()->length(); ++i) { 943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch last_environment->SetValueAt(block->deleted_phis()->at(i), 944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch graph_->GetConstantUndefined()); 945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 946b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->UpdateEnvironment(last_environment); 947b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Pick up the outgoing argument count of one of the predecessors. 948b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch argument_count_ = pred->argument_count(); 949b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* current = block->first(); 951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int start = chunk_->instructions()->length(); 952b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch while (current != NULL && !is_aborted()) { 953b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Code for constants in registers is generated lazily. 954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (!current->EmitAtUses()) { 955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch VisitInstruction(current); 956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current = current->next(); 958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int end = chunk_->instructions()->length() - 1; 960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (end >= start) { 961b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_first_instruction_index(start); 962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_last_instruction_index(end); 963b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 964b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch block->set_argument_count(argument_count_); 965b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch next_block_ = NULL; 966b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_block_ = NULL; 967b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 968b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 969b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstruction* old_current = current_instruction_; 972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_instruction_ = current; 973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (current->has_position()) position_ = current->position(); 974b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* instr = current->CompileToLithium(this); 975b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (instr != NULL) { 977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignPointerMap(instr); 979b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 980b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (FLAG_stress_environments && !instr->HasEnvironment()) { 981b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch instr = AssignEnvironment(instr); 982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 9833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch instr->set_hydrogen_value(current); 9841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block chunk_->AddInstruction(instr, current_block_); 985b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 986b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch current_instruction_ = old_current; 987b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLEnvironment* LChunkBuilder::CreateEnvironment( 9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* hydrogen_env, 9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int* argument_index_accumulator) { 993b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (hydrogen_env == NULL) return NULL; 994b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LEnvironment* outer = 9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator); 997b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int ast_id = hydrogen_env->ast_id(); 9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(ast_id != AstNode::kNoNumber || 9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->frame_type() != JS_FUNCTION); 1000b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int value_count = hydrogen_env->length(); 10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LEnvironment* result = new(zone()) LEnvironment( 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->closure(), 10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->frame_type(), 10043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ast_id, 10053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hydrogen_env->parameter_count(), 10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch argument_count_, 10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value_count, 10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch outer); 10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int argument_index = *argument_index_accumulator; 1010b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < value_count; ++i) { 1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (hydrogen_env->is_special_index(i)) continue; 1012257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1013b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* value = hydrogen_env->values()->at(i); 1014b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* op = NULL; 1015b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (value->IsArgumentsObject()) { 1016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch op = NULL; 1017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (value->IsPushArgument()) { 10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op = new(zone()) LArgument(argument_index++); 1019b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 1020b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch op = UseAny(value); 1021b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1022b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch result->AddValue(op, value->representation()); 1023b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1024b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (hydrogen_env->frame_type() == JS_FUNCTION) { 10263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *argument_index_accumulator = argument_index; 10273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return result; 1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1032b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1033b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LGoto(instr->FirstSuccessor()->block_id()); 1035b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1036b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1037b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 10383fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 10393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value = instr->value(); 10403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value->EmitAtUses()) { 10413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(value->IsConstant()); 10423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!value->representation().IsDouble()); 10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBasicBlock* successor = HConstant::cast(value)->ToBoolean() 1044257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ? instr->FirstSuccessor() 1045257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : instr->SecondSuccessor(); 10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LGoto(successor->block_id()); 1047c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 10483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LBranch* result = new(zone()) LBranch(UseRegister(value)); 10503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Tagged values that are not known smis or booleans require a 10513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // deoptimization environment. 10523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation rep = value->representation(); 10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HType type = value->type(); 10543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) { 10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(result); 10563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 1058b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1059b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1060b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 10611e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 10621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->value()->representation().IsTagged()); 10631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 10643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpMapAndBranch(value); 1065b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1066b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1067b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1068b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); 1070b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1071b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1072b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1073b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LArgumentsElements); 1075b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1076b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1077b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1078b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 1079e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* left = UseFixed(instr->left(), rax); 1080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* right = UseFixed(instr->right(), rdx); 10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstanceOf* result = new(zone()) LInstanceOf(left, right); 1082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1083b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1084b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1085b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1086b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 1087b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HInstanceOfKnownGlobal* instr) { 1088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LInstanceOfKnownGlobal* result = 10893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(), rax), 10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(rdi)); 1091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1092b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1093b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 10953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 10963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* receiver = UseRegister(instr->receiver()); 10973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseRegisterAtStart(instr->function()); 10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 11003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 1104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* receiver = UseFixed(instr->receiver(), rax); 1106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* length = UseFixed(instr->length(), rbx); 1107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* elements = UseFixed(instr->elements(), rcx); 11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LApplyArguments* result = new(zone()) LApplyArguments(function, 1109e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch receiver, 1110e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch length, 1111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch elements); 1112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 1113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { 11171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ++argument_count_; 11181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* argument = UseOrConstant(instr->argument()); 11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LPushArgument(argument); 11201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 11211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() 11253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? NULL 11263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : DefineAsRegister(new(zone()) LThisFunction); 11273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 11283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11301e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoContext(HContext* instr) { 11313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->HasNoUses() ? NULL : DefineAsRegister(new(zone()) LContext); 11321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 11331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11351e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) { 1136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 11373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LOuterContext(context)); 11383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LDeclareGlobals, instr); 1143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) { 11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGlobalObject); 1148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { 115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* global_object = UseRegisterAtStart(instr->value()); 11533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGlobalReceiver(global_object)); 1154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallConstantFunction( 1158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HCallConstantFunction* instr) { 11591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 11603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, rax), instr); 1161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch argument_count_ -= instr->argument_count(); 11673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInvokeFunction* result = new(zone()) LInvokeFunction(function); 1168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch BuiltinFunctionId op = instr->op(); 11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (op == kMathLog || op == kMathSin || op == kMathCos || op == kMathTan) { 1175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* input = UseFixedDouble(instr->value(), xmm1); 11763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input); 1177e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm1), instr); 1178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 1179e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* input = UseRegisterAtStart(instr->value()); 11803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input); 1181e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch switch (op) { 1182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kMathAbs: 1183e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); 1184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kMathFloor: 1185e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 1186e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kMathRound: 1187e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 1188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kMathSqrt: 1189e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DefineSameAsFirst(result); 1190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch case kMathPowHalf: 1191e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DefineSameAsFirst(result); 1192e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch default: 1193e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UNREACHABLE(); 1194e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return NULL; 1195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { 1201e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->key()->representation().IsTagged()); 1202e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* key = UseFixed(instr->key(), rcx); 1203e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch argument_count_ -= instr->argument_count(); 12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCallKeyed* result = new(zone()) LCallKeyed(key); 1205e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { 12101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallNamed, rax), instr); 1212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { 12161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, rax), instr); 1218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { 12221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, rax), instr); 1224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 12281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* constructor = UseFixed(instr->constructor(), rdi); 12291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 12303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCallNew* result = new(zone()) LCallNew(constructor); 12311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return MarkAsCall(DefineFixed(result, rax), instr); 1232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* function = UseFixed(instr->function(), rdi); 1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch argument_count_ -= instr->argument_count(); 12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCallFunction* result = new(zone()) LCallFunction(function); 1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 12441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, rax), instr); 1246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) { 12501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoShift(Token::SHR, instr); 1251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) { 12551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoShift(Token::SAR, instr); 1256b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1257b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1258b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1259b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) { 12601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoShift(Token::SHL, instr); 1261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->representation().IsInteger32()) { 12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand()); 12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand()); 12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LBitI(left, right)); 12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsTagged()); 12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsTagged()); 12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsTagged()); 12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticT* result = new(zone()) LArithmeticT(instr->op(), left, right); 12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) { 12861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->value()->representation().IsInteger32()); 12871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsInteger32()); 12881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* input = UseRegisterAtStart(instr->value()); 12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LBitNotI* result = new(zone()) LBitNotI(input); 12901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DefineSameAsFirst(result); 1291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 12951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->representation().IsDouble()) { 12961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::DIV, instr); 12971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsInteger32()) { 12981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The temporary operand is necessary to ensure that right is not allocated 12991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // into rdx. 13001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* temp = FixedTemp(rdx); 13011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* dividend = UseFixed(instr->left(), rax); 13021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* divisor = UseRegister(instr->right()); 13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LDivI* result = new(zone()) LDivI(dividend, divisor, temp); 13041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(DefineFixed(result, rax)); 13051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 13061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsTagged()); 13071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::DIV, instr); 13081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1311b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1312b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (instr->representation().IsInteger32()) { 1314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->left()->representation().IsInteger32()); 1315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->right()->representation().IsInteger32()); 131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block LInstruction* result; 131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (instr->HasPowerOf2Divisor()) { 131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!instr->CheckFlag(HValue::kCanBeDivByZero)); 132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* value = UseRegisterAtStart(instr->left()); 13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LModI* mod = 13223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LModI(value, UseOrConstant(instr->right()), NULL); 132344f0eee88ff00398ff7f715fab053374d808c90dSteve Block result = DefineSameAsFirst(mod); 132444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 132544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The temporary operand is necessary to ensure that right is not 132644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // allocated into edx. 132744f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* temp = FixedTemp(rdx); 132844f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* value = UseFixed(instr->left(), rax); 132944f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* divisor = UseRegister(instr->right()); 13303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LModI* mod = new(zone()) LModI(value, divisor, temp); 133144f0eee88ff00398ff7f715fab053374d808c90dSteve Block result = DefineFixed(mod, rdx); 133244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1334e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return (instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch instr->CheckFlag(HValue::kCanBeDivByZero)) 1336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ? AssignEnvironment(result) 1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : result; 1338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else if (instr->representation().IsTagged()) { 1339e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DoArithmeticT(Token::MOD, instr); 1340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 1341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->representation().IsDouble()); 1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We call a C function for double modulo. It can't trigger a GC. 1343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We need to use fixed result register for the call. 1344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // TODO(fschneider): Allow any register as input registers. 1345e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* left = UseFixedDouble(instr->left(), xmm2); 1346e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* right = UseFixedDouble(instr->right(), xmm1); 13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LArithmeticD* result = new(zone()) LArithmeticD(Token::MOD, left, right); 1348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm1), instr); 1349e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) { 13541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->representation().IsInteger32()) { 13551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->left()->representation().IsInteger32()); 13561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->right()->representation().IsInteger32()); 13571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand()); 13581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseOrConstant(instr->MostConstantOperand()); 13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LMulI* mul = new(zone()) LMulI(left, right); 13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->CheckFlag(HValue::kCanOverflow) || 13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AssignEnvironment(mul); 13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(mul); 13651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsDouble()) { 13661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::MUL, instr); 13671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsTagged()); 13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::MUL, instr); 13701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1371b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) { 13751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->representation().IsInteger32()) { 13761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->left()->representation().IsInteger32()); 13771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->right()->representation().IsInteger32()); 13781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->left()); 13791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseOrConstantAtStart(instr->right()); 13803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LSubI* sub = new(zone()) LSubI(left, right); 13811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LInstruction* result = DefineSameAsFirst(sub); 13821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (instr->CheckFlag(HValue::kCanOverflow)) { 13831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block result = AssignEnvironment(result); 13841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 13851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return result; 13861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (instr->representation().IsDouble()) { 13871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticD(Token::SUB, instr); 13881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 13891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsTagged()); 13901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return DoArithmeticT(Token::SUB, instr); 13911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1393b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1394b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1395b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1396b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (instr->representation().IsInteger32()) { 1397b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(instr->left()->representation().IsInteger32()); 1398b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(instr->right()->representation().IsInteger32()); 1399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand()); 1400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand()); 14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAddI* add = new(zone()) LAddI(left, right); 1402b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* result = DefineSameAsFirst(add); 1403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (instr->CheckFlag(HValue::kCanOverflow)) { 1404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch result = AssignEnvironment(result); 1405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return result; 1407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (instr->representation().IsDouble()) { 1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return DoArithmeticD(Token::ADD, instr); 1409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 1410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(instr->representation().IsTagged()); 1411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return DoArithmeticT(Token::ADD, instr); 1412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->representation().IsDouble()); 1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We call a C function for double power. It can't trigger a GC. 1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // We need to use fixed result register for the call. 1421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation exponent_type = instr->right()->representation(); 1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->left()->representation().IsDouble()); 1423e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* left = UseFixedDouble(instr->left(), xmm2); 1424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* right = exponent_type.IsDouble() ? 1425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UseFixedDouble(instr->right(), xmm1) : 1426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#ifdef _WIN64 1427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UseFixed(instr->right(), rdx); 1428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#else 1429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UseFixed(instr->right(), rdi); 1430e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif 14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LPower* result = new(zone()) LPower(left, right); 14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm3), instr, 1433e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch CAN_DEOPTIMIZE_EAGERLY); 1434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRandom(HRandom* instr) { 14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->representation().IsDouble()); 14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->global_object()->representation().IsTagged()); 14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef _WIN64 14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* global_object = UseFixed(instr->global_object(), rcx); 14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#else 14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* global_object = UseFixed(instr->global_object(), rdi); 14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LRandom* result = new(zone()) LRandom(global_object); 14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixedDouble(result, xmm1), instr); 14473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14503fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 14513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->left()->representation().IsTagged()); 14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->right()->representation().IsTagged()); 14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 14553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCmpT* result = new(zone()) LCmpT(left, right); 14563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 14573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 14583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareIDAndBranch( 14613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareIDAndBranch* instr) { 14621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation r = instr->GetInputRepresentation(); 14631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (r.IsInteger32()) { 14641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->left()->representation().IsInteger32()); 14651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->right()->representation().IsInteger32()); 14663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 14671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseOrConstantAtStart(instr->right()); 14683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpIDAndBranch(left, right); 14693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 14703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(r.IsDouble()); 14711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->left()->representation().IsDouble()); 14721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->right()->representation().IsDouble()); 14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left; 14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right; 14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->left()->IsConstant() && instr->right()->IsConstant()) { 14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterOrConstantAtStart(instr->left()); 14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterOrConstantAtStart(instr->right()); 14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch left = UseRegisterAtStart(instr->left()); 14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch right = UseRegisterAtStart(instr->right()); 14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpIDAndBranch(left, right); 14831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 14873fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 14883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareObjectEqAndBranch* instr) { 14891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* left = UseRegisterAtStart(instr->left()); 14901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* right = UseRegisterAtStart(instr->right()); 14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpObjectEqAndBranch(left, right); 1492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 14953fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareConstantEqAndBranch( 14963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareConstantEqAndBranch* instr) { 14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LCmpConstantEqAndBranch(value); 1499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsNilAndBranch(HIsNilAndBranch* instr) { 15031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->value()->representation().IsTagged()); 15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = instr->kind() == kStrictEquality ? NULL : TempRegister(); 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsNilAndBranch(UseRegisterAtStart(instr->value()), temp); 1506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 15093fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->value()->representation().IsTagged()); 15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value())); 15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsStringAndBranch(value, temp); 1520592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1521592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1522592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 15233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 15241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->value()->representation().IsTagged()); 15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 15293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 15303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HIsUndetectableAndBranch* instr) { 1531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(instr->value()->representation().IsTagged()); 15323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 15333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp = TempRegister(); 15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsUndetectableAndBranch(value, temp); 15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch( 15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch* instr) { 15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->left()->representation().IsTagged()); 15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(instr->right()->representation().IsTagged()); 15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* left = UseFixed(instr->left(), rdx); 15443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* right = UseFixed(instr->right(), rax); 15453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCompareAndBranch* result = 15463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LStringCompareAndBranch(left, right); 15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(result, instr); 1549592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1550592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1551592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 15523fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 15533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch* instr) { 1554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasInstanceTypeAndBranch(value); 1557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 1558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1560e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 1561e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HGetCachedArrayIndex* instr) { 1562e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 1563e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 1564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 1566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 15693fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 15703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasCachedArrayIndexAndBranch* instr) { 1571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LHasCachedArrayIndexAndBranch(value); 1574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 15773fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 15783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HClassOfTestAndBranch* instr) { 15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LClassOfTestAndBranch(value, 15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister(), 15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister()); 1583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1584b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1585b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) { 15871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* array = UseRegisterAtStart(instr->value()); 15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LJSArrayLength(array)); 1589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 159269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochLInstruction* LChunkBuilder::DoFixedArrayBaseLength( 159369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HFixedArrayBaseLength* instr) { 15941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* array = UseRegisterAtStart(instr->value()); 15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array)); 1596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 15993fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoElementsKind(HElementsKind* instr) { 16003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* object = UseRegisterAtStart(instr->value()); 16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LElementsKind(object)); 16023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) { 1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* object = UseRegister(instr->value()); 16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LValueOf* result = new(zone()) LValueOf(object); 16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(result); 16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->value(), rax); 16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LDateField* result = new LDateField(object, instr->index()); 16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 16165d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 16175d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 16185d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterOrConstantAtStart(instr->index()); 16213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* length = Use(instr->length()); 16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LBoundsCheck(value, length)); 16231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 16241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16261e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 16271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The control instruction marking the end of a block that completed 16281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // abruptly (e.g., threw an exception). There is nothing specific to do. 1629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoThrow(HThrow* instr) { 16341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseFixed(instr->value(), rax); 16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LThrow(value), instr); 1636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 16393fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 16403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 16413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1644257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1645257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // All HForceRepresentation instructions should be eliminated in the 1646257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // representation change phase of Hydrogen. 1647257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch UNREACHABLE(); 1648257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 1649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1650257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) { 16531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation from = instr->from(); 16541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Representation to = instr->to(); 16551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (from.IsTagged()) { 16561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsDouble()) { 16571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegister(instr->value()); 16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberUntagD* res = new(zone()) LNumberUntagD(value); 16591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(DefineAsRegister(res)); 16601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 16611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(to.IsInteger32()); 16621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegister(instr->value()); 16631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool needs_check = !instr->value()->type().IsSmi(); 16641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (needs_check) { 16653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool truncating = instr->CanTruncateToInt32(); 16663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1); 16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTaggedToI* res = new(zone()) LTaggedToI(value, xmm_temp); 16681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(DefineSameAsFirst(res)); 16691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LSmiUntag(value, needs_check)); 16711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (from.IsDouble()) { 16741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsTagged()) { 16751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegister(instr->value()); 16761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* temp = TempRegister(); 16771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Make sure that temp and result_temp are different registers. 16791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LUnallocated* result_temp = TempRegister(); 16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagD* result = new(zone()) LNumberTagD(value, temp); 16811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignPointerMap(Define(result, result_temp)); 16821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 16831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(to.IsInteger32()); 1684e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value = UseRegister(instr->value()); 16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister(new(zone()) LDoubleToI(value))); 16861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else if (from.IsInteger32()) { 16881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (to.IsTagged()) { 16891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* val = instr->value(); 16901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegister(val); 16911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (val->HasRange() && val->range()->IsInSmiRange()) { 16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LSmiTag(value)); 16931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LNumberTagI* result = new(zone()) LNumberTagI(value); 16951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result))); 16961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } else { 16981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(to.IsDouble()); 16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = Use(instr->value()); 17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LInteger32ToDouble(value)); 17011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 17021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 17031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 1704b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1705b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1706b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1708b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) { 17091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckNonSmi(value)); 1711b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1712b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1713b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 17151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCheckInstanceType* result = new(zone()) LCheckInstanceType(value); 17171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(result); 1718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1719b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1720b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1721b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) { 17221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* temp = TempRegister(); 17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp); 17241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(result); 1725b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 17291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckSmi(value)); 1731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1732b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) { 17351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckFunction(value)); 1737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1738b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckMap(HCheckMap* instr) { 17411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* value = UseRegisterAtStart(instr->value()); 17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LCheckMap* result = new(zone()) LCheckMap(value); 17431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(result); 1744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1745b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1746b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 1748257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value = instr->value(); 1749257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Representation input_rep = value->representation(); 1750257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* reg = UseRegister(value); 1751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (input_rep.IsDouble()) { 17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LClampDToUint8(reg, 1753257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch TempRegister())); 1754257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (input_rep.IsInteger32()) { 17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LClampIToUint8(reg)); 1756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 1757257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(input_rep.IsTagged()); 1758257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Register allocator doesn't (yet) support allocation of double 1759257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // temps. Reserve xmm1 explicitly. 17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LClampTToUint8* result = new(zone()) LClampTToUint8(reg, 17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TempRegister(), 17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedTemp(xmm1)); 1763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return AssignEnvironment(DefineSameAsFirst(result)); 1764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1766257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LReturn(UseFixed(instr->value(), rax)); 1770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1772b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 1774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Representation r = instr->representation(); 1775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (r.IsInteger32()) { 17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantI); 1777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (r.IsDouble()) { 1778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LOperand* temp = TempRegister(); 17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantD(temp)); 1780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else if (r.IsTagged()) { 17813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LConstantT); 1782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 1783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch UNREACHABLE(); 1784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 1785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17898b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 17913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() 17921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ? AssignEnvironment(DefineAsRegister(result)) 17931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : DefineAsRegister(result); 1794b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1795b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 17978b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 17988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch LOperand* global_object = UseFixed(instr->global_object(), rax); 17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadGlobalGeneric* result = new(zone()) LLoadGlobalGeneric(global_object); 18008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 18018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 18028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 18038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 18048b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 18053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegister(instr->value()); 18063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Use a temp to avoid reloading the cell value address in the case where 18073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // we perform a hole check. 18083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() 18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 18103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : new(zone()) LStoreGlobalCell(value, NULL); 1811b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1812b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 18148b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) { 18158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch LOperand* global_object = UseFixed(instr->global_object(), rdx); 18168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch LOperand* value = UseFixed(instr->value(), rax); 18173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStoreGlobalGeneric* result = new(zone()) LStoreGlobalGeneric(global_object, 18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value); 18198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return MarkAsCall(result, instr); 18208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 18218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 18228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 1824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context = UseRegisterAtStart(instr->value()); 18253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = 18263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DefineAsRegister(new(zone()) LLoadContextSlot(context)); 18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result; 1828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 18311e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* context; 1833e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value; 1834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* temp; 1835e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (instr->NeedsWriteBarrier()) { 1836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch context = UseTempRegister(instr->context()); 1837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value = UseTempRegister(instr->value()); 1838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch temp = TempRegister(); 1839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 1840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch context = UseRegister(instr->context()); 1841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch value = UseRegister(instr->value()); 1842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch temp = NULL; 1843e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp); 18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result; 1846b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1847b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1848b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 18491e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 18501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsTagged()); 18511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* obj = UseRegisterAtStart(instr->object()); 18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 18531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 18541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 185644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic( 185744f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadNamedFieldPolymorphic* instr) { 185844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(instr->representation().IsTagged()); 185944f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (instr->need_generic()) { 186044f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* obj = UseFixed(instr->object(), rax); 18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadNamedFieldPolymorphic* result = 18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadNamedFieldPolymorphic(obj); 186344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return MarkAsCall(DefineFixed(result, rax), instr); 186444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 186544f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* obj = UseRegisterAtStart(instr->object()); 18663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadNamedFieldPolymorphic* result = 18673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadNamedFieldPolymorphic(obj); 186844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return AssignEnvironment(DefineAsRegister(result)); 186944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 187044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 187144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 187244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 18741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* object = UseFixed(instr->object(), rax); 18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(object); 18761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return MarkAsCall(DefineFixed(result, rax), instr); 1877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 1881b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadFunctionPrototype* instr) { 18821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return AssignEnvironment(DefineAsRegister( 18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 1884b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1885b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1886b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1887b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) { 18881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* input = UseRegisterAtStart(instr->value()); 18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadElements(input)); 18901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 18911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 189344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoLoadExternalArrayPointer( 189444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadExternalArrayPointer* instr) { 18951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* input = UseRegisterAtStart(instr->value()); 18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input)); 1897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1899b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1900b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastElement( 1901b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadKeyedFastElement* instr) { 19021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->representation().IsTagged()); 19031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->key()->representation().IsInteger32()); 19041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* obj = UseRegisterAtStart(instr->object()); 190569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 19063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadKeyedFastElement* result = new(zone()) LLoadKeyedFastElement(obj, key); 19073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->RequiresHoleCheck()) AssignEnvironment(result); 19083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(result); 19091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 19101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19123fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement( 19133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HLoadKeyedFastDoubleElement* instr) { 19143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->representation().IsDouble()); 19153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* elements = UseRegisterAtStart(instr->elements()); 19173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 19183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LLoadKeyedFastDoubleElement* result = 19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadKeyedFastDoubleElement(elements, key); 19203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return AssignEnvironment(DefineAsRegister(result)); 19213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 19223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 192444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement( 192544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement* instr) { 1926589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind = instr->elements_kind(); 1927257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT( 19283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (instr->representation().IsInteger32() && 1929589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (elements_kind != EXTERNAL_FLOAT_ELEMENTS) && 1930589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) || 19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (instr->representation().IsDouble() && 1932589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) || 1933589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (elements_kind == EXTERNAL_DOUBLE_ELEMENTS)))); 19341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->key()->representation().IsInteger32()); 193544f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* external_pointer = UseRegister(instr->external_pointer()); 1936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 193744f0eee88ff00398ff7f715fab053374d808c90dSteve Block LLoadKeyedSpecializedArrayElement* result = 19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key); 193944f0eee88ff00398ff7f715fab053374d808c90dSteve Block LInstruction* load_instr = DefineAsRegister(result); 194044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // An unsigned int array load might overflow and cause a deopt, make sure it 194144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // has an environment. 1942589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ? 194344f0eee88ff00398ff7f715fab053374d808c90dSteve Block AssignEnvironment(load_instr) : load_instr; 1944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1946b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1947b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 1948e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* object = UseFixed(instr->object(), rdx); 1949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* key = UseFixed(instr->key(), rax); 1950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLoadKeyedGeneric* result = new(zone()) LLoadKeyedGeneric(object, key); 1952e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 1953b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastElement( 1957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HStoreKeyedFastElement* instr) { 19581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool needs_write_barrier = instr->NeedsWriteBarrier(); 19591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->value()->representation().IsTagged()); 19601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->object()->representation().IsTagged()); 19611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(instr->key()->representation().IsInteger32()); 19621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* obj = UseTempRegister(instr->object()); 19641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* val = needs_write_barrier 19651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ? UseTempRegister(instr->value()) 19661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : UseRegisterAtStart(instr->value()); 19671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* key = needs_write_barrier 19681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ? UseTempRegister(instr->key()) 19691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : UseRegisterOrConstantAtStart(instr->key()); 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreKeyedFastElement(obj, key, val); 1971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 19743fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement( 19753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStoreKeyedFastDoubleElement* instr) { 19763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->value()->representation().IsDouble()); 19773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->elements()->representation().IsTagged()); 19783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->key()->representation().IsInteger32()); 19793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* elements = UseRegisterAtStart(instr->elements()); 19813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* val = UseTempRegister(instr->value()); 19823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LOperand* key = UseRegisterOrConstantAtStart(instr->key()); 19833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val); 19853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 19863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 198844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement( 198944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HStoreKeyedSpecializedArrayElement* instr) { 1990589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind = instr->elements_kind(); 1991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT( 19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (instr->value()->representation().IsInteger32() && 1993589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (elements_kind != EXTERNAL_FLOAT_ELEMENTS) && 1994589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) || 19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (instr->value()->representation().IsDouble() && 1996589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) || 1997589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch (elements_kind == EXTERNAL_DOUBLE_ELEMENTS)))); 1998e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->external_pointer()->representation().IsExternal()); 1999e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->key()->representation().IsInteger32()); 2000e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2001e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* external_pointer = UseRegister(instr->external_pointer()); 20023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool val_is_temp_register = 2003589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind == EXTERNAL_PIXEL_ELEMENTS || 2004589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind == EXTERNAL_FLOAT_ELEMENTS; 200544f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* val = val_is_temp_register 200644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ? UseTempRegister(instr->value()) 20078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : UseRegister(instr->value()); 2008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* key = UseRegisterOrConstant(instr->key()); 2009e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer, 20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch key, 20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch val); 2013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch} 2014e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2015e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2017e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* object = UseFixed(instr->object(), rdx); 2018e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* key = UseFixed(instr->key(), rcx); 2019e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value = UseFixed(instr->value(), rax); 2020e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2021e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->object()->representation().IsTagged()); 2022e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->key()->representation().IsTagged()); 2023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(instr->value()->representation().IsTagged()); 2024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStoreKeyedGeneric* result = 20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LStoreKeyedGeneric(object, key, value); 2027e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(result, instr); 2028b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind( 20323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr) { 20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->original_map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS && 20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->transitioned_map()->elements_kind() == FAST_ELEMENTS) { 20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = TempRegister(); 20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* temp_reg = TempRegister(); 20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LTransitionElementsKind(object, new_map_reg, temp_reg); 20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(result); 20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->object(), rax); 20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* fixed_object_reg = FixedTemp(rdx); 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* new_map_reg = FixedTemp(rbx); 20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTransitionElementsKind* result = 20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LTransitionElementsKind(object, 20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_map_reg, 20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fixed_object_reg); 20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2054b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 20551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool needs_write_barrier = instr->NeedsWriteBarrier(); 20561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* obj = needs_write_barrier 20581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ? UseTempRegister(instr->object()) 20591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : UseRegisterAtStart(instr->object()); 20601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* val = needs_write_barrier 20621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ? UseTempRegister(instr->value()) 20631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : UseRegister(instr->value()); 20641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // We only need a scratch register if we have a write barrier or we 20661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // have a store into the properties array (not in-object-property). 20671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block LOperand* temp = (!instr->is_in_object() || needs_write_barrier) 20681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ? TempRegister() : NULL; 20691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LStoreNamedField(obj, val, temp); 2071b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2072b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2073b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2074b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2075e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* object = UseFixed(instr->object(), rdx); 2076e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* value = UseFixed(instr->value(), rax); 2077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 20783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStoreNamedGeneric* result = new(zone()) LStoreNamedGeneric(object, value); 2079e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(result, instr); 2080b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2081b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2082b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2084257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* left = UseOrConstantAtStart(instr->left()); 2085257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* right = UseOrConstantAtStart(instr->right()); 20863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LStringAdd(left, right), rax), 20873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr); 2088257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2089257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2090257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 20911e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 209269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* string = UseTempRegister(instr->string()); 209369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch LOperand* index = UseTempRegister(instr->index()); 20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCharCodeAt* result = new(zone()) LStringCharCodeAt(string, index); 2095e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return AssignEnvironment(AssignPointerMap(DefineAsRegister(result))); 2096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2097b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2098b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 209944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 210044f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* char_code = UseRegister(instr->value()); 21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LStringCharFromCode* result = new(zone()) LStringCharFromCode(char_code); 210244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return AssignPointerMap(DefineAsRegister(result)); 210344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 210444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 210544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 21061e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) { 2107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* string = UseRegisterAtStart(instr->value()); 21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsRegister(new(zone()) LStringLength(string)); 21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) { 21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAllocateObject* result = new LAllocateObject(TempRegister()); 21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignPointerMap(DefineAsRegister(result)); 21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFastLiteral(HFastLiteral* instr) { 21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LFastLiteral, rax), instr); 21201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 21211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21235d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen MurdochLInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) { 21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LArrayLiteral, rax), instr); 2125592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 2126592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2127592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 21285d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen MurdochLInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) { 21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LObjectLiteral, rax), instr); 21301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 21311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, rax), instr); 2135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2138b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LFunctionLiteral, rax), instr); 2140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { 21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseAtStart(instr->object()); 21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* key = UseOrConstantAtStart(instr->key()); 21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LDeleteProperty* result = new(zone()) LDeleteProperty(object, key); 2147e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 2148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch allocator_->MarkAsOsrEntry(); 2153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch current_block_->last_environment()->set_ast_id(instr->ast_id()); 21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LOsrEntry); 2155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2159b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int spill_index = chunk()->GetParameterStackSlot(instr->index()); 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LParameter, spill_index); 2161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width. 21667d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch if (spill_index > LUnallocated::kMaxFixedIndex) { 21677d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch Abort("Too many spill slots needed for OSR"); 21687d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch spill_index = 0; 21697d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch } 21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 21751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block argument_count_ -= instr->argument_count(); 21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(new(zone()) LCallStub, rax), instr); 2177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 2181e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // There are no real uses of the arguments object. 2182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // arguments.length and element access are supported directly on 2183e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // stack arguments, and any real arguments object use causes a bailout. 2184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // So this value is never used. 2185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2188b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2189b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 2190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* arguments = UseRegister(instr->arguments()); 2191e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* length = UseTempRegister(instr->length()); 2192e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch LOperand* index = Use(instr->index()); 21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAccessArgumentsAt* result = 21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LAccessArgumentsAt(arguments, length, index); 2195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return AssignEnvironment(DefineAsRegister(result)); 2196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 219944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 220044f0eee88ff00398ff7f715fab053374d808c90dSteve Block LOperand* object = UseFixed(instr->value(), rax); 22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LToFastProperties* result = new(zone()) LToFastProperties(object); 220244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return MarkAsCall(DefineFixed(result, rax), instr); 220344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 220444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 220544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 22073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LTypeof* result = new(zone()) LTypeof(UseAtStart(instr->value())); 2208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 2209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 22123fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 22133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 2214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 22161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 22183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HIsConstructCallAndBranch* instr) { 22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone()) LIsConstructCallAndBranch(TempRegister()); 22201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 22211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEnvironment* env = current_block_->last_environment(); 2225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(env != NULL); 2226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch env->set_ast_id(instr->ast_id()); 2228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch env->Drop(instr->pop_count()); 2230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch for (int i = 0; i < instr->values()->length(); ++i) { 2231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HValue* value = instr->values()->at(i); 2232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (instr->HasAssignedIndexAt(i)) { 2233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch env->Bind(instr->GetAssignedIndexAt(i), value); 2234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } else { 2235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch env->Push(value); 2236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 2237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 2238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // If there is an instruction pending deoptimization environment create a 2240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // lazy bailout instruction to capture the environment. 2241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch if (pending_deoptimization_ast_id_ == instr->ast_id()) { 22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LLazyBailout* lazy_bailout = new(zone()) LLazyBailout; 2243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LInstruction* result = AssignEnvironment(lazy_bailout); 22441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instruction_pending_deoptimization_environment_-> 2245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_deoptimization_environment(result->environment()); 2246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ClearInstructionPendingDeoptimizationEnvironment(); 2247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return result; 2248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 2249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 22553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (instr->is_function_entry()) { 22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(new(zone()) LStackCheck, instr); 22573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 22583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(instr->is_backwards_branch()); 22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(AssignPointerMap(new(zone()) LStackCheck)); 22603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 22651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HEnvironment* outer = current_block_->last_environment(); 22661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HConstant* undefined = graph()->GetConstantUndefined(); 22671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HEnvironment* inner = outer->CopyForInlining(instr->closure(), 22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->arguments_count(), 22691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block instr->function(), 2270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch undefined, 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->call_kind(), 22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch instr->is_construct()); 22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instr->arguments() != NULL) { 22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inner->Bind(instr->arguments(), graph()->GetArgumentsObject()); 22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 22761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block current_block_->UpdateEnvironment(inner); 22771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block chunk_->AddInlinedClosure(instr->closure()); 2278b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2279b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2280b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HEnvironment* outer = current_block_->last_environment()-> 22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DiscardInlined(false); 22851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block current_block_->UpdateEnvironment(outer); 2286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 2287b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2290257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoIn(HIn* instr) { 2291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* key = UseOrConstantAtStart(instr->key()); 2292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LOperand* object = UseOrConstantAtStart(instr->object()); 22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LIn* result = new(zone()) LIn(key, object); 2294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return MarkAsCall(DefineFixed(result, rax), instr); 2295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseFixed(instr->enumerable(), rax); 23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LForInPrepareMap* result = new(zone()) LForInPrepareMap(object); 23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegister(instr->map()); 23073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(DefineAsRegister( 23083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new(zone()) LForInCacheArray(map))); 23093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 23133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* value = UseRegisterAtStart(instr->value()); 23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* map = UseRegisterAtStart(instr->map()); 23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* object = UseRegister(instr->object()); 23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LOperand* index = UseTempRegister(instr->index()); 23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DefineSameAsFirst(new(zone()) LLoadFieldByIndex(object, index)); 23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} } // namespace v8::internal 2327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif // V8_TARGET_ARCH_X64 2329