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.
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm/lithium-codegen-arm.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-osr.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h"
10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DEFINE_COMPILE(type)                            \
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void L##type::CompileToNative(LCodeGen* generator) {  \
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    generator->Do##type(this);                          \
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DEFINE_COMPILE
20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG
2283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LInstruction::VerifyCall() {
23160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // Call instructions can use only fixed registers as temporaries and
24160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // outputs because all registers are blocked by the calling convention.
25160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // Inputs operands must use a fixed register or use-at-start policy or
26160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // a non-register policy.
27e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(Output() == NULL ||
2883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org         LUnallocated::cast(Output())->HasFixedPolicy() ||
2983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org         !LUnallocated::cast(Output())->HasRegisterPolicy());
30e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  for (UseIterator it(this); !it.Done(); it.Advance()) {
31e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
32e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||
33160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org           operand->IsUsedAtStart());
3483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
35e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  for (TempIterator it(this); !it.Done(); it.Advance()) {
36e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
37e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
3883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
3983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
4083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif
4183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
430a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) {
44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("%s ", this->Mnemonic());
4583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
4683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  PrintOutputOperandTo(stream);
470a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  PrintDataTo(stream);
49a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (HasEnvironment()) {
51a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(" ");
52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    environment()->PrintTo(stream);
53a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
54a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
55a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (HasPointerMap()) {
56a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(" ");
57a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    pointer_map()->PrintTo(stream);
58a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
60a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
6288d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) {
630a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  stream->Add("= ");
6488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  for (int i = 0; i < InputCount(); i++) {
656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org    if (i > 0) stream->Add(" ");
664cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    if (InputAt(i) == NULL) {
674cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      stream->Add("NULL");
684cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    } else {
694cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      InputAt(i)->PrintTo(stream);
704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    }
716d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  }
720a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
7588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
7688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  if (HasResult()) result()->PrintTo(stream);
770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
780a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
790a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
800a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) {
81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LGap::PrintDataTo(stream);
82a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LLabel* rep = replacement();
83a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (rep != NULL) {
84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(" Dead block replaced with B%d", rep->block_id());
85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
86a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
87a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
88a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
89a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool LGap::IsRedundant() const {
90a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < 4; i++) {
91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return false;
93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return true;
97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1008e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) {
101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < 4; i++) {
102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add("(");
103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (parallel_moves_[i] != NULL) {
104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      parallel_moves_[i]->PrintDataTo(stream);
105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(") ");
107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticD::Mnemonic() const {
112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  switch (op()) {
113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::ADD: return "add-d";
114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::SUB: return "sub-d";
115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MUL: return "mul-d";
116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::DIV: return "div-d";
117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MOD: return "mod-d";
118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    default:
119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      UNREACHABLE();
120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return NULL;
121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticT::Mnemonic() const {
126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  switch (op()) {
127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::ADD: return "add-t";
128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::SUB: return "sub-t";
129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MUL: return "mul-t";
130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MOD: return "mod-t";
131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::DIV: return "div-t";
13283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    case Token::BIT_AND: return "bit-and-t";
13383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    case Token::BIT_OR: return "bit-or-t";
13483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    case Token::BIT_XOR: return "bit-xor-t";
135e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    case Token::ROR: return "ror-t";
136496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    case Token::SHL: return "shl-t";
137496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    case Token::SAR: return "sar-t";
138496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    case Token::SHR: return "shr-t";
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    default:
140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      UNREACHABLE();
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return NULL;
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const {
14732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return !gen->IsNextEmittedBlock(block_id());
14832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
14932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
15032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
1510a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) {
152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("B%d", block_id());
153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1560a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) {
157a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
15833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
162e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if ");
16433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  left()->PrintTo(stream);
165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" %s ", Token::String(op()));
16633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  right()->PrintTo(stream);
167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
1725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  stream->Add("if is_object(");
17333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
1745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1755f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
1765f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
1775f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
1780ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
1790ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add("if is_string(");
18033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
1810ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1820ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
1830ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1840ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
186a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if is_smi(");
18733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
1937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  stream->Add("if is_undetectable(");
19433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
1957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
1977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1990ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2000ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add("if string_compare(");
20133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  left()->PrintTo(stream);
20233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  right()->PrintTo(stream);
2030ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
2050ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
2060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
2070a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if has_instance_type(");
20933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2140a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if has_cached_array_index(");
21633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
217a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
218a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
219a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
220a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2210a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
222a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if class_of_test(");
22333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
224a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(", \"%o\") then B%d else B%d",
225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              *hydrogen()->class_name(),
226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              true_block_id(),
227a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              false_block_id());
228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if typeof ");
23333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
234a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" == \"%s\" then B%d else B%d",
235afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org              hydrogen()->type_literal()->ToCString().get(),
236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              true_block_id(), false_block_id());
237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
238a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
239a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
240662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
241662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  stream->Add(" = ");
242662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  function()->PrintTo(stream);
243662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  stream->Add(".code_entry = ");
244662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  code_object()->PrintTo(stream);
245662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
246662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
247662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
2482bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
2492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  stream->Add(" = ");
2502bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  base_object()->PrintTo(stream);
251ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  stream->Add(" + ");
252ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  offset()->PrintTo(stream);
2532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org}
2542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
2552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
25626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) {
25726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  stream->Add("= ");
25826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  function()->PrintTo(stream);
25926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  stream->Add("#%d / ", arity());
26026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
26126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
26226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
26326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
26426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 0; i < InputCount(); i++) {
26526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    InputAt(i)->PrintTo(stream);
26626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    stream->Add(" ");
26726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
268a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("#%d / ", arity());
269a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
271a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
272c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
27333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  context()->PrintTo(stream);
27483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  stream->Add("[%d]", slot_index());
27583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
27683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
27783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
27883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
27933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  context()->PrintTo(stream);
28083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  stream->Add("[%d] <- ", slot_index());
28133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  value()->PrintTo(stream);
282c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
284c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
285160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
286160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  stream->Add("= ");
28733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  function()->PrintTo(stream);
288160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  stream->Add(" #%d / ", arity());
289160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}
290160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
291160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
2920a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) {
2930a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  stream->Add("= ");
29433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  constructor()->PrintTo(stream);
295a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" #%d / ", arity());
296a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
297a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
298a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) {
3004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add("= ");
3014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  constructor()->PrintTo(stream);
3024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add(" #%d / ", arity());
3031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ElementsKind kind = hydrogen()->elements_kind();
3044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add(" (%s) ", ElementsKindToString(kind));
3054a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
3064a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
3074a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
3080a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
309a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  arguments()->PrintTo(stream);
310a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" length ");
311a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  length()->PrintTo(stream);
312a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" index ");
313a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  index()->PrintTo(stream);
314a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3173a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
3180a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  object()->PrintTo(stream);
319f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OStringStream os;
320f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << hydrogen()->access() << " <- ";
321f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  stream->Add(os.c_str());
3220a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  value()->PrintTo(stream);
3230a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
3240a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
3250a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
3263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
3273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  object()->PrintTo(stream);
3283a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  stream->Add(".");
329afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  stream->Add(String::cast(*name())->ToCString().get());
3303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  stream->Add(" <- ");
3313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  value()->PrintTo(stream);
3323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
3333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
3343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
3358e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
3368e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  elements()->PrintTo(stream);
3378e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  stream->Add("[");
3388e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  key()->PrintTo(stream);
3398e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (hydrogen()->IsDehoisted()) {
340fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    stream->Add(" + %d]", base_offset());
3418e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  } else {
3428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    stream->Add("]");
3438e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
3448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
3458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
347e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
348717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  elements()->PrintTo(stream);
349717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  stream->Add("[");
350717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  key()->PrintTo(stream);
3518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (hydrogen()->IsDehoisted()) {
352fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    stream->Add(" + %d] <-", base_offset());
3538e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  } else {
3548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    stream->Add("] <- ");
3558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
356d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
357d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  if (value() == NULL) {
358e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(hydrogen()->IsConstantHoleStore() &&
359d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org           hydrogen()->value()->representation().IsDouble());
360d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    stream->Add("<the hole(nan)>");
361d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  } else {
362d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    value()->PrintTo(stream);
363d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  }
364717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org}
365717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
366717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
3673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
3680a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  object()->PrintTo(stream);
3690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  stream->Add("[");
3700a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  key()->PrintTo(stream);
3710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  stream->Add("] <- ");
3720a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  value()->PrintTo(stream);
3730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
3740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
3750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
376394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
377394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  object()->PrintTo(stream);
378394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
379394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
380394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
381394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
382c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Skip a slot if for a double-width slot.
384c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (kind == DOUBLE_REGISTERS) spill_slot_count_++;
385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return spill_slot_count_++;
386a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
387a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
388a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
389c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind)  {
390c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  int index = GetNextSpillIndex(kind);
391c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (kind == DOUBLE_REGISTERS) {
3927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    return LDoubleStackSlot::Create(index, zone());
393a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
394e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(kind == GENERAL_REGISTERS);
3957028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    return LStackSlot::Create(index, zone());
396a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
40028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() {
401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_unused());
40228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  chunk_ = new(zone()) LPlatformChunk(info(), graph());
4031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LPhase phase("L_Building chunk", chunk_);
404a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  status_ = BUILDING;
405c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
406c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // If compiling for OSR, reserve space for the unoptimized frame,
407c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // which will be subsumed into this frame.
408c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (graph()->has_osr()) {
409c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
410c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
411c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
412c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  }
413c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
414a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
415a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < blocks->length(); i++) {
416a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* next = NULL;
417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (i < blocks->length() - 1) next = blocks->at(i + 1);
418a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    DoBasicBlock(blocks->at(i), next);
419a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (is_aborted()) return NULL;
420a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
421a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  status_ = DONE;
422a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return chunk_;
423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
424a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
425a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
426a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
427812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
428812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                  Register::ToAllocationIndex(reg));
429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) {
433812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
434812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                  DoubleRegister::ToAllocationIndex(reg));
435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Use(value, ToUnallocated(fixed_register));
440a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) {
444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Use(value, ToUnallocated(reg));
445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) {
449812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
451a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Use(value,
455812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
456812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                      LUnallocated::USED_AT_START));
457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
461812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) {
466812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) {
471812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
472812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                             LUnallocated::USED_AT_START));
473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return value->IsConstant()
478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : Use(value);
480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return value->IsConstant()
485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : UseAtStart(value);
487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return value->IsConstant()
492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : UseRegister(value);
494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return value->IsConstant()
499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : UseRegisterAtStart(value);
501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
504f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) {
505f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return chunk_->DefineConstantOperand(HConstant::cast(value));
506f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
507f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
508f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
5090511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comLOperand* LChunkBuilder::UseAny(HValue* value) {
5100511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  return value->IsConstant()
5110511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com      ? chunk_->DefineConstantOperand(HConstant::cast(value))
512812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
5130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
5140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
5150511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
516a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (value->EmitAtUses()) {
518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HInstruction* instr = HInstruction::cast(value);
519a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    VisitInstruction(instr);
520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
521994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  operand->set_virtual_register(value->id());
522a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
523a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
52626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
5270a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org                                    LUnallocated* result) {
528994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  result->set_virtual_register(current_instruction_->id());
5290a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  instr->set_result(result);
5300a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  return instr;
5310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
5320a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
5330a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
5340a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister(
53526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
536812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Define(instr,
537812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5410a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled(
54226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr, int index) {
543812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Define(instr,
544812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5480a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst(
54926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Define(instr,
551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5550a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineFixed(
55626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr, Register reg) {
557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Define(instr, ToUnallocated(reg));
558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5610a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble(
56226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr, DoubleRegister reg) {
563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Define(instr, ToUnallocated(reg));
564a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
565a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
566a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
567a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
568a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HEnvironment* hydrogen_env = current_block_->last_environment();
569c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int argument_index_accumulator = 0;
570594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  ZoneList<HValue*> objects_to_materialize(0, zone());
571c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  instr->set_environment(CreateEnvironment(hydrogen_env,
572594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                           &argument_index_accumulator,
573594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                           &objects_to_materialize));
574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return instr;
575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                        HInstruction* hinstr,
580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                        CanDeoptimize can_deoptimize) {
581a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  info()->MarkAsNonDeferredCalling();
58283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG
58383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  instr->VerifyCall();
58483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif
58583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  instr->MarkAsCall();
586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  instr = AssignPointerMap(instr);
587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // If instruction does not have side-effects lazy deoptimization
589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // after the call will try to deoptimize to the point before the call.
590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Thus we still need to attach environment to this call even if
591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // call sequence can not deoptimize eagerly.
592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool needs_environment =
593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      !hinstr->HasObservableSideEffects();
595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (needs_environment && !instr->HasEnvironment()) {
596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    instr = AssignEnvironment(instr);
5974edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    // We can't really figure out if the environment is needed or not.
5984edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    instr->environment()->set_has_been_used();
599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return instr;
602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
6050a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
606e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!instr->HasPointerMap());
60771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return instr;
609a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::TempRegister() {
613812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LUnallocated* operand =
614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
6152bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  int vreg = allocator_->GetVirtualRegister();
6162bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  if (!allocator_->AllocationOk()) {
617594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
61857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    vreg = 0;
6192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  }
6202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  operand->set_virtual_register(vreg);
621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
625d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() {
626d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LUnallocated* operand =
627d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER);
628d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  int vreg = allocator_->GetVirtualRegister();
629d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (!allocator_->AllocationOk()) {
630d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
631d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    vreg = 0;
632d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
633d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  operand->set_virtual_register(vreg);
634d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return operand;
635d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
636d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
637d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
638a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) {
639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LUnallocated* operand = ToUnallocated(reg);
640e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
641a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
642a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
643a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
644a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
645a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) {
646a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LUnallocated* operand = ToUnallocated(reg);
647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
650a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
653812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LLabel(instr->block());
654a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
65746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
65846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
65946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
66046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
66146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
662d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
663d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  UNREACHABLE();
664d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return NULL;
665d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
666d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
667d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
669812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return AssignEnvironment(new(zone()) LDeoptimize);
670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
671a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op,
674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                     HBitwiseBinaryOperation* instr) {
675528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
676e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
677e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
678528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
679a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
680528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    HValue* right_value = instr->right();
681528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = NULL;
682528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    int constant_value = 0;
683528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    bool does_deopt = false;
684528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (right_value->IsConstant()) {
685528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      HConstant* constant = HConstant::cast(right_value);
686528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right = chunk_->DefineConstantOperand(constant);
68717aac87e074aee1bc2470cf0ed56556f4f2de420machenbach@chromium.org      constant_value = constant->Integer32Value() & 0x1f;
688528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      // Left shifts can deoptimize if we shift by > 0 and the result cannot be
689528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      // truncated to smi.
690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (instr->representation().IsSmi() && constant_value > 0) {
691528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
692528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
693528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    } else {
694528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right = UseRegisterAtStart(right_value);
695a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
6962f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
697528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // Shift operations can only deoptimize if we do a logical shift
698528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // by 0 and the result cannot be truncated to int32.
699528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (op == Token::SHR && constant_value == 0) {
700528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (FLAG_opt_safe_uint32_operations) {
701528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckFlag(HInstruction::kUint32);
702528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      } else {
703528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32);
704528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
7052f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org    }
7062f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
707528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LInstruction* result =
708528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt));
709528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return does_deopt ? AssignEnvironment(result) : result;
710528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else {
711528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(op, instr);
712528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
715a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                           HArithmeticBinaryOperation* instr) {
718e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
719e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsDouble());
721528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (op == Token::MOD) {
7229f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    LOperand* left = UseFixedDouble(instr->left(), d0);
7239f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    LOperand* right = UseFixedDouble(instr->right(), d1);
724528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
7259f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    return MarkAsCall(DefineFixedDouble(result, d0), instr);
726528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else {
727528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DefineAsRegister(result);
731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
732a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
733a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
734a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
735a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
736528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                           HBinaryOperation* instr) {
737a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HValue* left = instr->left();
738a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HValue* right = instr->right();
739e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(left->representation().IsTagged());
740e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(right->representation().IsTagged());
741c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
742a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* left_operand = UseFixed(left, r1);
743a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* right_operand = UseFixed(right, r0);
744812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LArithmeticT* result =
745c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
746a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
747a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
748a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
749378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
751e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_building());
752a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_ = block;
753a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next_block_ = next_block;
754a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (block->IsStartBlock()) {
755a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->UpdateEnvironment(graph_->start_environment());
756a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    argument_count_ = 0;
757a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (block->predecessors()->length() == 1) {
758a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // We have a single predecessor => copy environment and outgoing
759a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // argument count from the predecessor.
760e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block->phis()->length() == 0);
761a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HEnvironment* last_environment = pred->last_environment();
763e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(last_environment != NULL);
764a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Only copy the environment, if it is later used again.
765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (pred->end()->SecondSuccessor() == NULL) {
766e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(pred->end()->FirstSuccessor() == block);
767a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
768a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
769a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
770a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        last_environment = last_environment->Copy();
771a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
772a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
773a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->UpdateEnvironment(last_environment);
774e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(pred->argument_count() >= 0);
775a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    argument_count_ = pred->argument_count();
776a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
777a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // We are at a state join => process phis.
778a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // No need to copy the environment, it cannot be used later.
780a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HEnvironment* last_environment = pred->last_environment();
781a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int i = 0; i < block->phis()->length(); ++i) {
782a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      HPhi* phi = block->phis()->at(i);
783ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org      if (phi->HasMergedIndex()) {
784b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org        last_environment->SetValueAt(phi->merged_index(), phi);
785b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      }
786a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
787a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
788b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      if (block->deleted_phis()->at(i) < last_environment->length()) {
789b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org        last_environment->SetValueAt(block->deleted_phis()->at(i),
790b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org                                     graph_->GetConstantUndefined());
791b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      }
792a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
793a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->UpdateEnvironment(last_environment);
794a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Pick up the outgoing argument count of one of the predecessors.
795a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    argument_count_ = pred->argument_count();
796a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
797a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction* current = block->first();
798a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int start = chunk_->instructions()->length();
799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (current != NULL && !is_aborted()) {
800a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Code for constants in registers is generated lazily.
801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (!current->EmitAtUses()) {
802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      VisitInstruction(current);
803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
804a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    current = current->next();
805a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int end = chunk_->instructions()->length() - 1;
807a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (end >= start) {
808a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->set_first_instruction_index(start);
809a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->set_last_instruction_index(end);
810a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  block->set_argument_count(argument_count_);
812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next_block_ = NULL;
813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_ = NULL;
814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction* old_current = current_instruction_;
819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_instruction_ = current;
820d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
821d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  LInstruction* instr = NULL;
822d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  if (current->CanReplaceWithDummyUses()) {
823935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    if (current->OperandCount() == 0) {
824935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr = DefineAsRegister(new(zone()) LDummy());
825935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    } else {
826e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(!current->OperandAt(0)->IsControlInstruction());
827935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr = DefineAsRegister(new(zone())
828935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org          LDummyUse(UseAny(current->OperandAt(0))));
829935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    }
830d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    for (int i = 1; i < current->OperandCount(); ++i) {
83109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      if (current->OperandAt(i)->IsControlInstruction()) continue;
832d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      LInstruction* dummy =
833d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
834d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      dummy->set_hydrogen_value(current);
835d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      chunk_->AddInstruction(dummy, current_block_);
836d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    }
837d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  } else {
8388d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    HBasicBlock* successor;
8398d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    if (current->IsControlInstruction() &&
8408d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
8418d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        successor != NULL) {
8428d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = new(zone()) LGoto(successor);
8438d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    } else {
8448d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = current->CompileToLithium(this);
8458d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    }
846d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  }
847d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
848d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  argument_count_ += current->argument_delta();
849e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ >= 0);
850a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
851a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (instr != NULL) {
852011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(instr, current);
853011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
854011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
855011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  current_instruction_ = old_current;
856011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
857011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
858011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
859011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr,
860011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org                                   HInstruction* hydrogen_val) {
861011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Associate the hydrogen instruction first, since we may need it for
862011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
863011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  instr->set_hydrogen_value(hydrogen_val);
864fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
865f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG
866011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Make sure that the lithium instruction has either no fixed register
867011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // constraints in temps or the result OR no uses that are only used at
868011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // start. If this invariant doesn't hold, the register allocator can decide
869011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // to insert a split of a range immediately before the instruction due to an
870011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // already allocated register needing to be used for the instruction's fixed
871011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // register constraint. In this case, The register allocator won't see an
872011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // interference between the split child and the use-at-start (it would if
873011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the it was just a plain use), so it is free to move the split child into
874011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the same register that is used for the use-at-start.
875011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // See https://code.google.com/p/chromium/issues/detail?id=201590
876011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (!(instr->ClobbersRegisters() &&
877011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org        instr->ClobbersDoubleRegisters(isolate()))) {
878011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int fixed = 0;
879011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int used_at_start = 0;
880011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (UseIterator it(instr); !it.Done(); it.Advance()) {
881011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
882011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->IsUsedAtStart()) ++used_at_start;
883011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
884011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instr->Output() != NULL) {
885011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
886011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
887011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (TempIterator it(instr); !it.Done(); it.Advance()) {
888011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
889011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->HasFixedPolicy()) ++fixed;
890f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
891e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(fixed == 0 || used_at_start == 0);
892011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
893f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif
894f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
895011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
896011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignPointerMap(instr);
897011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
898011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_environments && !instr->HasEnvironment()) {
899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignEnvironment(instr);
900011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
901011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  chunk_->AddInstruction(instr, current_block_);
902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
903011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (instr->IsCall()) {
904011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    HValue* hydrogen_value_for_lazy_bailout = hydrogen_val;
905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* instruction_needing_environment = NULL;
906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (hydrogen_val->HasObservableSideEffects()) {
907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      HSimulate* sim = HSimulate::cast(hydrogen_val->next());
908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment = instr;
909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      sim->ReplayEnvironment(current_block_->last_environment());
910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      hydrogen_value_for_lazy_bailout = sim;
911a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
912011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
913011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
914011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    chunk_->AddInstruction(bailout, current_block_);
915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instruction_needing_environment != NULL) {
916011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Store the lazy deopt environment with the instruction if needed.
917011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Right now it is only used for LInstanceOfKnownGlobal.
918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment->
919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org          SetDeferredLazyDeoptimizationEnvironment(bailout->environment());
920486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    }
921a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
922a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
923a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
924a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
925a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
926d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return new(zone()) LGoto(instr->FirstSuccessor());
927a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
928a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
929a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
9304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
931d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  HValue* value = instr->value();
932ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  Representation r = value->representation();
933f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HType type = value->type();
9341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ToBooleanStub::Types expected = instr->expected_input_types();
935ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic();
936ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
937ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
938ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
939ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* branch = new(zone()) LBranch(UseRegister(value));
940ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (!easy_case &&
941ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) ||
942ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org       !expected.IsGeneric())) {
943ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    branch = AssignEnvironment(branch);
944f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
945ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return branch;
946a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
947a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
948a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
9494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
9504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  return new(zone()) LDebugBreak();
9514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org}
9524e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
953ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org
9540a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
955e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
956a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
9575d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org  LOperand* temp = TempRegister();
958812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LCmpMapAndBranch(value, temp);
959a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
960a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
961a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
962812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) {
96377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
964812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegister(instr->value());
965812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return DefineAsRegister(new(zone()) LArgumentsLength(value));
966a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
97077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
971b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org  return DefineAsRegister(new(zone()) LArgumentsElements);
972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
973a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
974a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
975a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
976c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
9770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  LInstanceOf* result =
978c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LInstanceOf(context, UseFixed(instr->left(), r0),
979c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org                              UseFixed(instr->right(), r1));
980a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
981a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
982a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
983a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
984d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
985d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    HInstanceOfKnownGlobal* instr) {
9860a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  LInstanceOfKnownGlobal* result =
987c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LInstanceOfKnownGlobal(
988c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org          UseFixed(instr->context(), cp),
989c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org          UseFixed(instr->left(), r0),
990c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org          FixedTemp(r4));
9919ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
992d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
993d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
994d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
995154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
996154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* receiver = UseRegisterAtStart(instr->receiver());
997154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
998154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
999ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(result));
1000154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}
1001154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1002154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1003a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1004a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* function = UseFixed(instr->function(), r1);
1005a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* receiver = UseFixed(instr->receiver(), r0);
1006496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* length = UseFixed(instr->length(), r2);
1007496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* elements = UseFixed(instr->elements(), r3);
1008812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LApplyArguments* result = new(zone()) LApplyArguments(function,
10090a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org                                                receiver,
10100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org                                                length,
10110a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org                                                elements);
1012a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY);
1013a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1014a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1015a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1016011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
1017011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  int argc = instr->OperandCount();
1018011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  for (int i = 0; i < argc; ++i) {
1019011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LOperand* argument = Use(instr->argument(i));
1020011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(new(zone()) LPushArgument(argument), instr);
1021011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
1022011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return NULL;
1023a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1024a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1025a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1026662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry(
1027662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    HStoreCodeEntry* store_code_entry) {
1028662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* function = UseRegister(store_code_entry->function());
1029662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
1030662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  return new(zone()) LStoreCodeEntry(function, code_object);
1031662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
1032662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1033662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
10342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject(
1035ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org    HInnerAllocatedObject* instr) {
1036ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* base_object = UseRegisterAtStart(instr->base_object());
1037ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
1038ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  return DefineAsRegister(
1039ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org      new(zone()) LInnerAllocatedObject(base_object, offset));
10402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org}
10412bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
10422bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
1043d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
1044812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return instr->HasNoUses()
1045812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      ? NULL
1046812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      : DefineAsRegister(new(zone()) LThisFunction);
1047d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
1048d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
1049d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
105083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) {
1051c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (instr->HasNoUses()) return NULL;
1052c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1053c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (info()->IsStub()) {
1054c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    return DefineFixed(new(zone()) LContext, cp);
10554cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  }
10564cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
1057c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return DefineAsRegister(new(zone()) LContext);
105883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
105983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
106083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
106156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
1062c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1063c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
106456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org}
106556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
106656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
106726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction(
106826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HCallJSFunction* instr) {
106926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function = UseFixed(instr->function(), r1);
107026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
107126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LCallJSFunction* result = new(zone()) LCallJSFunction(function);
107226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
107326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
107426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
107526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
107626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
107726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor(
107826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HCallWithDescriptor* instr) {
10799aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  CallInterfaceDescriptor descriptor = instr->descriptor();
108026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
108126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
108226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
108326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ops.Add(target, zone());
108426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 1; i < instr->OperandCount(); i++) {
10859aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    LOperand* op =
10869aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org        UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1));
108726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    ops.Add(op, zone());
108826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
108926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
109026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
109126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org      descriptor, ops, zone());
109226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
1093a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1094a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1095a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1096e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache(
1097e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    HTailCallThroughMegamorphicCache* instr) {
1098e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1099e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* receiver_register =
1100e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister());
1101e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* name_register =
1102e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->name(), LoadDescriptor::NameRegister());
1103e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  // Not marked as call. It can't deoptimize, and it never returns.
1104e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return new (zone()) LTailCallThroughMegamorphicCache(
1105e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      context, receiver_register, name_register);
1106e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
1107e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1108e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1109160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1110c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1111160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  LOperand* function = UseFixed(instr->function(), r1);
1112c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
1113160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1114160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}
1115160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1116160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  switch (instr->op()) {
1119dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFloor:
1120dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathFloor(instr);
1121dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathRound:
1122dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathRound(instr);
1123dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFround:
1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathFround(instr);
1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathAbs:
1126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathAbs(instr);
1127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathLog:
1128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathLog(instr);
1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathExp:
1130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathExp(instr);
1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathSqrt:
1132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathSqrt(instr);
1133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathPowHalf:
1134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathPowHalf(instr);
1135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathClz32:
1136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathClz32(instr);
1137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    default:
1138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      UNREACHABLE();
1139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return NULL;
1140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
1145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathFloor* result = new(zone()) LMathFloor(input);
1147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
1148e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1151e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
1152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1153d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp = TempDoubleRegister();
1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathRound* result = new(zone()) LMathRound(input, temp);
1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return AssignEnvironment(DefineAsRegister(result));
1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1159dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) {
1160dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LOperand* input = UseRegister(instr->value());
1161dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LMathFround* result = new (zone()) LMathFround(input);
1162dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  return DefineAsRegister(result);
1163dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org}
1164dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
1165dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
1166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
1167c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  Representation r = instr->value()->representation();
1168c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32())
1169c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      ? NULL
1170c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      : UseFixed(instr->context(), cp);
1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1172ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* result =
1173ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      DefineAsRegister(new(zone()) LMathAbs(context, input));
1174ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
1175ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (!r.IsDouble()) result = AssignEnvironment(result);
1176ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1181e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsDouble());
11834f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  LOperand* input = UseFixedDouble(instr->value(), d0);
11844f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), d0), instr);
1185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
1189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LMathClz32* result = new(zone()) LMathClz32(input);
1191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(result);
1192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1194f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1196e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1197e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsDouble());
11983d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  LOperand* input = UseRegister(instr->value());
1199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp1 = TempRegister();
1200e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp2 = TempRegister();
1201d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* double_temp = TempDoubleRegister();
1202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2);
1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineAsRegister(result);
1204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
12089f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathSqrt* result = new(zone()) LMathSqrt(input);
1210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineAsRegister(result);
1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
12159f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
12169f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  LMathPowHalf* result = new(zone()) LMathPowHalf(input);
12179f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  return DefineAsRegister(result);
1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1221a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
1222c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1223a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), r1);
1224c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LCallNew* result = new(zone()) LCallNew(context, constructor);
1225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
1226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1227a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
12294a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
1230c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
12314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), r1);
1232c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
12334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
12344a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
12354a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
12364a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1238c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1239c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  LOperand* function = UseFixed(instr->function(), r1);
1240ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  LCallFunction* call = new(zone()) LCallFunction(context, function);
1241a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  return MarkAsCall(DefineFixed(call, r0), instr);
1242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1243a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1244a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1246c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1247c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), r0), instr);
1248a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1251e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) {
1252e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  return DoShift(Token::ROR, instr);
1253e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1254e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1255e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1256a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) {
1257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return DoShift(Token::SHR, instr);
1258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1259a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1260a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1261a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) {
1262a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return DoShift(Token::SAR, instr);
1263a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1264a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1266a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) {
1267a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return DoShift(Token::SHL, instr);
1268a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1269a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1271c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1272fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1273e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1274e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1275e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
1276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1277906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1278906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
1279812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LBitI(left, right));
1280c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1281528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(instr->op(), instr);
1282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1283a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1284a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1286ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1287e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1288e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1289e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1290ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1291ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1292486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
1293486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1294486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1295486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
1296ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
1297486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org       divisor != 1 && divisor != -1)) {
1298486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1299486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1300486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1301ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1302ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1303ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1304bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1307e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1308bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1309bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1310486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI(
1311486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1312486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (divisor == 0 ||
1313486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1314486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
1315486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1316486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1317486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1318bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1319bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1320bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1321ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) {
1322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1324e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1325ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1326ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1327d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp =
1328d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister();
1329ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* result =
1330ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp));
1331ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1332ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1333ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) &&
1334ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org       (!CpuFeatures::IsSupported(SUDIV) ||
1335ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) ||
1336ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      (!instr->IsMathFloorOfDiv() &&
1337ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) {
1338ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
1339ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
1340ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
1341ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1342ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1343ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1345528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1346bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
1347bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivByPowerOf2I(instr);
1348bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
1349bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivByConstI(instr);
1350bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else {
1351bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivI(instr);
1352bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
1353528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1354528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticD(Token::DIV, instr);
1355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1356a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::DIV, instr);
1357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1358a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1359a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1361ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1362ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1363ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1364381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I(
1365381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org          dividend, divisor));
1366381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1367381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1368381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    result = AssignEnvironment(result);
1369381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
1370381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return result;
1371ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1372af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1373ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1374ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1375e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1376e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1377e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1378a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  LOperand* dividend = UseRegister(instr->left());
1379bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
13807010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LOperand* temp =
13817010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
13827010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
13837010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      NULL : TempRegister();
13847010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LInstruction* result = DefineAsRegister(
13857010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      new(zone()) LFlooringDivByConstI(dividend, divisor, temp));
13867010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  if (divisor == 0 ||
13877010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
13887010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    result = AssignEnvironment(result);
13897010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  }
13907010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  return result;
1391ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1392ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1393ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1394ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1395e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1396e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1397e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1398ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1399ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1400d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp =
1401d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister();
1402ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor, temp);
1403ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(div));
1404ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org}
1405ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
1406ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
1407ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1408ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (instr->RightIsPowerOf2()) {
1409ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return DoFlooringDivByPowerOf2I(instr);
14107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  } else if (instr->right()->IsConstant()) {
14117010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    return DoFlooringDivByConstI(instr);
1412ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  } else {
1413ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    return DoFlooringDivI(instr);
1414ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1415ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1416ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1417ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1418ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1420e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1421e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1423ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1424486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1425486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1426e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1427e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1428486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1429486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1430486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1431ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1432ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1433ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1434bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1435e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1436e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1437e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1438bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1439bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1440486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModByConstI(
1441486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1442486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1443486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1444486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1445486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1446bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1447bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1448bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1449ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1450e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1451e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1452e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1453486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LOperand* dividend = UseRegister(instr->left());
1454486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LOperand* divisor = UseRegister(instr->right());
1455d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp =
1456d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister();
1457d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp2 =
1458d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister();
1459486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModI(
1460486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp, temp2));
1461486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1462486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1463486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1464ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1465486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1466efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
1467efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
1468efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
1469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1470fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1471bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
1472bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModByPowerOf2I(instr);
1473bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
1474bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModByConstI(instr);
1475bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else {
1476bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModI(instr);
1477bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
1478528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1479528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticD(Token::MOD, instr);
14802f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org  } else {
1481528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(Token::MOD, instr);
1482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1487fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1488e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1489e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1490639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    HValue* left = instr->BetterLeftOperand();
1491639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    HValue* right = instr->BetterRightOperand();
1492639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    LOperand* left_op;
1493639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    LOperand* right_op;
1494639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1495639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero);
1496639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org
1497639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    if (right->IsConstant()) {
1498639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      HConstant* constant = HConstant::cast(right);
1499639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      int32_t constant_value = constant->Integer32Value();
1500639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      // Constants -1, 0 and 1 can be optimized if the result can overflow.
1501639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      // For other constants, it can be optimized only without overflow.
1502639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) {
1503639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        left_op = UseRegisterAtStart(left);
1504639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        right_op = UseConstant(right);
1505639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      } else {
1506639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        if (bailout_on_minus_zero) {
1507639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org          left_op = UseRegister(left);
1508639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        } else {
1509639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org          left_op = UseRegisterAtStart(left);
1510639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        }
1511639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        right_op = UseRegister(right);
1512639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      }
15133cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org    } else {
1514639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      if (bailout_on_minus_zero) {
1515639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        left_op = UseRegister(left);
1516639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      } else {
1517639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org        left_op = UseRegisterAtStart(left);
1518639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      }
1519639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org      right_op = UseRegister(right);
1520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1521639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    LMulI* mul = new(zone()) LMulI(left_op, right_op);
1522639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    if (can_overflow || bailout_on_minus_zero) {
1523f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      AssignEnvironment(mul);
1524f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    }
1525f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    return DefineAsRegister(mul);
1526d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com
1527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (instr->representation().IsDouble()) {
15284b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    if (instr->HasOneUse() && (instr->uses().value()->IsAdd() ||
15294b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org                               instr->uses().value()->IsSub())) {
15308432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      HBinaryOperation* use = HBinaryOperation::cast(instr->uses().value());
15318432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
15328432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      if (use->IsAdd() && instr == use->left()) {
15338432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        // This mul is the lhs of an add. The add and mul will be folded into a
15348432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        // multiply-add in DoAdd.
1535fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org        return NULL;
1536fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      }
15378432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      if (instr == use->right() && use->IsAdd() && !use->left()->IsMul()) {
1538fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org        // This mul is the rhs of an add, where the lhs is not another mul.
15398432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        // The add and mul will be folded into a multiply-add in DoAdd.
15408432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        return NULL;
15418432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      }
15428432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      if (instr == use->right() && use->IsSub()) {
15438432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        // This mul is the rhs of a sub. The sub and mul will be folded into a
15448432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        // multiply-sub in DoSub.
1545fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org        return NULL;
1546fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      }
1547fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
1548d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com
1549fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    return DoArithmeticD(Token::MUL, instr);
1550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::MUL, instr);
1552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) {
1557fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1558e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1559e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
15608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
15618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    if (instr->left()->IsConstant()) {
15628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      // If lhs is constant, do reverse subtraction instead.
15638e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      return DoRSub(instr);
15648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    }
15658e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
15660ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
15670ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
1568812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    LSubI* sub = new(zone()) LSubI(left, right);
15693cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org    LInstruction* result = DefineAsRegister(sub);
1570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
1571a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      result = AssignEnvironment(result);
1572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
1574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (instr->representation().IsDouble()) {
15754b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    if (instr->right()->IsMul() && instr->right()->HasOneUse()) {
15768432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      return DoMultiplySub(instr->left(), HMul::cast(instr->right()));
15778432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org    }
15788432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
1579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticD(Token::SUB, instr);
1580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::SUB, instr);
1582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1583a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1584a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
15858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
15868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgLInstruction* LChunkBuilder::DoRSub(HSub* instr) {
1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1588e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1589e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
15908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
15918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // Note: The lhs of the subtraction becomes the rhs of the
15928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  // reverse-subtraction.
15938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LOperand* left = UseRegisterAtStart(instr->right());
15948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LOperand* right = UseOrConstantAtStart(instr->left());
15958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LRSubI* rsb = new(zone()) LRSubI(left, right);
15968e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LInstruction* result = DefineAsRegister(rsb);
15978e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (instr->CheckFlag(HValue::kCanOverflow)) {
15988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    result = AssignEnvironment(result);
15998e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
16008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  return result;
16018e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
16028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
16038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
1604fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) {
1605fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  LOperand* multiplier_op = UseRegisterAtStart(mul->left());
1606fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  LOperand* multiplicand_op = UseRegisterAtStart(mul->right());
1607fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  LOperand* addend_op = UseRegisterAtStart(addend);
1608fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op,
1609fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                                     multiplicand_op));
1610fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
1611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
16128432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
16138432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.orgLInstruction* LChunkBuilder::DoMultiplySub(HValue* minuend, HMul* mul) {
16148432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  LOperand* minuend_op = UseRegisterAtStart(minuend);
16158432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  LOperand* multiplier_op = UseRegisterAtStart(mul->left());
16168432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  LOperand* multiplicand_op = UseRegisterAtStart(mul->right());
16178432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
16188432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  return DefineSameAsFirst(new(zone()) LMultiplySubD(minuend_op,
16198432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org                                                     multiplier_op,
16208432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org                                                     multiplicand_op));
16218432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org}
16228432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
16238432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
1624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1625fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1626e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1627e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1628906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1629906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
1630812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
16313cf47318da216c319ecf1f7a59de23455f117197vegorov@chromium.org    LInstruction* result = DefineAsRegister(add);
1632a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
1633a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      result = AssignEnvironment(result);
1634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
163637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  } else if (instr->representation().IsExternal()) {
1637e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsExternal());
1638e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsInteger32());
1639e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
164037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
164137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
164237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
164337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LInstruction* result = DefineAsRegister(add);
164437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return result;
1645a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (instr->representation().IsDouble()) {
16464b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    if (instr->left()->IsMul() && instr->left()->HasOneUse()) {
1647fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      return DoMultiplyAdd(HMul::cast(instr->left()), instr->right());
16488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org    }
1649fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
16504b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org    if (instr->right()->IsMul() && instr->right()->HasOneUse()) {
1651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(!instr->left()->IsMul() || !instr->left()->HasOneUse());
1652fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      return DoMultiplyAdd(HMul::cast(instr->right()), instr->left());
1653fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
1654fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
1655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticD(Token::ADD, instr);
1656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1657a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::ADD, instr);
1658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1660a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1661a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1662471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1663471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LOperand* left = NULL;
1664471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LOperand* right = NULL;
1665fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1666e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1667e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1668906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    left = UseRegisterAtStart(instr->BetterLeftOperand());
1669906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    right = UseOrConstantAtStart(instr->BetterRightOperand());
1670471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  } else {
1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->representation().IsDouble());
1672e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1673e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
1674471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    left = UseRegisterAtStart(instr->left());
1675471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    right = UseRegisterAtStart(instr->right());
1676471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1677471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  return DefineAsRegister(new(zone()) LMathMinMax(left, right));
1678471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
1679471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1680471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
16815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1682e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
16833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // We call a C function for double power. It can't trigger a GC.
16843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // We need to use fixed result register for the call.
16853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  Representation exponent_type = instr->right()->representation();
1686e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
16879f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  LOperand* left = UseFixedDouble(instr->left(), d0);
16886313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  LOperand* right =
16896313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      exponent_type.IsDouble()
16906313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org          ? UseFixedDouble(instr->right(), d1)
16916313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org          : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
1692812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LPower* result = new(zone()) LPower(left, right);
16939f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  return MarkAsCall(DefineFixedDouble(result, d2),
16943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                    instr,
16953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                    CAN_DEOPTIMIZE_EAGERLY);
16965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
16975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
16985f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
16994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1700e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1701e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
1702c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1703394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  LOperand* left = UseFixed(instr->left(), r1);
1704394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  LOperand* right = UseFixed(instr->right(), r0);
1705c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LCmpT* result = new(zone()) LCmpT(context, left, right);
17064f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
17074f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org}
17084f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
17094f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1710e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1711e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    HCompareNumericAndBranch* instr) {
1712fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation r = instr->representation();
1713c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  if (r.IsSmiOrInteger32()) {
1714e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(r));
1715e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(r));
1716394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
1717394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
1718e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
17194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  } else {
1720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(r.IsDouble());
1721e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1722e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
1723a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
1724a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
1725e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
1726a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1727a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1728a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1729a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
17314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HCompareObjectEqAndBranch* instr) {
1732a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* left = UseRegisterAtStart(instr->left());
1733a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* right = UseRegisterAtStart(instr->right());
1734812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LCmpObjectEqAndBranch(left, right);
17357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
17367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
17377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1738c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1739c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org    HCompareHoleAndBranch* instr) {
1740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1741528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return new(zone()) LCmpHoleAndBranch(value);
1742c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org}
1743c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
1744c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
17450cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch(
17460cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    HCompareMinusZeroAndBranch* instr) {
17470cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* value = UseRegister(instr->value());
17480cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* scratch = TempRegister();
17490cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return new(zone()) LCompareMinusZeroAndBranch(value, scratch);
17500cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org}
17510cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
17520cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
17534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1754e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1755812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
17564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  LOperand* temp = TempRegister();
1757812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsObjectAndBranch(value, temp);
17585f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
17595f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
17605f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
17610ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1762e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1763812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
17640ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* temp = TempRegister();
1765812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsStringAndBranch(value, temp);
17660ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
17670ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17680ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1770e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1771812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1772a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1773a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17754f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
17764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HIsUndetectableAndBranch* instr) {
1777e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1778812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1779812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsUndetectableAndBranch(value, TempRegister());
17807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
17817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
17827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
17830ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoStringCompareAndBranch(
17840ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HStringCompareAndBranch* instr) {
1785e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1786e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
1787c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
17880ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* left = UseFixed(instr->left(), r1);
17890ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* right = UseFixed(instr->right(), r0);
1790812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LStringCompareAndBranch* result =
1791c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LStringCompareAndBranch(context, left, right);
17920ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return MarkAsCall(result, instr);
17930ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
17940ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17964f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
17974f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HHasInstanceTypeAndBranch* instr) {
1798e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1799812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1800812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LHasInstanceTypeAndBranch(value);
1801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
180449edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
180549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    HGetCachedArrayIndex* instr)  {
1806e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
18078f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
180849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
1809812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
181049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org}
181149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
181249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
18134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
18144f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HHasCachedArrayIndexAndBranch* instr) {
1815e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1816812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LHasCachedArrayIndexAndBranch(
18174f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      UseRegisterAtStart(instr->value()));
1818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1820a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
18214f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
18224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HClassOfTestAndBranch* instr) {
1823e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1824812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegister(instr->value());
1825812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LClassOfTestAndBranch(value, TempRegister());
1826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1828a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1829355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
1830355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  LOperand* map = UseRegisterAtStart(instr->value());
1831355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  return DefineAsRegister(new(zone()) LMapEnumLength(map));
1832355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}
1833355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1834355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
18354efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
18364efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  LOperand* object = UseFixed(instr->value(), r0);
18377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  LDateField* result =
18387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      new(zone()) LDateField(object, FixedTemp(r1), instr->index());
1839de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY);
18404efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org}
18414efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
18424efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
1843e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
1844e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
1845e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1846e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
1847e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
1848e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1849e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
185032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
18519af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
18529af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* index = FLAG_debug_code
18539af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      ? UseRegisterAtStart(instr->index())
18549af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      : UseRegisterOrConstantAtStart(instr->index());
18559af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
18569af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL;
18579af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return new(zone()) LSeqStringSetChar(context, string, index, value);
185832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
185932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
186032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
1861a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1862a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code && instr->skip_check()) return NULL;
1863a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1864a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* length = !index->IsConstantOperand()
1865a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      ? UseRegisterOrConstantAtStart(instr->length())
1866a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      : UseRegisterAtStart(instr->length());
1867a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LInstruction* result = new(zone()) LBoundsCheck(index, length);
1868a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code || !instr->skip_check()) {
1869a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org    result = AssignEnvironment(result);
1870a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  }
1871a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  return result;
1872a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1873a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1874a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1875876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
1876876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    HBoundsCheckBaseIndexInformation* instr) {
1877876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  UNREACHABLE();
1878876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  return NULL;
1879876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
1880876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1881876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1882c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
1883c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  // The control instruction marking the end of a block that completed
1884c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  // abruptly (e.g., threw an exception).  There is nothing specific to do.
1885c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return NULL;
1886c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org}
1887c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1888c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1889d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
1890d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  return NULL;
1891d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
1892a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1893a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1894c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1895c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // All HForceRepresentation instructions should be eliminated in the
1896c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // representation change phase of Hydrogen.
1897c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  UNREACHABLE();
1898c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  return NULL;
1899c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org}
1900c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
1901c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
1902a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) {
1903a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Representation from = instr->from();
1904a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Representation to = instr->to();
1905ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  HValue* val = instr->value();
1906a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (from.IsSmi()) {
1907a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    if (to.IsTagged()) {
1908ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1909a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1910a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    }
1911a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    from = Representation::Tagged();
1912a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
1913a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (from.IsTagged()) {
1914a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (to.IsDouble()) {
1915ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1916ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value));
1917ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1918ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      return result;
1919a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1920a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      LOperand* value = UseRegister(val);
1921a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      if (val->type().IsSmi()) {
1922a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        return DefineSameAsFirst(new(zone()) LDummyUse(value));
1923a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      }
192453ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
1925a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1926e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
1927662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      if (val->type().IsSmi() || val->representation().IsSmi()) {
1928ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1929ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiUntag(value, false));
1930badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org      } else {
1931ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegister(val);
1932badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org        LOperand* temp1 = TempRegister();
1933d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        LOperand* temp2 = TempDoubleRegister();
1934ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LInstruction* result =
1935ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2));
19364edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1937ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return result;
1938a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
1939a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1940a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (from.IsDouble()) {
1941a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (to.IsTagged()) {
1942a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      info()->MarkAsDeferredCalling();
1943ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
19445f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      LOperand* temp1 = TempRegister();
19455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      LOperand* temp2 = TempRegister();
1946a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      LUnallocated* result_temp = TempRegister();
1947812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2);
1948ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      return AssignPointerMap(Define(result, result_temp));
1949a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1950ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
19511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org      return AssignEnvironment(
19521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
1953a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1954e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
1955ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1956ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value));
1957ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result);
1958ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      return result;
1959a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1960a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (from.IsInteger32()) {
1961a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    info()->MarkAsDeferredCalling();
1962a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (to.IsTagged()) {
1963381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      if (!instr->CheckFlag(HValue::kCanOverflow)) {
1964ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1965381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiTag(value));
1966381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      } else if (val->CheckFlag(HInstruction::kUint32)) {
1967ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1968bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp1 = TempRegister();
1969bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp2 = TempRegister();
1970bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
1971ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return AssignPointerMap(DefineAsRegister(result));
1972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      } else {
1973ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1974bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp1 = TempRegister();
1975bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp2 = TempRegister();
1976bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2);
1977ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return AssignPointerMap(DefineAsRegister(result));
1978a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
1979a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1980a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      LOperand* value = UseRegister(val);
1981381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
1982381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      if (instr->CheckFlag(HValue::kCanOverflow)) {
1983381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        result = AssignEnvironment(result);
1984a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      }
1985381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      return result;
1986a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1987e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsDouble());
1988ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
1989ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
199046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      } else {
1991ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val)));
199246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      }
1993a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1995a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  UNREACHABLE();
1996a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
1997a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1998a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1999a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
20001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
2001a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
20028f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  LInstruction* result = new(zone()) LCheckNonSmi(value);
2003eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  if (!instr->value()->type().IsHeapObject()) {
2004eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    result = AssignEnvironment(result);
2005eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  }
20068f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  return result;
2007a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2008a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2009a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2010e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
2011e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2012e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  return AssignEnvironment(new(zone()) LCheckSmi(value));
2013e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
2014e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2015e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2016a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
2017a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2018812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LInstruction* result = new(zone()) LCheckInstanceType(value);
2019a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return AssignEnvironment(result);
2020a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2021a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2022a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
20231f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
2024a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
20251f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  return AssignEnvironment(new(zone()) LCheckValue(value));
2026a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2027a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2028a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
20291456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
2030af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
2031af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2032af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
2033af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->HasMigrationTarget()) {
2034af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    info()->MarkAsDeferredCalling();
2035af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    result = AssignPointerMap(result);
2036594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
2037594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return result;
2038a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2039a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2040a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2041c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
2042c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  HValue* value = instr->value();
2043c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  Representation input_rep = value->representation();
2044c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  LOperand* reg = UseRegister(value);
2045c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  if (input_rep.IsDouble()) {
2046fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return DefineAsRegister(new(zone()) LClampDToUint8(reg));
2047c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  } else if (input_rep.IsInteger32()) {
2048812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LClampIToUint8(reg));
2049c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  } else {
2050e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(input_rep.IsSmiOrTagged());
2051c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    // Register allocator doesn't (yet) support allocation of double
2052c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    // temps. Reserve d1 explicitly.
2053d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    LClampTToUint8* result =
2054d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        new(zone()) LClampTToUint8(reg, TempDoubleRegister());
2055c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    return AssignEnvironment(DefineAsRegister(result));
2056c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
2057c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org}
2058c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2059c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2060ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) {
2061ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  HValue* value = instr->value();
2062e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(value->representation().IsDouble());
2063ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value)));
2064ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2065ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2066ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2067ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) {
2068ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* lo = UseRegister(instr->lo());
2069ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* hi = UseRegister(instr->hi());
2070ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LConstructDouble(hi, lo));
2071ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2072ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2073ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2074a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
2075c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = info()->IsStub()
2076c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      ? UseFixed(instr->context(), cp)
2077c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      : NULL;
20786e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
2079c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return new(zone()) LReturn(UseFixed(instr->value(), r0), context,
20806e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org                             parameter_count);
2081a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2082a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2083a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2084a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
2085a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Representation r = instr->representation();
2086b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (r.IsSmi()) {
2087b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    return DefineAsRegister(new(zone()) LConstantS);
2088b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else if (r.IsInteger32()) {
2089812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LConstantI);
2090a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (r.IsDouble()) {
2091812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LConstantD);
2092d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  } else if (r.IsExternal()) {
2093d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return DefineAsRegister(new(zone()) LConstantE);
2094b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else if (r.IsTagged()) {
2095812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LConstantT);
2096a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
2097c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    UNREACHABLE();
2098a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return NULL;
2099a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2103c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
2104812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell;
2105c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return instr->RequiresHoleCheck()
2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? AssignEnvironment(DefineAsRegister(result))
2107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : DefineAsRegister(result);
2108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2111c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
2112c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2113fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* global_object =
21149aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister());
21159d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
21169d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
21179aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
21189d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
2119c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LLoadGlobalGeneric* result =
21209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      new(zone()) LLoadGlobalGeneric(context, global_object, vector);
2121c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
2122c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
2123c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
2124c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
212574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
2126e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  LOperand* value = UseRegister(instr->value());
2127e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  // Use a temp to check the value in the cell in the case where we perform
2128e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  // a hole check.
2129e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  return instr->RequiresHoleCheck()
2130812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister()))
2131812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      : new(zone()) LStoreGlobalCell(value, NULL);
2132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2135c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
213683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* context = UseRegisterAtStart(instr->value());
2137812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LInstruction* result =
2138812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      DefineAsRegister(new(zone()) LLoadContextSlot(context));
2139ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2140ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
2141ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
2142ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
214383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
214483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
214583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
214683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
21473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  LOperand* context;
214883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* value;
214983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  if (instr->NeedsWriteBarrier()) {
21503a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    context = UseTempRegister(instr->context());
215183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    value = UseTempRegister(instr->value());
215283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  } else {
21533a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    context = UseRegister(instr->context());
215483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    value = UseRegister(instr->value());
215583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
2156812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LInstruction* result = new(zone()) LStoreContextSlot(context, value);
2157ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2158ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
2159ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
2160ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
2161c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
2162c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2163c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
2165f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  LOperand* obj = UseRegisterAtStart(instr->object());
2166f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
2167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2170a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
2171c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2172fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
21739aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
21749d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
21759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
21769aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
21779d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
21789d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
2179c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LInstruction* result =
21809d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), r0);
2181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(result, instr);
2182a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
21859e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
21869e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    HLoadFunctionPrototype* instr) {
21879e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  return AssignEnvironment(DefineAsRegister(
2188812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
21899e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org}
21909e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
21919e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
2192528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
2193528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return DefineAsRegister(new(zone()) LLoadRoot);
2194528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org}
2195528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
2196528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
2197e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
2198e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsSmiOrInteger32());
2199e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  ElementsKind elements_kind = instr->elements_kind();
2200717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
2201ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* result = NULL;
2202717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
22035c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!instr->is_typed_elements()) {
2204e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    LOperand* obj = NULL;
2205e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    if (instr->representation().IsDouble()) {
2206fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      obj = UseRegister(instr->elements());
2207e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    } else {
2208e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsSmiOrTagged());
2209e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org      obj = UseRegisterAtStart(instr->elements());
2210e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    }
2211ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key));
2212e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  } else {
2213e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(
2214e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org        (instr->representation().IsInteger32() &&
2215ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org         !IsDoubleOrFloatElementsKind(elements_kind)) ||
2216e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org        (instr->representation().IsDouble() &&
2217ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org         IsDoubleOrFloatElementsKind(elements_kind)));
22185c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    LOperand* backing_store = UseRegister(instr->elements());
2219ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key));
2220e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
2221717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2222ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if ((instr->is_external() || instr->is_fixed_typed_array()) ?
2223ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      // see LCodeGen::DoLoadKeyedExternalArray
2224ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      ((elements_kind == EXTERNAL_UINT32_ELEMENTS ||
2225ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        elements_kind == UINT32_ELEMENTS) &&
2226ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org       !instr->CheckFlag(HInstruction::kUint32)) :
2227ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      // see LCodeGen::DoLoadKeyedFixedDoubleArray and
2228ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      // LCodeGen::DoLoadKeyedFixedArray
2229ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      instr->RequiresHoleCheck()) {
2230ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
2231ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
2232ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
2233496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org}
2234496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
2235496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
2236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
2237c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2238fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
22399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
22409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister());
22419d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
22429d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
22439aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
22449d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
2245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2246a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LInstruction* result =
22479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector),
22489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  r0);
2249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(result, instr);
2250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2251a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2253e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
22545c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!instr->is_typed_elements()) {
2255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->elements()->representation().IsTagged());
22568e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    bool needs_write_barrier = instr->NeedsWriteBarrier();
2257eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    LOperand* object = NULL;
22588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    LOperand* key = NULL;
22598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    LOperand* val = NULL;
22608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
2261eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    if (instr->value()->representation().IsDouble()) {
2262eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      object = UseRegisterAtStart(instr->elements());
2263528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      val = UseRegister(instr->value());
22648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      key = UseRegisterOrConstantAtStart(instr->key());
2265eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    } else {
2266e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsSmiOrTagged());
2267528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (needs_write_barrier) {
2268528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        object = UseTempRegister(instr->elements());
2269528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        val = UseTempRegister(instr->value());
2270528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        key = UseTempRegister(instr->key());
2271528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      } else {
2272528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        object = UseRegisterAtStart(instr->elements());
2273528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        val = UseRegisterAtStart(instr->value());
2274528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        key = UseRegisterOrConstantAtStart(instr->key());
2275528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
2276eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    }
2277eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
22788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    return new(zone()) LStoreKeyed(object, key, val);
2279e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
2280e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
2281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(
22828e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      (instr->value()->representation().IsInteger32() &&
22835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org       !IsDoubleOrFloatElementsKind(instr->elements_kind())) ||
22848e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      (instr->value()->representation().IsDouble() &&
22855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org       IsDoubleOrFloatElementsKind(instr->elements_kind())));
2286e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((instr->is_fixed_typed_array() &&
22875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instr->elements()->representation().IsTagged()) ||
22885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         (instr->is_external() &&
22895c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instr->elements()->representation().IsExternal()));
2290528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LOperand* val = UseRegister(instr->value());
22918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
22925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  LOperand* backing_store = UseRegister(instr->elements());
22935c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return new(zone()) LStoreKeyed(backing_store, key, val);
22943a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
22953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
22963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2297a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2298c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2299fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* obj =
23009aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
23019aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister());
23029aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2303a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2304e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->object()->representation().IsTagged());
2305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsTagged());
2306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
2307a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2308c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(
2309c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr);
2310a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2311a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2312a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2313394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comLInstruction* LChunkBuilder::DoTransitionElementsKind(
2314394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    HTransitionElementsKind* instr) {
2315003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
23162f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseRegister(instr->object());
2317394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* new_map_reg = TempRegister();
2318394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LTransitionElementsKind* result =
2319c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        new(zone()) LTransitionElementsKind(object, NULL, new_map_reg);
2320f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return result;
2321c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org  } else {
23222f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseFixed(instr->object(), r0);
2323c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
2324c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org    LTransitionElementsKind* result =
2325c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        new(zone()) LTransitionElementsKind(object, context, NULL);
23262f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    return MarkAsCall(result, instr);
2327394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
2328394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
2329394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2330394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
233194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento(
233294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    HTrapAllocationMemento* instr) {
233394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* object = UseRegister(instr->object());
233494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp = TempRegister();
233594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LTrapAllocationMemento* result =
233694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org      new(zone()) LTrapAllocationMemento(object, temp);
233794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  return AssignEnvironment(result);
233894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org}
233994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
234094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
234253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  bool is_in_object = instr->access().IsInobject();
2343d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  bool needs_write_barrier = instr->NeedsWriteBarrier();
2344594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool needs_write_barrier_for_map = instr->has_transition() &&
234537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      instr->NeedsWriteBarrierForMap();
234637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
234737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  LOperand* obj;
234837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  if (needs_write_barrier) {
234953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    obj = is_in_object
235037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        ? UseRegister(instr->object())
235137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        : UseTempRegister(instr->object());
235237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  } else {
235337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org    obj = needs_write_barrier_for_map
235437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        ? UseRegister(instr->object())
235537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        : UseRegisterAtStart(instr->object());
235637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  }
2357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
235857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  LOperand* val;
2359d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  if (needs_write_barrier) {
236057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    val = UseTempRegister(instr->value());
2361bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  } else if (instr->field_representation().IsDouble()) {
236257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    val = UseRegisterAtStart(instr->value());
236357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  } else {
236457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    val = UseRegister(instr->value());
236557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
2366a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
236737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // We need a temporary register for write barrier of the map field.
236837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL;
236937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
2370d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return new(zone()) LStoreNamedField(obj, val, temp);
2371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2375c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2376fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* obj =
23779aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
23789aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2379a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2380c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val);
2381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(result, instr);
2382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2384a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2385160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2386c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2387bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  LOperand* left = UseFixed(instr->left(), r1);
2388bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  LOperand* right = UseFixed(instr->right(), r0);
2389c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(
2390c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      DefineFixed(new(zone()) LStringAdd(context, left, right), r0),
2391c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      instr);
2392160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}
2393160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
2394160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
23950a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
23964668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  LOperand* string = UseTempRegister(instr->string());
23974668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  LOperand* index = UseTempRegister(instr->index());
2398c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2399c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LStringCharCodeAt* result =
2400c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LStringCharCodeAt(context, string, index);
2401ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
24020a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
24030a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
24040a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
2405b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
2406b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  LOperand* char_code = UseRegister(instr->value());
2407c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2408c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LStringCharFromCode* result =
2409c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      new(zone()) LStringCharFromCode(context, char_code);
2410b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  return AssignPointerMap(DefineAsRegister(result));
2411b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org}
2412b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
2413b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
241494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
241594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  info()->MarkAsDeferredCalling();
2416c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseAny(instr->context());
241708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  LOperand* size = UseRegisterOrConstant(instr->size());
241894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp1 = TempRegister();
241994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp2 = TempRegister();
2420c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2);
242194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  return AssignPointerMap(DefineAsRegister(result));
242294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org}
242394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
242494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2425a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
2426c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2427c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(
2428c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      DefineFixed(new(zone()) LRegExpLiteral(context), r0), instr);
2429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
2433c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2434c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(
2435c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      DefineFixed(new(zone()) LFunctionLiteral(context), r0), instr);
2436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2440e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ == 0);
2441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  allocator_->MarkAsOsrEntry();
2442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_->last_environment()->set_ast_id(instr->ast_id());
2443812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return AssignEnvironment(new(zone()) LOsrEntry);
2444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2448a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  LParameter* result = new(zone()) LParameter;
24492f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org  if (instr->kind() == HParameter::STACK_PARAMETER) {
2450a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    int spill_index = chunk()->GetParameterStackSlot(instr->index());
2451a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return DefineAsSpilled(result, spill_index);
2452a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  } else {
2453e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(info()->IsStub());
2454e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    CallInterfaceDescriptor descriptor =
2455e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org        info()->code_stub()->GetCallInterfaceDescriptor();
2456ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    int index = static_cast<int>(instr->index());
245742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org    Register reg = descriptor.GetEnvironmentParameterRegister(index);
2458a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return DefineFixed(result, reg);
2459a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
2460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2464c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // Use an index that corresponds to the location in the unoptimized frame,
2465c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // which the optimized frame will subsume.
2466c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  int env_index = instr->index();
2467c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  int spill_index = 0;
2468c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (instr->environment()->is_parameter_index(env_index)) {
2469c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    spill_index = chunk()->GetParameterStackSlot(env_index);
2470c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  } else {
2471c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    spill_index = env_index - instr->environment()->first_local_index();
2472c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2473b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      Retry(kTooManySpillSlotsNeededForOSR);
2474c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      spill_index = 0;
2475c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
247604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
2477812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
2482c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2483c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), r0), instr);
2484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
24883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // There are no real uses of the arguments object.
24893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // arguments.length and element access are supported directly on
24903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // stack arguments, and any real arguments object use causes a bailout.
24913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // So this value is never used.
2492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
2493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2496594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
2497662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
24981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2499594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // There are no real uses of a captured object.
2500594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return NULL;
2501594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
2502594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
2503594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
2504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
250577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
2506c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* args = UseRegister(instr->arguments());
25077ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  LOperand* length = UseRegisterOrConstantAtStart(instr->length());
25087ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
2509c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
2510a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2511a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2512a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2514ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  LOperand* object = UseFixed(instr->value(), r0);
2515812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LToFastProperties* result = new(zone()) LToFastProperties(object);
2516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
2517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
2518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2521c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2522c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), r0));
2523a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr);
2524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
25274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
252837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  return new(zone()) LTypeofIsAndBranch(UseRegister(instr->value()));
2529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2531d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
25324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
25334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HIsConstructCallAndBranch* instr) {
2534812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsConstructCallAndBranch(TempRegister());
2535d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com}
2536d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2537d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2539662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
2540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
2541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
254504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  if (instr->is_function_entry()) {
2546c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
2547c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    return MarkAsCall(new(zone()) LStackCheck(context), instr);
254804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  } else {
2549e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->is_backwards_branch());
2550c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    LOperand* context = UseAny(instr->context());
2551c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    return AssignEnvironment(
2552c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        AssignPointerMap(new(zone()) LStackCheck(context)));
255304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
2554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
2558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HEnvironment* outer = current_block_->last_environment();
2559f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  outer->set_ast_id(instr->ReturnId());
2560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HConstant* undefined = graph()->GetConstantUndefined();
2561a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
2562659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org                                               instr->arguments_count(),
2563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                               instr->function(),
256440cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org                                               undefined,
2565e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org                                               instr->inlining_kind());
2566b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  // Only replay binding of arguments object if it wasn't removed from graph.
2567b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
2568b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    inner->Bind(instr->arguments_var(), instr->arguments_object());
25698c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org  }
2570ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  inner->BindContext(instr->closure_context());
257156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  inner->set_entry(instr);
2572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_->UpdateEnvironment(inner);
2573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  chunk_->AddInlinedClosure(instr->closure());
2574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
2575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
257928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  LInstruction* pop = NULL;
258028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
258128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  HEnvironment* env = current_block_->last_environment();
258228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
258333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (env->entry()->arguments_pushed()) {
258428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    int argument_count = env->arguments_environment()->parameter_count();
258528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    pop = new(zone()) LDrop(argument_count);
2586e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->argument_delta() == -argument_count);
258728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  }
258828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
2589659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  HEnvironment* outer = current_block_->last_environment()->
2590659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org      DiscardInlined(false);
2591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_->UpdateEnvironment(outer);
259228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
259328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  return pop;
2594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2597be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2598c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2599be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* object = UseFixed(instr->enumerable(), r0);
2600c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
2601be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  return MarkAsCall(DefineFixed(result, r0), instr, CAN_DEOPTIMIZE_EAGERLY);
2602be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2603be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2604be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2605be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
2606be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* map = UseRegister(instr->map());
260789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map)));
2608be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2609be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2610be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2611be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
2612be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2613be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* map = UseRegisterAtStart(instr->map());
2614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
2615be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2616be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2617be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2618be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2619be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* object = UseRegister(instr->object());
2620a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org  LOperand* index = UseTempRegister(instr->index());
262163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
262263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  LInstruction* result = DefineSameAsFirst(load);
262363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  return AssignPointerMap(result);
2624be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2625be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
26261e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
26281e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseRegisterAtStart(instr->context());
26291e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return new(zone()) LStoreFrameContext(context);
26301e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
26311e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26321e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26331e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext(
26341e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    HAllocateBlockContext* instr) {
26351e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
26361e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
26371e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LAllocateBlockContext* result =
26381e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      new(zone()) LAllocateBlockContext(context, function);
26391e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, cp), instr);
26401e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
26411e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
2642a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} }  // namespace v8::internal
2643