1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 45d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_X64 8c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 94b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/hydrogen-osr.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/x64/lithium-codegen-x64.h" 125d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 13d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgnamespace v8 { 14d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgnamespace internal { 155d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 16c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#define DEFINE_COMPILE(type) \ 17c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void L##type::CompileToNative(LCodeGen* generator) { \ 18c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org generator->Do##type(this); \ 19c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 20c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) 21c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#undef DEFINE_COMPILE 22c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 23c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG 2583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LInstruction::VerifyCall() { 26160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Call instructions can use only fixed registers as temporaries and 27160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // outputs because all registers are blocked by the calling convention. 28160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Inputs operands must use a fixed register or use-at-start policy or 29160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // a non-register policy. 30e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Output() == NULL || 3183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LUnallocated::cast(Output())->HasFixedPolicy() || 3283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org !LUnallocated::cast(Output())->HasRegisterPolicy()); 33e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (UseIterator it(this); !it.Done(); it.Advance()) { 34e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 35e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() || 36160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org operand->IsUsedAtStart()); 3783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 38e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org for (TempIterator it(this); !it.Done(); it.Advance()) { 39e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 40e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy()); 4183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org } 4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 4383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif 4483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 4583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 46c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) { 47c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("%s ", this->Mnemonic()); 4883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 4983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org PrintOutputOperandTo(stream); 50c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 51c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org PrintDataTo(stream); 52c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 53c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (HasEnvironment()) { 54c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" "); 55c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org environment()->PrintTo(stream); 56c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 57c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 58c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (HasPointerMap()) { 59c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" "); 60c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org pointer_map()->PrintTo(stream); 61c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 62c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 63c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 64c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 6588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) { 660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com stream->Add("= "); 6788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org for (int i = 0; i < InputCount(); i++) { 686d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (i > 0) stream->Add(" "); 694cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org if (InputAt(i) == NULL) { 704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org stream->Add("NULL"); 714cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } else { 724cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org InputAt(i)->PrintTo(stream); 734cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 746d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org } 75c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 76c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 77c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 7888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) { 7988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org if (HasResult()) result()->PrintTo(stream); 80c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 81c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 82c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 83c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) { 84c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LGap::PrintDataTo(stream); 85c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LLabel* rep = replacement(); 86c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (rep != NULL) { 87c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" Dead block replaced with B%d", rep->block_id()); 88c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 89c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 90c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 91c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 92c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgbool LGap::IsRedundant() const { 93c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org for (int i = 0; i < 4; i++) { 94c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) { 95c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return false; 96c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 97c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 98c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 99c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return true; 100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 103c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) { 104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org for (int i = 0; i < 4; i++) { 105c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("("); 106c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (parallel_moves_[i] != NULL) { 107c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org parallel_moves_[i]->PrintDataTo(stream); 108c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 109c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(") "); 110c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 111c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 112c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 113c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 114c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgconst char* LArithmeticD::Mnemonic() const { 115c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org switch (op()) { 116c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::ADD: return "add-d"; 117c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::SUB: return "sub-d"; 118c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::MUL: return "mul-d"; 119c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::DIV: return "div-d"; 120c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::MOD: return "mod-d"; 121c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org default: 122c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org UNREACHABLE(); 123c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 124c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 125c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 126c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 127c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 128c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgconst char* LArithmeticT::Mnemonic() const { 129c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org switch (op()) { 130c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::ADD: return "add-t"; 131c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::SUB: return "sub-t"; 132c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::MUL: return "mul-t"; 133c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::MOD: return "mod-t"; 134c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case Token::DIV: return "div-t"; 13583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::BIT_AND: return "bit-and-t"; 13683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::BIT_OR: return "bit-or-t"; 13783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::BIT_XOR: return "bit-xor-t"; 138e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org case Token::ROR: return "ror-t"; 13983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::SHL: return "sal-t"; 14083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::SAR: return "sar-t"; 14183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org case Token::SHR: return "shr-t"; 142c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org default: 143c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org UNREACHABLE(); 144c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 145c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 146c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 147c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 148c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 14932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const { 15032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return !gen->IsNextEmittedBlock(block_id()); 15132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 15232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 15332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 154895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate<int R> 155895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgbool LTemplateResultInstruction<R>::MustSignExtendResult( 156895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org LPlatformChunk* chunk) const { 157895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org HValue* hvalue = this->hydrogen_value(); 158202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return hvalue != NULL && 159202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org hvalue->representation().IsInteger32() && 160202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org chunk->GetDehoistedKeyIds()->Contains(hvalue->id()); 161895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org} 162895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 163895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 164c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) { 165c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("B%d", block_id()); 166c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 167c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 168c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 169c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) { 170c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("B%d | B%d on ", true_block_id(), false_block_id()); 17156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 172c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 173c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 174c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 175e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) { 176c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if "); 17756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org left()->PrintTo(stream); 178c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" %s ", Token::String(op())); 17956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org right()->PrintTo(stream); 180c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" then B%d else B%d", true_block_id(), false_block_id()); 181c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 182c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 183c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 184c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) { 185c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if is_object("); 18656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 187c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 188c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 189c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 190c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1910ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) { 1920ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add("if is_string("); 19356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 1940ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 1950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 1960ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 1970ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 198c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) { 199c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if is_smi("); 20056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 201c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 202c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 203c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 204c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { 2067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stream->Add("if is_undetectable("); 20756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 2087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2120ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) { 2130ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add("if string_compare("); 21456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org left()->PrintTo(stream); 21556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org right()->PrintTo(stream); 2160ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 2170ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 2180ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 2190ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 220c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { 221c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if has_instance_type("); 22256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 223c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 224c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 225c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 226c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 227c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { 228c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if has_cached_array_index("); 22956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 230c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); 231c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 232c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 233c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 234c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) { 235c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if class_of_test("); 23656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 237c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(", \"%o\") then B%d else B%d", 238c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org *hydrogen()->class_name(), 239c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org true_block_id(), 240c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org false_block_id()); 241c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 242c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 243c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 244c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 245c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("if typeof "); 24656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 247c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" == \"%s\" then B%d else B%d", 248afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org hydrogen()->type_literal()->ToCString().get(), 249c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org true_block_id(), false_block_id()); 250c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 251c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 252c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 253662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) { 254662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(" = "); 255662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org function()->PrintTo(stream); 256662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org stream->Add(".code_entry = "); 257662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org code_object()->PrintTo(stream); 258662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 259662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 260662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 2612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) { 2622bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org stream->Add(" = "); 2632bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org base_object()->PrintTo(stream); 264ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org stream->Add(" + "); 265ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org offset()->PrintTo(stream); 2662bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 2672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 2682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 26926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) { 27026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("= "); 27126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org function()->PrintTo(stream); 27226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add("#%d / ", arity()); 27326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 27426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 27526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 27626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) { 27726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 0; i < InputCount(); i++) { 27826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org InputAt(i)->PrintTo(stream); 27926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org stream->Add(" "); 28026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 281c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("#%d / ", arity()); 282c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 284c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 285c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) { 28656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context()->PrintTo(stream); 28783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org stream->Add("[%d]", slot_index()); 288c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 289c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 290c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) { 29256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org context()->PrintTo(stream); 2933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add("[%d] <- ", slot_index()); 29456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org value()->PrintTo(stream); 2953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 2963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 298160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) { 299160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add("= "); 30056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org function()->PrintTo(stream); 301160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org stream->Add(" #%d / ", arity()); 302160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 303160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 304160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 305c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) { 306c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("= "); 30756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org constructor()->PrintTo(stream); 308c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" #%d / ", arity()); 309c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 310c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 311c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 3124a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) { 3134a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add("= "); 3144a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org constructor()->PrintTo(stream); 3154a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" #%d / ", arity()); 3161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind = hydrogen()->elements_kind(); 3174a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org stream->Add(" (%s) ", ElementsKindToString(kind)); 3184a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 3194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 3204a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 321c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) { 322c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org arguments()->PrintTo(stream); 323c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 324c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" length "); 325c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org length()->PrintTo(stream); 326c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 327c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add(" index "); 328c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org index()->PrintTo(stream); 329c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 330c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 331c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 332c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) { 33308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (kind == DOUBLE_REGISTERS && kDoubleSize == 2 * kPointerSize) { 33408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Skip a slot if for a double-width slot for x32 port. 33508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org spill_slot_count_++; 33608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // The spill slot's address is at rbp - (index + 1) * kPointerSize - 33708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // StandardFrameConstants::kFixedFrameSizeFromFp. kFixedFrameSizeFromFp is 33808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // 2 * kPointerSize, if rbp is aligned at 8-byte boundary, the below "|= 1" 33908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // will make sure the spilled doubles are aligned at 8-byte boundary. 34008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // TODO(haitao): make sure rbp is aligned at 8-byte boundary for x32 port. 34108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org spill_slot_count_ |= 1; 34208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 343c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return spill_slot_count_++; 344c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 345c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 346c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 347c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { 348c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // All stack slots are Double stack slots on x64. 349c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Alternatively, at some point, start using half-size 350c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // stack slots for int32 values. 351c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org int index = GetNextSpillIndex(kind); 352c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org if (kind == DOUBLE_REGISTERS) { 3537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LDoubleStackSlot::Create(index, zone()); 354c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } else { 355e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kind == GENERAL_REGISTERS); 3567028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org return LStackSlot::Create(index, zone()); 357c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 358c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 359c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 360c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 3613a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) { 362c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org object()->PrintTo(stream); 363f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStringStream os; 364f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << hydrogen()->access() << " <- "; 365f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org stream->Add(os.c_str()); 366c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org value()->PrintTo(stream); 367c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 368c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 369c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 3703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) { 3713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org object()->PrintTo(stream); 3723a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add("."); 373afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org stream->Add(String::cast(*name())->ToCString().get()); 3743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org stream->Add(" <- "); 3753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org value()->PrintTo(stream); 3763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 3773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3798e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) { 3808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org elements()->PrintTo(stream); 3818e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("["); 3828e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org key()->PrintTo(stream); 3838e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 384fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d]", base_offset()); 3858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("]"); 3878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 3888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org} 3898e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 3908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 391e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) { 392717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org elements()->PrintTo(stream); 393717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org stream->Add("["); 394717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org key()->PrintTo(stream); 3958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (hydrogen()->IsDehoisted()) { 396fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org stream->Add(" + %d] <-", base_offset()); 3978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } else { 3988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org stream->Add("] <- "); 3998e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 400d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 401d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org if (value() == NULL) { 402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(hydrogen()->IsConstantHoleStore() && 403d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org hydrogen()->value()->representation().IsDouble()); 404d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org stream->Add("<the hole(nan)>"); 405d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } else { 406d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org value()->PrintTo(stream); 407d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org } 408717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org} 409717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 410717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 4113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) { 412c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org object()->PrintTo(stream); 413c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("["); 414c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org key()->PrintTo(stream); 415c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org stream->Add("] <- "); 416c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org value()->PrintTo(stream); 417c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 418c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 419c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 420394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) { 421394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com object()->PrintTo(stream); 422394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com stream->Add(" %p -> %p", *original_map(), *transitioned_map()); 423394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 424394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 425394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 42628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() { 427e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_unused()); 42828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org chunk_ = new(zone()) LPlatformChunk(info(), graph()); 4291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LPhase phase("L_Building chunk", chunk_); 430d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org status_ = BUILDING; 431c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 432c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // If compiling for OSR, reserve space for the unoptimized frame, 433c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which will be subsumed into this frame. 434c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (graph()->has_osr()) { 435c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) { 436c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org chunk_->GetNextSpillIndex(GENERAL_REGISTERS); 437c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 438c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 439c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 440d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org const ZoneList<HBasicBlock*>* blocks = graph()->blocks(); 441d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org for (int i = 0; i < blocks->length(); i++) { 442d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org HBasicBlock* next = NULL; 443d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (i < blocks->length() - 1) next = blocks->at(i + 1); 444d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org DoBasicBlock(blocks->at(i), next); 445d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (is_aborted()) return NULL; 446d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org } 447d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org status_ = DONE; 448d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org return chunk_; 4495d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org} 4505d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 4515d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 452c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) { 453812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER, 454812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Register::ToAllocationIndex(reg)); 455c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 456c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 457c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 458c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) { 459812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, 460812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org XMMRegister::ToAllocationIndex(reg)); 461c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 462c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 463c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 464c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) { 465c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return Use(value, ToUnallocated(fixed_register)); 466c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 467c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 468c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 469c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) { 470c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return Use(value, ToUnallocated(reg)); 471c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 472c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 473c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 474c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) { 475812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 476c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 477c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 478c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 479c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) { 480c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return Use(value, 481812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER, 482c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LUnallocated::USED_AT_START)); 483c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 484c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 485c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 486c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) { 487812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER)); 488c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 489c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 490c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 49171ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.orgLOperand* LChunkBuilder::UseTempRegisterOrConstant(HValue* value) { 49271ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org return value->IsConstant() 49371ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 49471ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org : UseTempRegister(value); 49571ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org} 49671ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org 49771ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org 498c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) { 499812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE)); 500c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 501c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 502c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 503c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) { 504812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Use(value, new(zone()) LUnallocated(LUnallocated::NONE, 505c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LUnallocated::USED_AT_START)); 506c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 507c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 508c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 509c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) { 510c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return value->IsConstant() 511c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 512c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org : Use(value); 513c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 514c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 515c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 516c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) { 517c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return value->IsConstant() 518c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 519c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org : UseAtStart(value); 520c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 521c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 522c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 523c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) { 524c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return value->IsConstant() 525c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 526c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org : UseRegister(value); 527c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 528c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 529c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 530c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) { 531c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return value->IsConstant() 532c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ? chunk_->DefineConstantOperand(HConstant::cast(value)) 533c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org : UseRegisterAtStart(value); 534c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 535c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 536c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 537f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) { 538f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org return chunk_->DefineConstantOperand(HConstant::cast(value)); 539f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org} 540f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 541f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 5420511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comLOperand* LChunkBuilder::UseAny(HValue* value) { 5430511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return value->IsConstant() 5440511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com ? chunk_->DefineConstantOperand(HConstant::cast(value)) 545812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : Use(value, new(zone()) LUnallocated(LUnallocated::ANY)); 5460511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} 5470511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 5480511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com 549c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) { 550c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (value->EmitAtUses()) { 551c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HInstruction* instr = HInstruction::cast(value); 552c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org VisitInstruction(instr); 553c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 554994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org operand->set_virtual_register(value->id()); 555c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return operand; 556c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 557c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 558c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 55926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr, 560c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LUnallocated* result) { 561994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org result->set_virtual_register(current_instruction_->id()); 562c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org instr->set_result(result); 563c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return instr; 564c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 565c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 566c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 567c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister( 56826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 569812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 570812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER)); 571c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 572c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 573c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 574c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled( 57526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, 576c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int index) { 577812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 578812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index)); 579c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 580c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 581c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 582c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst( 58326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr) { 584812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return Define(instr, 585812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT)); 586c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 587c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 588c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 58926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr, 590c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Register reg) { 591c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return Define(instr, ToUnallocated(reg)); 592c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 593c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 594c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 595c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble( 59626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LTemplateResultInstruction<1>* instr, 597c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org XMMRegister reg) { 598c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return Define(instr, ToUnallocated(reg)); 599c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 600c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 601c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 602c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { 603c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HEnvironment* hydrogen_env = current_block_->last_environment(); 604c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int argument_index_accumulator = 0; 605594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org ZoneList<HValue*> objects_to_materialize(0, zone()); 606ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org instr->set_environment(CreateEnvironment( 607ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org hydrogen_env, &argument_index_accumulator, &objects_to_materialize)); 608c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return instr; 609c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 610c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 611c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 612c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, 613c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HInstruction* hinstr, 614c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org CanDeoptimize can_deoptimize) { 615a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsNonDeferredCalling(); 616a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 61783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG 61883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org instr->VerifyCall(); 61983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif 62083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org instr->MarkAsCall(); 621c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org instr = AssignPointerMap(instr); 622c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 623c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // If instruction does not have side-effects lazy deoptimization 624c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // after the call will try to deoptimize to the point before the call. 625c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Thus we still need to attach environment to this call even if 626c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // call sequence can not deoptimize eagerly. 627c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool needs_environment = 628c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) || 629c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org !hinstr->HasObservableSideEffects(); 630c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (needs_environment && !instr->HasEnvironment()) { 631c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org instr = AssignEnvironment(instr); 6324edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org // We can't really figure out if the environment is needed or not. 6334edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org instr->environment()->set_has_been_used(); 634c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 635c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 636c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return instr; 637c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 638c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 639c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 640c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) { 641e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->HasPointerMap()); 64271f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org instr->set_pointer_map(new(zone()) LPointerMap(zone())); 643c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return instr; 644c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 645c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 646c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 647c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLUnallocated* LChunkBuilder::TempRegister() { 648812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LUnallocated* operand = 649812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER); 6502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org int vreg = allocator_->GetVirtualRegister(); 6512bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org if (!allocator_->AllocationOk()) { 652594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister); 65357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org vreg = 0; 6542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org } 6552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org operand->set_virtual_register(vreg); 656c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return operand; 657c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 658c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 659c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 660c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) { 661c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LUnallocated* operand = ToUnallocated(reg); 662e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 663c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return operand; 664c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 665c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 666c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 667c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) { 668c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LUnallocated* operand = ToUnallocated(reg); 669e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(operand->HasFixedPolicy()); 670c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return operand; 671c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 672c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 673c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 674c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) { 675812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LLabel(instr->block()); 676c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 677c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 678c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 67946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) { 68046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value()))); 68146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org} 68246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 68346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 684d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) { 685d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org UNREACHABLE(); 686d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org return NULL; 687d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org} 688d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 689d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org 690c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) { 691812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LDeoptimize); 692c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 693c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 694c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 69583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op, 69683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org HBitwiseBinaryOperation* instr) { 697528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 698e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 699e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 700528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 7012f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 702528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HValue* right_value = instr->right(); 703528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = NULL; 704528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int constant_value = 0; 70570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org bool does_deopt = false; 706528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (right_value->IsConstant()) { 707528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HConstant* constant = HConstant::cast(right_value); 708528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = chunk_->DefineConstantOperand(constant); 709528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org constant_value = constant->Integer32Value() & 0x1f; 71070d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org if (SmiValuesAre31Bits() && instr->representation().IsSmi() && 71170d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org constant_value > 0) { 71270d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org // Left shift can deoptimize if we shift by > 0 and the result 71370d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org // cannot be truncated to smi. 71470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi); 71570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org } 7162f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } else { 717528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org right = UseFixed(right_value, rcx); 7182f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } 7192f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org 720528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // Shift operations can only deoptimize if we do a logical shift by 0 and 721528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org // the result cannot be truncated to int32. 722528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::SHR && constant_value == 0) { 723528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (FLAG_opt_safe_uint32_operations) { 724528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckFlag(HInstruction::kUint32); 725528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 726528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32); 727528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LInstruction* result = 731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt)); 732528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return does_deopt ? AssignEnvironment(result) : result; 733528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 734528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(op, instr); 735528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 736c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 737c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 738c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 739c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op, 740c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HArithmeticBinaryOperation* instr) { 741e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 742e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 743e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 744528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (op == Token::MOD) { 745528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 746528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseFixedDouble(instr->BetterRightOperand(), xmm1); 747528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 748528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return MarkAsCall(DefineSameAsFirst(result), instr); 749528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else { 750528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 751528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* right = UseRegisterAtStart(instr->BetterRightOperand()); 752528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LArithmeticD* result = new(zone()) LArithmeticD(op, left, right); 753528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineSameAsFirst(result); 754528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } 755c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 756c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 757c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 758c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op, 759528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HBinaryOperation* instr) { 7600511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com HValue* left = instr->left(); 7610511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com HValue* right = instr->right(); 762e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(left->representation().IsTagged()); 763e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(right->representation().IsTagged()); 764935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 7650511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com LOperand* left_operand = UseFixed(left, rdx); 7660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com LOperand* right_operand = UseFixed(right, rax); 767812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LArithmeticT* result = 768935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LArithmeticT(op, context, left_operand, right_operand); 7690511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return MarkAsCall(DefineFixed(result, rax), instr); 770c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 771c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 772c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 773c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) { 774e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_building()); 775c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org current_block_ = block; 776c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org next_block_ = next_block; 777c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (block->IsStartBlock()) { 778c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org block->UpdateEnvironment(graph_->start_environment()); 779c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org argument_count_ = 0; 780c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } else if (block->predecessors()->length() == 1) { 781c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // We have a single predecessor => copy environment and outgoing 782c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // argument count from the predecessor. 783e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(block->phis()->length() == 0); 784c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 785c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HEnvironment* last_environment = pred->last_environment(); 786e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(last_environment != NULL); 787c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Only copy the environment, if it is later used again. 788c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (pred->end()->SecondSuccessor() == NULL) { 789e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->end()->FirstSuccessor() == block); 790c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } else { 791c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (pred->end()->FirstSuccessor()->block_id() > block->block_id() || 792c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org pred->end()->SecondSuccessor()->block_id() > block->block_id()) { 793c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org last_environment = last_environment->Copy(); 794c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 795c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 796c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org block->UpdateEnvironment(last_environment); 797e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(pred->argument_count() >= 0); 798c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org argument_count_ = pred->argument_count(); 799c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } else { 800c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // We are at a state join => process phis. 801c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HBasicBlock* pred = block->predecessors()->at(0); 802c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // No need to copy the environment, it cannot be used later. 803c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HEnvironment* last_environment = pred->last_environment(); 804c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org for (int i = 0; i < block->phis()->length(); ++i) { 805c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HPhi* phi = block->phis()->at(i); 806ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org if (phi->HasMergedIndex()) { 807b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org last_environment->SetValueAt(phi->merged_index(), phi); 808b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org } 809c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 810c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org for (int i = 0; i < block->deleted_phis()->length(); ++i) { 811b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org if (block->deleted_phis()->at(i) < last_environment->length()) { 812b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org last_environment->SetValueAt(block->deleted_phis()->at(i), 813b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org graph_->GetConstantUndefined()); 814b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org } 815c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 816c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org block->UpdateEnvironment(last_environment); 817c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Pick up the outgoing argument count of one of the predecessors. 818c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org argument_count_ = pred->argument_count(); 819c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 820c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HInstruction* current = block->first(); 821c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int start = chunk_->instructions()->length(); 822c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org while (current != NULL && !is_aborted()) { 823c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Code for constants in registers is generated lazily. 824c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (!current->EmitAtUses()) { 825c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org VisitInstruction(current); 826c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 827c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org current = current->next(); 828c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 829c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int end = chunk_->instructions()->length() - 1; 830c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (end >= start) { 831c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org block->set_first_instruction_index(start); 832c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org block->set_last_instruction_index(end); 833c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 834c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org block->set_argument_count(argument_count_); 835c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org next_block_ = NULL; 836c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org current_block_ = NULL; 837c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 838c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 839c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 840c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) { 841c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HInstruction* old_current = current_instruction_; 842c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org current_instruction_ = current; 843d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 844d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* instr = NULL; 845d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org if (current->CanReplaceWithDummyUses()) { 846935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (current->OperandCount() == 0) { 847935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) LDummy()); 848935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } else { 849e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!current->OperandAt(0)->IsControlInstruction()); 850935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org instr = DefineAsRegister(new(zone()) 851935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LDummyUse(UseAny(current->OperandAt(0)))); 852935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org } 853d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org for (int i = 1; i < current->OperandCount(); ++i) { 85409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org if (current->OperandAt(i)->IsControlInstruction()) continue; 855d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org LInstruction* dummy = 856d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 857d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org dummy->set_hydrogen_value(current); 858d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org chunk_->AddInstruction(dummy, current_block_); 859d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 860d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } else { 8618d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HBasicBlock* successor; 8628d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org if (current->IsControlInstruction() && 8638d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && 8648d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org successor != NULL) { 8658d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = new(zone()) LGoto(successor); 8668d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } else { 8678d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org instr = current->CompileToLithium(this); 8688d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org } 869d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org } 870d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org 871d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org argument_count_ += current->argument_delta(); 872e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ >= 0); 873c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 874c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (instr != NULL) { 875011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(instr, current); 876011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 877011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 878011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org current_instruction_ = old_current; 879011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org} 880011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 881011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 882011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr, 883011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HInstruction* hydrogen_val) { 884011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Associate the hydrogen instruction first, since we may need it for 885011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. 886011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->set_hydrogen_value(hydrogen_val); 887fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org 888f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG 889011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Make sure that the lithium instruction has either no fixed register 890011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // constraints in temps or the result OR no uses that are only used at 891011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // start. If this invariant doesn't hold, the register allocator can decide 892011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // to insert a split of a range immediately before the instruction due to an 893011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // already allocated register needing to be used for the instruction's fixed 894011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // register constraint. In this case, The register allocator won't see an 895011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // interference between the split child and the use-at-start (it would if 896011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the it was just a plain use), so it is free to move the split child into 897011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // the same register that is used for the use-at-start. 898011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // See https://code.google.com/p/chromium/issues/detail?id=201590 899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (!(instr->ClobbersRegisters() && 900011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr->ClobbersDoubleRegisters(isolate()))) { 901011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int fixed = 0; 902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int used_at_start = 0; 903011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (UseIterator it(instr); !it.Done(); it.Advance()) { 904011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->IsUsedAtStart()) ++used_at_start; 906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->Output() != NULL) { 908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed; 909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (TempIterator it(instr); !it.Done(); it.Advance()) { 911011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LUnallocated* operand = LUnallocated::cast(it.Current()); 912011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (operand->HasFixedPolicy()) ++fixed; 913f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 914e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(fixed == 0 || used_at_start == 0); 915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 916f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif 917f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { 919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignPointerMap(instr); 920011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 921011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (FLAG_stress_environments && !instr->HasEnvironment()) { 922011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instr = AssignEnvironment(instr); 923011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 924011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(instr, current_block_); 925011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org 926011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instr->IsCall()) { 927011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; 928011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* instruction_needing_environment = NULL; 929011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (hydrogen_val->HasObservableSideEffects()) { 930011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org HSimulate* sim = HSimulate::cast(hydrogen_val->next()); 931011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment = instr; 932011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org sim->ReplayEnvironment(current_block_->last_environment()); 933011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org hydrogen_value_for_lazy_bailout = sim; 934c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 935011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); 936011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); 937011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org chunk_->AddInstruction(bailout, current_block_); 938011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org if (instruction_needing_environment != NULL) { 939011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Store the lazy deopt environment with the instruction if needed. 940011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org // Right now it is only used for LInstanceOfKnownGlobal. 941011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org instruction_needing_environment-> 942011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); 943486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 944c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 945c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 946c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 947c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 948c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) { 949d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org return new(zone()) LGoto(instr->FirstSuccessor()); 950c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 951c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 952c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 9534e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) { 9544e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return new(zone()) LDebugBreak(); 9554e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org} 9564e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 9574e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 9584f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 959d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org HValue* value = instr->value(); 9607a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org Representation r = value->representation(); 961f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com HType type = value->type(); 9627a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org ToBooleanStub::Types expected = instr->expected_input_types(); 9637a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); 9647a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org 9657a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || 9667a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org type.IsJSArray() || type.IsHeapNumber() || type.IsString(); 9677a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org LInstruction* branch = new(zone()) LBranch(UseRegister(value)); 9687a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (!easy_case && 9697a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || 9707a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org !expected.IsGeneric())) { 9717a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org branch = AssignEnvironment(branch); 972f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 9737a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return branch; 974c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 975c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 976c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 9770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 978e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 97983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 980812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LCmpMapAndBranch(value); 981c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 982c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 983c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 984c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { 98577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 986812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); 987c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 988c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 989c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 990c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { 99177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 992b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org return DefineAsRegister(new(zone()) LArgumentsElements); 993c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 994c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 995c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 996c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { 9973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* left = UseFixed(instr->left(), rax); 9983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* right = UseFixed(instr->right(), rdx); 999935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1000935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LInstanceOf* result = new(zone()) LInstanceOf(context, left, right); 10013a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 1002c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1003c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1004c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1005c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( 1006c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HInstanceOfKnownGlobal* instr) { 10073a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LInstanceOfKnownGlobal* result = 1008935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->context(), rsi), 1009935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org UseFixed(instr->left(), rax), 1010812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org FixedTemp(rdi)); 10119ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 1012c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1013c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1014c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1015154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 1016154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* receiver = UseRegister(instr->receiver()); 1017154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 1018154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 1019154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org return AssignEnvironment(DefineSameAsFirst(result)); 1020154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org} 1021154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1022154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org 1023c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) { 10243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* function = UseFixed(instr->function(), rdi); 10253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* receiver = UseFixed(instr->receiver(), rax); 10263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* length = UseFixed(instr->length(), rbx); 10273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* elements = UseFixed(instr->elements(), rcx); 1028812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LApplyArguments* result = new(zone()) LApplyArguments(function, 10293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org receiver, 10303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org length, 10313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org elements); 10323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 1033c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1034c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1035c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1036011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) { 1037011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org int argc = instr->OperandCount(); 1038011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org for (int i = 0; i < argc; ++i) { 1039011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org LOperand* argument = UseOrConstant(instr->argument(i)); 1040011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org AddInstruction(new(zone()) LPushArgument(argument), instr); 1041011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org } 1042011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org return NULL; 1043c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1044c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1045c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1046662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry( 1047662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org HStoreCodeEntry* store_code_entry) { 1048662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* function = UseRegister(store_code_entry->function()); 1049662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org LOperand* code_object = UseTempRegister(store_code_entry->code_object()); 1050662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org return new(zone()) LStoreCodeEntry(function, code_object); 1051662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org} 1052662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 1053662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 10542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject( 1055ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org HInnerAllocatedObject* instr) { 1056ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* base_object = UseRegisterAtStart(instr->base_object()); 1057ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org LOperand* offset = UseRegisterOrConstantAtStart(instr->offset()); 1058ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org return DefineAsRegister( 1059ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org new(zone()) LInnerAllocatedObject(base_object, offset)); 10602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org} 10612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 10622bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org 1063d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) { 1064812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return instr->HasNoUses() 1065812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ? NULL 1066812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : DefineAsRegister(new(zone()) LThisFunction); 1067d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 1068d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1069d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 107083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) { 1071935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (instr->HasNoUses()) return NULL; 1072935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 1073935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org if (info()->IsStub()) { 1074935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return DefineFixed(new(zone()) LContext, rsi); 10754cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org } 10764cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 1077935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return DefineAsRegister(new(zone()) LContext); 107883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 107983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 108083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 108156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) { 1082935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1083935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall(new(zone()) LDeclareGlobals(context), instr); 108456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org} 108556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 108656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 108726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction( 108826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallJSFunction* instr) { 108926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* function = UseFixed(instr->function(), rdi); 109026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 109126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallJSFunction* result = new(zone()) LCallJSFunction(function); 109226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 109326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 109426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 109526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 109626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 109726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor( 109826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org HCallWithDescriptor* instr) { 10999aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org CallInterfaceDescriptor descriptor = instr->descriptor(); 110026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 110126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LOperand* target = UseRegisterOrConstantAtStart(instr->target()); 110226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ZoneList<LOperand*> ops(instr->OperandCount(), zone()); 110326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(target, zone()); 110426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org for (int i = 1; i < instr->OperandCount(); i++) { 11059aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* op = 11069aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1)); 110726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org ops.Add(op, zone()); 110826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org } 110926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 111026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org LCallWithDescriptor* result = new(zone()) LCallWithDescriptor( 111126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org descriptor, ops, zone()); 111226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 1113c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1114c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1115c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1116e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache( 1117e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org HTailCallThroughMegamorphicCache* instr) { 1118e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1119e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* receiver_register = 1120e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister()); 1121e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org LOperand* name_register = 1122e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org UseFixed(instr->name(), LoadDescriptor::NameRegister()); 1123e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org // Not marked as call. It can't deoptimize, and it never returns. 1124e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org return new (zone()) LTailCallThroughMegamorphicCache( 1125e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org context, receiver_register, name_register); 1126e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org} 1127e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1128e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org 1129160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { 1130935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1131160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org LOperand* function = UseFixed(instr->function(), rdi); 1132935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LInvokeFunction* result = new(zone()) LInvokeFunction(context, function); 1133160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY); 1134160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 1135160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1136160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 1137c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { 1138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org switch (instr->op()) { 1139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFloor: 1140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFloor(instr); 1141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathRound: 1142dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathRound(instr); 1143dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathFround: 1144dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathFround(instr); 1145dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathAbs: 1146dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathAbs(instr); 1147dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathLog: 1148dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathLog(instr); 1149dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathExp: 1150dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathExp(instr); 1151dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathSqrt: 1152dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathSqrt(instr); 1153dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathPowHalf: 1154dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathPowHalf(instr); 1155dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case kMathClz32: 1156dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DoMathClz32(instr); 1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org default: 1158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org UNREACHABLE(); 1159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return NULL; 11603a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 1161c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1162c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1163c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) { 1165e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathFloor* result = new(zone()) LMathFloor(input); 1167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) { 1172381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1173381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LOperand* temp = FixedTemp(xmm4); 1174381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LMathRound* result = new(zone()) LMathRound(input, temp); 1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return AssignEnvironment(DefineAsRegister(result)); 1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1178e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1179dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) { 1180dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LOperand* input = UseRegister(instr->value()); 1181dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org LMathFround* result = new (zone()) LMathFround(input); 1182dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return DefineAsRegister(result); 1183dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org} 1184dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) { 1187935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseAny(instr->context()); 1188e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 11897a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org LInstruction* result = 11907a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org DefineSameAsFirst(new(zone()) LMathAbs(context, input)); 11917a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org Representation r = instr->value()->representation(); 11927a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result); 11937a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (!r.IsDouble()) result = AssignEnvironment(result); 11947a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return result; 1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) { 1199e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1200e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 12010fdb2a65d0f07bb7f6d6ce2f8337e00e5c9c323dbmeurer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 12024f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org return MarkAsCall(DefineSameAsFirst(new(zone()) LMathLog(input)), instr); 1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) { 1207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LMathClz32* result = new(zone()) LMathClz32(input); 1209f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return DefineAsRegister(result); 1210f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1211f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) { 1214e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1215e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsDouble()); 1216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* value = UseTempRegister(instr->value()); 1217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp1 = TempRegister(); 1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* temp2 = TempRegister(); 1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathExp* result = new(zone()) LMathExp(value, temp1, temp2); 1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineAsRegister(result); 1221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) { 12257e6132b924829c353864933f29124419916db550machenbach@chromium.org LOperand* input = UseAtStart(instr->value()); 12267e6132b924829c353864933f29124419916db550machenbach@chromium.org return DefineAsRegister(new(zone()) LMathSqrt(input)); 1227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) { 1231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LOperand* input = UseRegisterAtStart(instr->value()); 1232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LMathPowHalf* result = new(zone()) LMathPowHalf(input); 1233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return DefineSameAsFirst(result); 1234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1237c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { 1238935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1239378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org LOperand* constructor = UseFixed(instr->constructor(), rdi); 1240935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LCallNew* result = new(zone()) LCallNew(context, constructor); 1241378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 1242c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1243c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1244c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 12454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { 1246935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 12474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org LOperand* constructor = UseFixed(instr->constructor(), rdi); 1248935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LCallNewArray* result = new(zone()) LCallNewArray(context, constructor); 12494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 12504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org} 12514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 12524a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org 1253c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { 1254935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1255c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org LOperand* function = UseFixed(instr->function(), rdi); 1256ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org LCallFunction* call = new(zone()) LCallFunction(context, function); 1257a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return MarkAsCall(DefineFixed(call, rax), instr); 1258c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1259c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1260c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1261c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { 1262935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1263935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LCallRuntime* result = new(zone()) LCallRuntime(context); 1264935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 1265c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1266c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1267c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1268e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) { 1269e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org return DoShift(Token::ROR, instr); 1270e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org} 1271e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1272e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 1273c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) { 127483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org return DoShift(Token::SHR, instr); 1275c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1276c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1277c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1278c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) { 127983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org return DoShift(Token::SAR, instr); 1280c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1281c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1282c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) { 128483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org return DoShift(Token::SHL, instr); 1285c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1286c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1287c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1288c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) { 1289fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1290e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1291e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1292e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32)); 1293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1294906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1295906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand()); 1296812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineSameAsFirst(new(zone()) LBitI(left, right)); 1297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } else { 1298528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(instr->op(), instr); 1299c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org } 1300c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1301c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1302c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1303ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { 1304e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1307ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1308ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1309486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( 1310486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1311486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1312486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || 1313ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && 1314486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org divisor != 1 && divisor != -1)) { 1315486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1316486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1317486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1318ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1319ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1320ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1321bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { 1322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1324e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1325bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1326bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1327bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp1 = FixedTemp(rax); 1328bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp2 = FixedTemp(rdx); 1329486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LDivByConstI( 1330486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp1, temp2), rdx); 1331486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || 1332486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1333486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { 1334486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1335486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1336486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1337bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1338bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1339bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1340ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) { 1341e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1342e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1343e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1344ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseFixed(instr->left(), rax); 1345ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1346ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* temp = FixedTemp(rdx); 1347486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LDivI( 1348486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp), rax); 1349486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1350486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1351486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kCanOverflow) || 1352ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) { 1353486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1354486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1355486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1356ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1357ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1358ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1359c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) { 1360528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1361bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1362bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByPowerOf2I(instr); 1363bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1364bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivByConstI(instr); 1365bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1366bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoDivI(instr); 1367bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1368528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1369528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::DIV, instr); 1370d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } else { 1371d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com return DoArithmeticT(Token::DIV, instr); 1372d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } 1373c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1374c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1375c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1376ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) { 1377ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1378ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1379381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I( 1380381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org dividend, divisor)); 1381381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || 1382381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) { 1383381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1384381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } 1385381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 1386ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1387ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 13884cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org 1389ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { 1390e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsInteger32()); 1391e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1392e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1393bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1394ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1395bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp1 = FixedTemp(rax); 1396bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp2 = FixedTemp(rdx); 13977010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org LOperand* temp3 = 13987010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || 13997010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? 14007010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org NULL : TempRegister(); 1401ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LInstruction* result = 1402bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org DefineFixed(new(zone()) LFlooringDivByConstI(dividend, 1403bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org divisor, 1404bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org temp1, 14057010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org temp2, 14067010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org temp3), 1407bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org rdx); 14087010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org if (divisor == 0 || 14097010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { 14107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org result = AssignEnvironment(result); 14117010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } 14127010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return result; 1413ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1414ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1415ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1416ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { 1417e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1418e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1420ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* dividend = UseFixed(instr->left(), rax); 1421ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1422ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* temp = FixedTemp(rdx); 1423ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineFixed(new(zone()) LFlooringDivI( 1424ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org dividend, divisor, temp), rax); 1425ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1426ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero) || 1427ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org instr->CheckFlag(HValue::kCanOverflow)) { 1428ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org result = AssignEnvironment(result); 1429ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1430ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1431ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org} 1432ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 1433ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org 1434ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { 1435ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1436ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DoFlooringDivByPowerOf2I(instr); 14377010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org } else if (instr->right()->IsConstant()) { 14387010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org return DoFlooringDivByConstI(instr); 1439d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org } else { 1440ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return DoFlooringDivI(instr); 1441d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org } 1442d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org} 1443d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org 1444d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org 1445ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { 1446e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1447e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1448e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1449ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseRegisterAtStart(instr->left()); 1450ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1451486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( 1452486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor)); 1453e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (instr->CheckFlag(HValue::kLeftCanBeNegative) && 1454e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1455486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1456486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1457486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1458ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1459ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1460ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1461bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { 1462e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1463e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1464e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1465bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* dividend = UseRegister(instr->left()); 1466bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org int32_t divisor = instr->right()->GetInteger32Constant(); 1467bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp1 = FixedTemp(rax); 1468bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org LOperand* temp2 = FixedTemp(rdx); 1469486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LModByConstI( 1470486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp1, temp2), rax); 1471486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1472486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1473486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1474486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1475bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org} 1476bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1477bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org 1478ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) { 1479e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsSmiOrInteger32()); 1480e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1481e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1482ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* dividend = UseFixed(instr->left(), rax); 1483ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* divisor = UseRegister(instr->right()); 1484ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* temp = FixedTemp(rdx); 1485486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org LInstruction* result = DefineFixed(new(zone()) LModI( 1486486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org dividend, divisor, temp), rdx); 1487486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org if (instr->CheckFlag(HValue::kCanBeDivByZero) || 1488486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1489486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org result = AssignEnvironment(result); 1490486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org } 1491486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org return result; 1492ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 1493ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1494ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 1495c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) { 1496fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1497bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org if (instr->RightIsPowerOf2()) { 1498bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByPowerOf2I(instr); 1499bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else if (instr->right()->IsConstant()) { 1500bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModByConstI(instr); 1501bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } else { 1502bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org return DoModI(instr); 1503bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org } 1504528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org } else if (instr->representation().IsDouble()) { 1505528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticD(Token::MOD, instr); 15062f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org } else { 1507528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DoArithmeticT(Token::MOD, instr); 15083a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 1509c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1510c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1511c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1512c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) { 1513fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1514e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1515e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1516906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1517906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* right = UseOrConstant(instr->BetterRightOperand()); 1518812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LMulI* mul = new(zone()) LMulI(left, right); 1519f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com if (instr->CheckFlag(HValue::kCanOverflow) || 1520f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com instr->CheckFlag(HValue::kBailoutOnMinusZero)) { 1521f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com AssignEnvironment(mul); 1522f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 1523f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com return DefineSameAsFirst(mul); 1524d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } else if (instr->representation().IsDouble()) { 1525d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com return DoArithmeticD(Token::MUL, instr); 1526d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } else { 1527d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com return DoArithmeticT(Token::MUL, instr); 1528d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com } 1529c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1530c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1531c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1532c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) { 1533fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1534e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1535e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 15360ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 15370ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1538812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LSubI* sub = new(zone()) LSubI(left, right); 15390ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LInstruction* result = DefineSameAsFirst(sub); 15400ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 15410ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org result = AssignEnvironment(result); 15420ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 15430ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return result; 15440ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else if (instr->representation().IsDouble()) { 15450ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return DoArithmeticD(Token::SUB, instr); 15460ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 15470ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return DoArithmeticT(Token::SUB, instr); 15480ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 1549c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1550c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1551c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1552c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) { 1553fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->representation().IsSmiOrInteger32()) { 1554906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Check to see if it would be advantageous to use an lea instruction rather 1555906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // than an add. This is the case when no overflow check is needed and there 1556906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // are multiple uses of the add's inputs, so using a 3-register add will 1557906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // preserve all input values for later uses. 1558906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org bool use_lea = LAddI::UseLea(instr); 1559e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1560e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1561906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand()); 1562906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org HValue* right_candidate = instr->BetterRightOperand(); 1563ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* right; 156470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org if (SmiValuesAre32Bits() && instr->representation().IsSmi()) { 1565ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org // We cannot add a tagged immediate to a tagged value, 1566ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org // so we request it in a register. 1567ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org right = UseRegisterAtStart(right_candidate); 1568ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } else { 1569ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org right = use_lea ? UseRegisterOrConstantAtStart(right_candidate) 1570ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org : UseOrConstantAtStart(right_candidate); 1571ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org } 1572812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LAddI* add = new(zone()) LAddI(left, right); 1573906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org bool can_overflow = instr->CheckFlag(HValue::kCanOverflow); 1574ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = use_lea ? DefineAsRegister(add) 1575ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org : DefineSameAsFirst(add); 1576906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (can_overflow) { 15770511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com result = AssignEnvironment(result); 15780511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } 15790511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return result; 158037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org } else if (instr->representation().IsExternal()) { 1581e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsExternal()); 1582e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsInteger32()); 1583e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!instr->CheckFlag(HValue::kCanOverflow)); 158437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org bool use_lea = LAddI::UseLea(instr); 158537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 158637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org HValue* right_candidate = instr->right(); 158737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LOperand* right = use_lea 158837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ? UseRegisterOrConstantAtStart(right_candidate) 158937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org : UseOrConstantAtStart(right_candidate); 159037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LAddI* add = new(zone()) LAddI(left, right); 159137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org LInstruction* result = use_lea 159237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org ? DefineAsRegister(add) 159337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org : DefineSameAsFirst(add); 159437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return result; 15950511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } else if (instr->representation().IsDouble()) { 159649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org return DoArithmeticD(Token::ADD, instr); 15970511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } else { 15980511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com return DoArithmeticT(Token::ADD, instr); 15990511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com } 1600c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 1601c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1602c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1603c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1604471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) { 1605471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* left = NULL; 1606471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LOperand* right = NULL; 1607e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(instr->representation())); 1608e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(instr->representation())); 1609bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org if (instr->representation().IsSmi()) { 1610bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 1611bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org right = UseAtStart(instr->BetterRightOperand()); 1612bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org } else if (instr->representation().IsInteger32()) { 1613906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org left = UseRegisterAtStart(instr->BetterLeftOperand()); 1614906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org right = UseOrConstantAtStart(instr->BetterRightOperand()); 1615471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } else { 1616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 1617471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org left = UseRegisterAtStart(instr->left()); 1618471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org right = UseRegisterAtStart(instr->right()); 1619471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 1620471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org LMathMinMax* minmax = new(zone()) LMathMinMax(left, right); 1621471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return DefineSameAsFirst(minmax); 1622471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org} 1623471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1624471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1625c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) { 1626e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->representation().IsDouble()); 16279ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org // We call a C function for double power. It can't trigger a GC. 16289ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org // We need to use fixed result register for the call. 16299ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org Representation exponent_type = instr->right()->representation(); 1630e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 16319ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org LOperand* left = UseFixedDouble(instr->left(), xmm2); 16326313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org LOperand* right = 16336313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org exponent_type.IsDouble() 16346313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org ? UseFixedDouble(instr->right(), xmm1) 16356313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent()); 1636812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LPower* result = new(zone()) LPower(left, right); 163764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return MarkAsCall(DefineFixedDouble(result, xmm3), instr, 16389ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org CAN_DEOPTIMIZE_EAGERLY); 1639c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1640c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1641c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 16424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { 1643e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1644e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1645935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 1646394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left = UseFixed(instr->left(), rdx); 1647394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* right = UseFixed(instr->right(), rax); 1648935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LCmpT* result = new(zone()) LCmpT(context, left, right); 16494f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 16504f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org} 16514f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 16524f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 1653e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1654e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org HCompareNumericAndBranch* instr) { 1655fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org Representation r = instr->representation(); 1656c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org if (r.IsSmiOrInteger32()) { 1657e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().Equals(r)); 1658e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().Equals(r)); 1659394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 16600a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org LOperand* right = UseOrConstantAtStart(instr->right()); 1661e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 16624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } else { 1663e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(r.IsDouble()); 1664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsDouble()); 1665e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsDouble()); 1666394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* left; 1667394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* right; 1668394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (instr->left()->IsConstant() && instr->right()->IsConstant()) { 1669394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com left = UseRegisterOrConstantAtStart(instr->left()); 1670394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com right = UseRegisterOrConstantAtStart(instr->right()); 1671394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } else { 1672394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com left = UseRegisterAtStart(instr->left()); 1673394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com right = UseRegisterAtStart(instr->right()); 1674394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 1675e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return new(zone()) LCompareNumericAndBranch(left, right); 16760a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org } 1677c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1678c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1679c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 16804f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 16814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HCompareObjectEqAndBranch* instr) { 16820ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* left = UseRegisterAtStart(instr->left()); 1683b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1684812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LCmpObjectEqAndBranch(left, right); 16857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 16867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 16877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1688c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch( 1689c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org HCompareHoleAndBranch* instr) { 1690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1691528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return new(zone()) LCmpHoleAndBranch(value); 1692c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org} 1693c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org 1694c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org 16950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 16960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org HCompareMinusZeroAndBranch* instr) { 16970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org LOperand* value = UseRegister(instr->value()); 16980cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return new(zone()) LCompareMinusZeroAndBranch(value); 16990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org} 17000cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 17010cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org 17024f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1703e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1704812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value())); 1705c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1706c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1707c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 17080ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) { 1709e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1710812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 17110ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* temp = TempRegister(); 1712812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsStringAndBranch(value, temp); 17130ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17140ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17150ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17164f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { 1717e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1718812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsSmiAndBranch(Use(instr->value())); 1719c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1720c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1721c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 17224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch( 17234f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HIsUndetectableAndBranch* instr) { 1724e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1725812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1726812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* temp = TempRegister(); 1727812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsUndetectableAndBranch(value, temp); 17287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 17297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 17310ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoStringCompareAndBranch( 17320ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry HStringCompareAndBranch* instr) { 17330ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 1734e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->left()->representation().IsTagged()); 1735e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->right()->representation().IsTagged()); 1736935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 17370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* left = UseFixed(instr->left(), rdx); 17380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry LOperand* right = UseFixed(instr->right(), rax); 1739812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LStringCompareAndBranch* result = 1740935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LStringCompareAndBranch(context, left, right); 17410ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17420ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry return MarkAsCall(result, instr); 17430ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry} 17440ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17450ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 17464f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( 17474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HHasInstanceTypeAndBranch* instr) { 1748e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1749812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1750812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LHasInstanceTypeAndBranch(value); 1751c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1752c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1753c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 175449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex( 175549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org HGetCachedArrayIndex* instr) { 1756e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 17578f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 17588f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org 1759812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value)); 176049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org} 176149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 176249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org 17634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( 17644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HHasCachedArrayIndexAndBranch* instr) { 1765e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 1766812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1767812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LHasCachedArrayIndexAndBranch(value); 1768c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1769c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1770c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 17714f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch( 17724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HClassOfTestAndBranch* instr) { 1773812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LOperand* value = UseRegister(instr->value()); 1774812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LClassOfTestAndBranch(value, 1775812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org TempRegister(), 1776812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org TempRegister()); 1777c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1778c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1779c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1780355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) { 1781355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org LOperand* map = UseRegisterAtStart(instr->value()); 1782355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return DefineAsRegister(new(zone()) LMapEnumLength(map)); 1783355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org} 1784355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 1785355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 17864efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) { 17874efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org LOperand* object = UseFixed(instr->value(), rax); 17887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org LDateField* result = new(zone()) LDateField(object, instr->index()); 1789de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 17904efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org} 17914efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 17924efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 1793e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) { 1794e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 1795e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1796e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index)); 1797e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 1798e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1799e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 180032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { 1801e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org LOperand* string = UseRegisterAtStart(instr->string()); 18029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* index = FLAG_debug_code 18039af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ? UseRegisterAtStart(instr->index()) 18049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org : UseRegisterOrConstantAtStart(instr->index()); 18059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* value = FLAG_debug_code 18069af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org ? UseRegisterAtStart(instr->value()) 18079af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org : UseRegisterOrConstantAtStart(instr->value()); 18089af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), rsi) : NULL; 18099af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org LInstruction* result = new(zone()) LSeqStringSetChar(context, string, 18109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org index, value); 18119af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (FLAG_debug_code) { 18129af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org result = MarkAsCall(result, instr); 18139af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 18149af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org return result; 181532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org} 181632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 181732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 1818c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { 1819a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code && instr->skip_check()) return NULL; 1820a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* index = UseRegisterOrConstantAtStart(instr->index()); 1821a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LOperand* length = !index->IsConstantOperand() 1822a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org ? UseOrConstantAtStart(instr->length()) 1823a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org : UseAtStart(instr->length()); 1824a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org LInstruction* result = new(zone()) LBoundsCheck(index, length); 1825a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org if (!FLAG_debug_code || !instr->skip_check()) { 1826a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org result = AssignEnvironment(result); 1827a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org } 1828a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return result; 1829c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1830c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1831c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1832876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( 1833876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org HBoundsCheckBaseIndexInformation* instr) { 1834876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org UNREACHABLE(); 1835876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org return NULL; 1836876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org} 1837876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1838876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org 1839c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) { 1840c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // The control instruction marking the end of a block that completed 1841c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org // abruptly (e.g., threw an exception). There is nothing specific to do. 1842c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org return NULL; 1843c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org} 1844c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1845c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org 1846d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) { 1847d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org return NULL; 1848d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org} 1849d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1850d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 1851c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { 1852c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // All HForceRepresentation instructions should be eliminated in the 1853c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // representation change phase of Hydrogen. 1854c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org UNREACHABLE(); 1855c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org return NULL; 1856c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 1857c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1858c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 1859c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) { 18600ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org Representation from = instr->from(); 18610ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org Representation to = instr->to(); 1862ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org HValue* val = instr->value(); 1863a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (from.IsSmi()) { 1864a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (to.IsTagged()) { 1865ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1866a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1867a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1868a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org from = Representation::Tagged(); 1869a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 18700ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (from.IsTagged()) { 18710ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (to.IsDouble()) { 1872ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1873ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value)); 1874ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1875ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 1876a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1877a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1878a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org if (val->type().IsSmi()) { 1879a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return DefineSameAsFirst(new(zone()) LDummyUse(value)); 1880a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 188153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value))); 18820ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 1883e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 1884662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org if (val->type().IsSmi() || val->representation().IsSmi()) { 1885ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 188653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org return DefineSameAsFirst(new(zone()) LSmiUntag(value, false)); 18877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org } else { 1888ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1889c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org bool truncating = instr->CanTruncateToInt32(); 1890c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1); 1891ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LInstruction* result = 18927a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp)); 18934edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org if (!val->representation().IsSmi()) result = AssignEnvironment(result); 1894ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org return result; 18950ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 18960ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 18970ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else if (from.IsDouble()) { 18980ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (to.IsTagged()) { 1899a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 1900ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 19010ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LOperand* temp = TempRegister(); 19020ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org LUnallocated* result_temp = TempRegister(); 1903812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LNumberTagD* result = new(zone()) LNumberTagD(value, temp); 19040ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org return AssignPointerMap(Define(result, result_temp)); 1905a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1906ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1907a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org return AssignEnvironment( 1908a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org DefineAsRegister(new(zone()) LDoubleToSmi(value))); 19090ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 1910e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsInteger32()); 1911ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 19127a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); 1913ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); 19147a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return result; 19150ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 19160ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else if (from.IsInteger32()) { 1917a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 19180ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (to.IsTagged()) { 1919381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (!instr->CheckFlag(HValue::kCanOverflow)) { 1920ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1921381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return DefineAsRegister(new(zone()) LSmiTag(value)); 1922381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org } else if (val->CheckFlag(HInstruction::kUint32)) { 1923ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1924bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp1 = TempRegister(); 1925bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LOperand* temp2 = FixedTemp(xmm1); 1926bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); 19277a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return AssignPointerMap(DefineSameAsFirst(result)); 19280ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 1929ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = UseRegister(val); 1930e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org LOperand* temp1 = SmiValuesAre32Bits() ? NULL : TempRegister(); 1931e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org LOperand* temp2 = SmiValuesAre32Bits() ? NULL : FixedTemp(xmm1); 1932e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); 19337a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return AssignPointerMap(DefineSameAsFirst(result)); 19340ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 1935a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } else if (to.IsSmi()) { 1936a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org LOperand* value = UseRegister(val); 1937381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); 1938381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org if (instr->CheckFlag(HValue::kCanOverflow)) { 1939381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org result = AssignEnvironment(result); 1940a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org } 1941381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org return result; 19420ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } else { 1943e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(to.IsDouble()); 1944ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (val->CheckFlag(HInstruction::kUint32)) { 19457e6132b924829c353864933f29124419916db550machenbach@chromium.org return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val))); 194646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } else { 1947ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org LOperand* value = Use(val); 194846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return DefineAsRegister(new(zone()) LInteger32ToDouble(value)); 194946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org } 19500ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 19510ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 19520ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org UNREACHABLE(); 1953c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 1954c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1955c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1956c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 19571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) { 1958378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 19598f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org LInstruction* result = new(zone()) LCheckNonSmi(value); 1960eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org if (!instr->value()->type().IsHeapObject()) { 1961eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org result = AssignEnvironment(result); 1962eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 19638f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org return result; 1964c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1965c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1966c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1967e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) { 1968e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1969e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckSmi(value)); 1970e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} 1971e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1972e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1973c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) { 197483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1975812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LCheckInstanceType* result = new(zone()) LCheckInstanceType(value); 197683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org return AssignEnvironment(result); 1977c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1978c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1979c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 19801f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) { 1981378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 19821f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org return AssignEnvironment(new(zone()) LCheckValue(value)); 1983c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1984c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1985c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 19861456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) { 1987af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps; 1988af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 1989af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value)); 1990af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org if (instr->HasMigrationTarget()) { 1991af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org info()->MarkAsDeferredCalling(); 1992af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org result = AssignPointerMap(result); 1993594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1994594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return result; 1995c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 1996c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1997c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1998c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { 1999c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org HValue* value = instr->value(); 2000c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org Representation input_rep = value->representation(); 2001c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org LOperand* reg = UseRegister(value); 2002c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org if (input_rep.IsDouble()) { 200389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return DefineAsRegister(new(zone()) LClampDToUint8(reg)); 2004c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } else if (input_rep.IsInteger32()) { 2005812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineSameAsFirst(new(zone()) LClampIToUint8(reg)); 2006c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } else { 2007e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(input_rep.IsSmiOrTagged()); 2008c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // Register allocator doesn't (yet) support allocation of double 2009c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org // temps. Reserve xmm1 explicitly. 2010812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LClampTToUint8* result = new(zone()) LClampTToUint8(reg, 2011812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org FixedTemp(xmm1)); 2012c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org return AssignEnvironment(DefineSameAsFirst(result)); 2013c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org } 2014c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org} 2015c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 2016c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org 2017ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) { 2018ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org HValue* value = instr->value(); 2019e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value->representation().IsDouble()); 2020ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value))); 2021ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2022ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2023ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2024ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) { 2025ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* lo = UseRegister(instr->lo()); 2026ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org LOperand* hi = UseRegister(instr->hi()); 2027ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org return DefineAsRegister(new(zone()) LConstructDouble(hi, lo)); 2028ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org} 2029ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2030ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 2031c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) { 2032935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = info()->IsStub() ? UseFixed(instr->context(), rsi) : NULL; 20336e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count()); 2034935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return new(zone()) LReturn( 2035935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org UseFixed(instr->value(), rax), context, parameter_count); 2036c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2037c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2038c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2039c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 2040c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Representation r = instr->representation(); 2041b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org if (r.IsSmi()) { 2042b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org return DefineAsRegister(new(zone()) LConstantS); 2043b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsInteger32()) { 2044812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantI); 2045c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } else if (r.IsDouble()) { 20460511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com LOperand* temp = TempRegister(); 2047812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantD(temp)); 2048d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (r.IsExternal()) { 2049d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return DefineAsRegister(new(zone()) LConstantE); 2050b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org } else if (r.IsTagged()) { 2051812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsRegister(new(zone()) LConstantT); 2052c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } else { 2053c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org UNREACHABLE(); 2054c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 2055c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 2056c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2057c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2058c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2059c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) { 2060812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LLoadGlobalCell* result = new(zone()) LLoadGlobalCell; 2061c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return instr->RequiresHoleCheck() 2062378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org ? AssignEnvironment(DefineAsRegister(result)) 2063378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org : DefineAsRegister(result); 2064c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2065c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2066c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2067c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { 2068935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2069fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* global_object = 20709aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); 20719d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 20729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 20739aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 20749d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 20759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 2076935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LLoadGlobalGeneric* result = 20779d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org new(zone()) LLoadGlobalGeneric(context, global_object, vector); 2078c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2079c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 2080c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 2081c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 208274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) { 2083e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org LOperand* value = UseRegister(instr->value()); 2084e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org // Use a temp to avoid reloading the cell value address in the case where 2085e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org // we perform a hole check. 2086e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org return instr->RequiresHoleCheck() 2087812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister())) 2088812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org : new(zone()) LStoreGlobalCell(value, NULL); 208983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 2090c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2091c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2092c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) { 20933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* context = UseRegisterAtStart(instr->value()); 2094812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = 2095812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DefineAsRegister(new(zone()) LLoadContextSlot(context)); 20967a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 20977a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org result = AssignEnvironment(result); 20987a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org } 20997a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return result; 2100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 210383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) { 21043a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* context; 21053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org LOperand* value; 21068f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org LOperand* temp; 2107935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org context = UseRegister(instr->context()); 21083a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (instr->NeedsWriteBarrier()) { 21093a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org value = UseTempRegister(instr->value()); 21108f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org temp = TempRegister(); 21113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } else { 21123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org value = UseRegister(instr->value()); 21138f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org temp = NULL; 21143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 2115812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp); 21167a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) { 21177a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org result = AssignEnvironment(result); 21187a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org } 21197a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return result; 212083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org} 212183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 212283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 2123c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { 2124d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org // Use the special mov rax, moffs64 encoding for external 2125d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org // memory accesses with 64-bit word-sized values. 2126d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org if (instr->access().IsExternalMemory() && 2127d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org instr->access().offset() == 0 && 2128d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org (instr->access().representation().IsSmi() || 2129d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org instr->access().representation().IsTagged() || 2130d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org instr->access().representation().IsHeapObject() || 2131d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org instr->access().representation().IsExternal())) { 2132d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org LOperand* obj = UseRegisterOrConstantAtStart(instr->object()); 2133d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return DefineFixed(new(zone()) LLoadNamedField(obj), rax); 2134d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 2135378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org LOperand* obj = UseRegisterAtStart(instr->object()); 213657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org return DefineAsRegister(new(zone()) LLoadNamedField(obj)); 2137c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2138c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2139c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2140c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { 2141935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2142fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 21439aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 21449d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 21459d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 21469aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 21479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 21489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric( 21499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org context, object, vector); 2150d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com return MarkAsCall(DefineFixed(result, rax), instr); 2151c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2152c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2153c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2154c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype( 2155c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org HLoadFunctionPrototype* instr) { 2156496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org return AssignEnvironment(DefineAsRegister( 2157812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LLoadFunctionPrototype(UseRegister(instr->function())))); 2158c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2159c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2160c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2161528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { 2162528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return DefineAsRegister(new(zone()) LLoadRoot); 2163528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org} 2164528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2165528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 2166895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) { 21671845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // We sign extend the dehoisted key at the definition point when the pointer 21681845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use 21691845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // points and should not invoke this function. We can't use STATIC_ASSERT 21701845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // here as the pointer size is 32-bit for x32. 2171e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(kPointerSize == kInt64Size); 2172895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org BitVector* dehoisted_key_ids = chunk_->GetDehoistedKeyIds(); 2173895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org if (dehoisted_key_ids->Contains(candidate->id())) return; 2174895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org dehoisted_key_ids->Add(candidate->id()); 2175895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org if (!candidate->IsPhi()) return; 2176895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org for (int i = 0; i < candidate->OperandCount(); ++i) { 2177895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org FindDehoistedKeyDefinitions(candidate->OperandAt(i)); 2178895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org } 2179895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org} 2180895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 2181895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 2182e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { 2183e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((kPointerSize == kInt64Size && 218470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org instr->key()->representation().IsInteger32()) || 218570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org (kPointerSize == kInt32Size && 218670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org instr->key()->representation().IsSmiOrInteger32())); 2187e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org ElementsKind elements_kind = instr->elements_kind(); 218870d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org LOperand* key = NULL; 21897a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org LInstruction* result = NULL; 2190717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 219170d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org if (kPointerSize == kInt64Size) { 219270d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 219370d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org } else { 219470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org bool clobbers_key = ExternalArrayOpRequiresTemp( 219570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org instr->key()->representation(), elements_kind); 219670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org key = clobbers_key 219770d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org ? UseTempRegister(instr->key()) 219870d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org : UseRegisterOrConstantAtStart(instr->key()); 219970d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org } 220070d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org 22011845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { 2202895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org FindDehoistedKeyDefinitions(instr->key()); 2203895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org } 2204895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 22055c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2206eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* obj = UseRegisterAtStart(instr->elements()); 22077a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); 2208eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } else { 2209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 2210e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org (instr->representation().IsInteger32() && 22117a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org !(IsDoubleOrFloatElementsKind(elements_kind))) || 2212e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org (instr->representation().IsDouble() && 22137a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org (IsDoubleOrFloatElementsKind(elements_kind)))); 22145c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 22157a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key)); 2216e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 2217717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 22187a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org if ((instr->is_external() || instr->is_fixed_typed_array()) ? 22197a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org // see LCodeGen::DoLoadKeyedExternalArray 22207a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org ((elements_kind == EXTERNAL_UINT32_ELEMENTS || 22217a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org elements_kind == UINT32_ELEMENTS) && 22227a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org !instr->CheckFlag(HInstruction::kUint32)) : 22237a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org // see LCodeGen::DoLoadKeyedFixedDoubleArray and 22247a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org // LCodeGen::DoLoadKeyedFixedArray 22257a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org instr->RequiresHoleCheck()) { 22267a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org result = AssignEnvironment(result); 22277a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org } 22287a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return result; 2229496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org} 2230496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 2231496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org 2232c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { 2233935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2234fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 22359aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); 22369aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); 22379d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org LOperand* vector = NULL; 22389d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (FLAG_vector_ics) { 22399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org vector = FixedTemp(VectorLoadICDescriptor::VectorRegister()); 22409d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 22413a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2242935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LLoadKeyedGeneric* result = 22439d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org new(zone()) LLoadKeyedGeneric(context, object, key, vector); 22443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2245c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2246c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2247c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2248e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) { 2249eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org ElementsKind elements_kind = instr->elements_kind(); 2250e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 22511845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) { 2252895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org FindDehoistedKeyDefinitions(instr->key()); 2253895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org } 2254895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org 22555c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!instr->is_typed_elements()) { 2256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->elements()->representation().IsTagged()); 22578e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2258eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org LOperand* object = NULL; 22598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* key = NULL; 22608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* val = NULL; 22618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 226271ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org Representation value_representation = instr->value()->representation(); 226371ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org if (value_representation.IsDouble()) { 2264eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org object = UseRegisterAtStart(instr->elements()); 2265895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org val = UseRegisterAtStart(instr->value()); 2266fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 2267eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } else { 2268e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value_representation.IsSmiOrTagged() || 226971ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org value_representation.IsInteger32()); 227032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (needs_write_barrier) { 227171ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org object = UseTempRegister(instr->elements()); 227232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org val = UseTempRegister(instr->value()); 227332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org key = UseTempRegister(instr->key()); 227432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } else { 227571ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org object = UseRegisterAtStart(instr->elements()); 2276f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org val = UseRegisterOrConstantAtStart(instr->value()); 2277fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 227832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 2279eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 2280eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 22818e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return new(zone()) LStoreKeyed(object, key, val); 2282e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org } 2283e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org 2284e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK( 22855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (instr->value()->representation().IsInteger32() && 22865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org !IsDoubleOrFloatElementsKind(elements_kind)) || 22875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (instr->value()->representation().IsDouble() && 22885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org IsDoubleOrFloatElementsKind(elements_kind))); 2289e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((instr->is_fixed_typed_array() && 22905c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsTagged()) || 22915c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org (instr->is_external() && 22925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org instr->elements()->representation().IsExternal())); 22938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool val_is_temp_register = 2294af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org elements_kind == EXTERNAL_UINT8_CLAMPED_ELEMENTS || 2295af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org elements_kind == EXTERNAL_FLOAT32_ELEMENTS || 22965c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org elements_kind == FLOAT32_ELEMENTS; 22978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org LOperand* val = val_is_temp_register ? UseTempRegister(instr->value()) 22988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org : UseRegister(instr->value()); 229970d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org LOperand* key = NULL; 230070d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org if (kPointerSize == kInt64Size) { 230170d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org key = UseRegisterOrConstantAtStart(instr->key()); 230270d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org } else { 230370d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org bool clobbers_key = ExternalArrayOpRequiresTemp( 230470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org instr->key()->representation(), elements_kind); 230570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org key = clobbers_key 230670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org ? UseTempRegister(instr->key()) 230770d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org : UseRegisterOrConstantAtStart(instr->key()); 230870d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org } 23095c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org LOperand* backing_store = UseRegister(instr->elements()); 23105c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org return new(zone()) LStoreKeyed(backing_store, key, val); 23113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 23123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 23133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2314c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { 2315935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2316fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 23179aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 23189aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); 23199aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 23203a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2321e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->object()->representation().IsTagged()); 2322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->key()->representation().IsTagged()); 2323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->value()->representation().IsTagged()); 23243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2325812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LStoreKeyedGeneric* result = 2326935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LStoreKeyedGeneric(context, object, key, value); 23273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return MarkAsCall(result, instr); 2328c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2329c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2330c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2331394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comLInstruction* LChunkBuilder::DoTransitionElementsKind( 2332394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com HTransitionElementsKind* instr) { 2333003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) { 2334394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* object = UseRegister(instr->object()); 2335394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* new_map_reg = TempRegister(); 2336394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com LOperand* temp_reg = TempRegister(); 2337935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LTransitionElementsKind* result = new(zone()) LTransitionElementsKind( 2338935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org object, NULL, new_map_reg, temp_reg); 233994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return result; 2340d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else { 23412f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org LOperand* object = UseFixed(instr->object(), rax); 2342cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 234394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LTransitionElementsKind* result = 2344935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LTransitionElementsKind(object, context, NULL, NULL); 23452f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org return MarkAsCall(result, instr); 2346394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 2347394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com} 2348394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 2349394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 235094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento( 235194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org HTrapAllocationMemento* instr) { 235294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* object = UseRegister(instr->object()); 235394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp = TempRegister(); 235494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LTrapAllocationMemento* result = 235594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org new(zone()) LTrapAllocationMemento(object, temp); 235694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return AssignEnvironment(result); 235794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org} 235894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 235994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2360c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { 236153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org bool is_in_object = instr->access().IsInobject(); 2362d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org bool is_external_location = instr->access().IsExternalMemory() && 2363d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org instr->access().offset() == 0; 2364378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org bool needs_write_barrier = instr->NeedsWriteBarrier(); 2365594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool needs_write_barrier_for_map = instr->has_transition() && 236637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org instr->NeedsWriteBarrierForMap(); 236737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org 236837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org LOperand* obj; 236937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org if (needs_write_barrier) { 237053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org obj = is_in_object 237137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 237237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseTempRegister(instr->object()); 2373d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (is_external_location) { 2374e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!is_in_object); 2375e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!needs_write_barrier); 2376e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!needs_write_barrier_for_map); 2377d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org obj = UseRegisterOrConstant(instr->object()); 237837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } else { 237937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org obj = needs_write_barrier_for_map 238037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org ? UseRegister(instr->object()) 238137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org : UseRegisterAtStart(instr->object()); 238237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } 2383378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org 2384f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org bool can_be_constant = instr->value()->IsConstant() && 2385f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org HConstant::cast(instr->value())->NotInNewSpace() && 2386bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org !instr->field_representation().IsDouble(); 2387f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 238877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* val; 238977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (needs_write_barrier) { 239077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseTempRegister(instr->value()); 2391d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else if (is_external_location) { 2392d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org val = UseFixed(instr->value(), rax); 2393f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org } else if (can_be_constant) { 239477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseRegisterOrConstant(instr->value()); 2395bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org } else if (instr->field_representation().IsDouble()) { 239657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org val = UseRegisterAtStart(instr->value()); 239777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } else { 239877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org val = UseRegister(instr->value()); 239977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 2400378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org 2401378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org // We only need a scratch register if we have a write barrier or we 2402378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org // have a store into the properties array (not in-object-property). 240353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org LOperand* temp = (!is_in_object || needs_write_barrier || 240437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org needs_write_barrier_for_map) ? TempRegister() : NULL; 2405378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org 2406d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return new(zone()) LStoreNamedField(obj, val, temp); 2407c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2408c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2409c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2410c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { 2411935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2412fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org LOperand* object = 24139aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); 24149aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); 24153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 2416935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LStoreNamedGeneric* result = 2417935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LStoreNamedGeneric(context, object, value); 24183a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return MarkAsCall(result, instr); 2419c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2420c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2421c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2422160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { 2423935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2424bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* left = UseFixed(instr->left(), rdx); 2425bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org LOperand* right = UseFixed(instr->right(), rax); 2426935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall( 2427935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org DefineFixed(new(zone()) LStringAdd(context, left, right), rax), instr); 2428160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org} 2429160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 2430160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org 24310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) { 24324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org LOperand* string = UseTempRegister(instr->string()); 24334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org LOperand* index = UseTempRegister(instr->index()); 2434935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseAny(instr->context()); 2435935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LStringCharCodeAt* result = 2436935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LStringCharCodeAt(context, string, index); 24377a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org return AssignPointerMap(DefineAsRegister(result)); 24380a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 24390a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 24400a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 2441b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { 2442b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org LOperand* char_code = UseRegister(instr->value()); 2443935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseAny(instr->context()); 2444935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LStringCharFromCode* result = 2445935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org new(zone()) LStringCharFromCode(context, char_code); 2446b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return AssignPointerMap(DefineAsRegister(result)); 2447b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org} 2448b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 2449b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 245094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { 245194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org info()->MarkAsDeferredCalling(); 2452935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseAny(instr->context()); 2453f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org LOperand* size = instr->size()->IsConstant() 2454f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org ? UseConstant(instr->size()) 2455f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org : UseTempRegister(instr->size()); 245694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LOperand* temp = TempRegister(); 2457935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LAllocate* result = new(zone()) LAllocate(context, size, temp); 245894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org return AssignPointerMap(DefineAsRegister(result)); 245994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org} 246094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 246194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 2462c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { 2463935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2464935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LRegExpLiteral* result = new(zone()) LRegExpLiteral(context); 2465935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2466c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2467c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2468c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2469c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) { 2470935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2471935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LFunctionLiteral* result = new(zone()) LFunctionLiteral(context); 2472935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2473c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2474c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2475c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2476c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { 2477e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(argument_count_ == 0); 24783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org allocator_->MarkAsOsrEntry(); 24793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org current_block_->last_environment()->set_ast_id(instr->ast_id()); 2480812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LOsrEntry); 2481c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2482c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2483c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2484c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) { 2485a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org LParameter* result = new(zone()) LParameter; 24862f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (instr->kind() == HParameter::STACK_PARAMETER) { 2487a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org int spill_index = chunk()->GetParameterStackSlot(instr->index()); 2488a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return DefineAsSpilled(result, spill_index); 2489a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } else { 2490e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(info()->IsStub()); 2491e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org CallInterfaceDescriptor descriptor = 2492e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org info()->code_stub()->GetCallInterfaceDescriptor(); 2493ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org int index = static_cast<int>(instr->index()); 249442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org Register reg = descriptor.GetEnvironmentParameterRegister(index); 2495a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return DefineFixed(result, reg); 2496a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 2497c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2498c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2499c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2500c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) { 2501c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // Use an index that corresponds to the location in the unoptimized frame, 2502c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // which the optimized frame will subsume. 2503c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int env_index = instr->index(); 2504c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org int spill_index = 0; 2505c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (instr->environment()->is_parameter_index(env_index)) { 2506c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = chunk()->GetParameterStackSlot(env_index); 2507c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } else { 2508c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = env_index - instr->environment()->first_local_index(); 2509c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (spill_index > LUnallocated::kMaxFixedSlotIndex) { 2510b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Retry(kTooManySpillSlotsNeededForOSR); 2511c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org spill_index = 0; 2512c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org } 251304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 2514812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index); 2515c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2516c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2517c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2518c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { 2519935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2520935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LCallStub* result = new(zone()) LCallStub(context); 2521935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2522c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2523c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2524c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2525c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { 25263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // There are no real uses of the arguments object. 25273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // arguments.length and element access are supported directly on 25283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // stack arguments, and any real arguments object use causes a bailout. 25293a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org // So this value is never used. 2530c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 2531c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2532c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2533c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2534594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { 2535662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 25361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 2537594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org // There are no real uses of a captured object. 2538594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return NULL; 2539594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org} 2540594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2541594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 2542c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { 254377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org info()->MarkAsRequiresFrame(); 2544c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org LOperand* args = UseRegister(instr->arguments()); 254577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* length; 254677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org LOperand* index; 254777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org if (instr->length()->IsConstant() && instr->index()->IsConstant()) { 254877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org length = UseRegisterOrConstant(instr->length()); 254977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org index = UseOrConstant(instr->index()); 255077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } else { 255177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org length = UseTempRegister(instr->length()); 255277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org index = Use(instr->index()); 255377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 2554c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index)); 2555c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2556c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2557c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) { 2559ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOperand* object = UseFixed(instr->value(), rax); 2560812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org LToFastProperties* result = new(zone()) LToFastProperties(object); 2561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2562ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2565c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { 2566935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2567935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* value = UseAtStart(instr->value()); 2568935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LTypeof* result = new(zone()) LTypeof(context, value); 25693a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return MarkAsCall(DefineFixed(result, rax), instr); 2570c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2571c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2572c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 25734f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 2574812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); 2575c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2576c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2577d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 25784f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 25794f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org HIsConstructCallAndBranch* instr) { 2580812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return new(zone()) LIsConstructCallAndBranch(TempRegister()); 2581d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com} 2582d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2583d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 2584c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) { 2585662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org instr->ReplayEnvironment(current_block_->last_environment()); 2586c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 2587c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2588c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2589c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2590c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) { 2591a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org info()->MarkAsDeferredCalling(); 259204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org if (instr->is_function_entry()) { 2593935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2594935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return MarkAsCall(new(zone()) LStackCheck(context), instr); 259504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } else { 2596e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->is_backwards_branch()); 2597935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseAny(instr->context()); 2598935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org return AssignEnvironment( 2599935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org AssignPointerMap(new(zone()) LStackCheck(context))); 260004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 2601c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2602c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2603c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2604c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) { 2605378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org HEnvironment* outer = current_block_->last_environment(); 2606f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org outer->set_ast_id(instr->ReturnId()); 2607378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org HConstant* undefined = graph()->GetConstantUndefined(); 2608378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org HEnvironment* inner = outer->CopyForInlining(instr->closure(), 2609659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org instr->arguments_count(), 2610378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org instr->function(), 261140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org undefined, 2612e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org instr->inlining_kind()); 2613b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org // Only replay binding of arguments object if it wasn't removed from graph. 2614b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) { 2615b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org inner->Bind(instr->arguments_var(), instr->arguments_object()); 26168c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org } 2617ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org inner->BindContext(instr->closure_context()); 261856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org inner->set_entry(instr); 2619378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org current_block_->UpdateEnvironment(inner); 2620378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org chunk_->AddInlinedClosure(instr->closure()); 2621c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return NULL; 2622c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2623c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2624c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2625c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { 262628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org LInstruction* pop = NULL; 262728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 262828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org HEnvironment* env = current_block_->last_environment(); 262928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 263033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (env->entry()->arguments_pushed()) { 263128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org int argument_count = env->arguments_environment()->parameter_count(); 263228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org pop = new(zone()) LDrop(argument_count); 2633e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->argument_delta() == -argument_count); 263428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org } 263528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 2636659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org HEnvironment* outer = current_block_->last_environment()-> 2637659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org DiscardInlined(false); 263883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org current_block_->UpdateEnvironment(outer); 263928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org 264028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org return pop; 2641c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 2642c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 26433847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com 2644be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) { 2645935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 2646be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* object = UseFixed(instr->enumerable(), rax); 2647935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object); 2648be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY); 2649be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2650be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2651be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2652be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) { 2653be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* map = UseRegister(instr->map()); 2654be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return AssignEnvironment(DefineAsRegister( 2655812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org new(zone()) LForInCacheArray(map))); 2656be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2657be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2658be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2659be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) { 2660be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* value = UseRegisterAtStart(instr->value()); 2661be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* map = UseRegisterAtStart(instr->map()); 2662812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return AssignEnvironment(new(zone()) LCheckMapValue(value, map)); 2663be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2664be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2665be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2666be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { 2667be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* object = UseRegister(instr->object()); 2668be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LOperand* index = UseTempRegister(instr->index()); 266963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); 267063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org LInstruction* result = DefineSameAsFirst(load); 267163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org return AssignPointerMap(result); 2672be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 2673be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 2674be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 26751e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { 26761e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseRegisterAtStart(instr->context()); 26771e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return new(zone()) LStoreFrameContext(context); 26781e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 26791e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26801e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26811e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext( 26821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org HAllocateBlockContext* instr) { 26831e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* context = UseFixed(instr->context(), rsi); 26841e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LOperand* function = UseRegisterAtStart(instr->function()); 26851e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org LAllocateBlockContext* result = 26861e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org new(zone()) LAllocateBlockContext(context, function); 26871e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org return MarkAsCall(DefineFixed(result, rsi), instr); 26881e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} 26891e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 26901e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 2691c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} } // namespace v8::internal 2692c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 2693c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#endif // V8_TARGET_ARCH_X64 2694