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