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.
4c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if V8_TARGET_ARCH_MIPS
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
94b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/hydrogen-osr.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/mips/lithium-codegen-mips.h"
12c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
13c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgnamespace v8 {
14c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgnamespace internal {
15c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
16c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DEFINE_COMPILE(type)                            \
17c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void L##type::CompileToNative(LCodeGen* generator) {  \
18c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    generator->Do##type(this);                          \
19c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
20c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
21c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DEFINE_COMPILE
22c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
23c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
24c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::VerifyCall() {
25c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Call instructions can use only fixed registers as temporaries and
26c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // outputs because all registers are blocked by the calling convention.
27c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Inputs operands must use a fixed register or use-at-start policy or
28c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // a non-register policy.
29e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(Output() == NULL ||
30c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org         LUnallocated::cast(Output())->HasFixedPolicy() ||
31c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org         !LUnallocated::cast(Output())->HasRegisterPolicy());
32c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  for (UseIterator it(this); !it.Done(); it.Advance()) {
33c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
34e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||
35c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org           operand->IsUsedAtStart());
36c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
37c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  for (TempIterator it(this); !it.Done(); it.Advance()) {
38c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
39e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
40c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
41c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
42c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
43c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
44c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
45c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) {
46c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("%s ", this->Mnemonic());
47c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
48c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  PrintOutputOperandTo(stream);
49c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
50c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  PrintDataTo(stream);
51c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
52c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (HasEnvironment()) {
53c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    stream->Add(" ");
54c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    environment()->PrintTo(stream);
55c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
56c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
57c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (HasPointerMap()) {
58c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    stream->Add(" ");
59c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    pointer_map()->PrintTo(stream);
60c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
61c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
62c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
63c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
6488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) {
65c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("= ");
6688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  for (int i = 0; i < InputCount(); i++) {
67c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (i > 0) stream->Add(" ");
684cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    if (InputAt(i) == NULL) {
694cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      stream->Add("NULL");
704cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    } else {
714cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      InputAt(i)->PrintTo(stream);
724cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    }
73c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
74c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
75c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
76c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
7788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
7888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  if (HasResult()) result()->PrintTo(stream);
79c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
80c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
81c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
82c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) {
83c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LGap::PrintDataTo(stream);
84c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLabel* rep = replacement();
85c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (rep != NULL) {
86c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    stream->Add(" Dead block replaced with B%d", rep->block_id());
87c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
88c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
89c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
90c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
91c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgbool LGap::IsRedundant() const {
92c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  for (int i = 0; i < 4; i++) {
93c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
94c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      return false;
95c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
96c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
97c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
98c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return true;
99c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
101c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
102c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) {
103c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  for (int i = 0; i < 4; i++) {
104c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    stream->Add("(");
105c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (parallel_moves_[i] != NULL) {
106c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      parallel_moves_[i]->PrintDataTo(stream);
107c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
108c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    stream->Add(") ");
109c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
110c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
111c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
112c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
113c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgconst char* LArithmeticD::Mnemonic() const {
114c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  switch (op()) {
115c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::ADD: return "add-d";
116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::SUB: return "sub-d";
117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::MUL: return "mul-d";
118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::DIV: return "div-d";
119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::MOD: return "mod-d";
120c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    default:
121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      UNREACHABLE();
122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      return NULL;
123c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
124c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
125c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
126c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
127c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgconst char* LArithmeticT::Mnemonic() const {
128c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  switch (op()) {
129c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::ADD: return "add-t";
130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::SUB: return "sub-t";
131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::MUL: return "mul-t";
132c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::MOD: return "mod-t";
133c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::DIV: return "div-t";
134c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::BIT_AND: return "bit-and-t";
135c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::BIT_OR: return "bit-or-t";
136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::BIT_XOR: return "bit-xor-t";
137fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    case Token::ROR: return "ror-t";
138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::SHL: return "sll-t";
139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::SAR: return "sra-t";
140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    case Token::SHR: return "srl-t";
141c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    default:
142c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      UNREACHABLE();
143c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      return NULL;
144c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
146c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
14832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const {
14932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return !gen->IsNextEmittedBlock(block_id());
15032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
15132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
15232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
153c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) {
154c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("B%d", block_id());
155c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
156c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
158c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) {
159c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
160c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
161c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
162c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
163c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1644e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
1654e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  return new(zone()) LDebugBreak();
1664e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org}
1674e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
168e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
169e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if ");
171c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  left()->PrintTo(stream);
172c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" %s ", Token::String(op()));
173c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  right()->PrintTo(stream);
174c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
175c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
176c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
177c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
178c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
179c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if is_object(");
180c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
181c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
182c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
183c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
184c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
185f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
186f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  stream->Add("if is_string(");
187c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
188f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
189f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org}
190f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
191f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
192c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
193c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if is_smi(");
194c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
196c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
197c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
198c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
199c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
200c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if is_undetectable(");
201c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
202c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
203c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
204c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
205c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
206f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
207f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  stream->Add("if string_compare(");
208c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  left()->PrintTo(stream);
209c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  right()->PrintTo(stream);
210f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
211f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org}
212f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
213f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
214c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
215c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if has_instance_type(");
216c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
217c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
218c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
219c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
220c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
221c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
222c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if has_cached_array_index(");
223c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
224c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
225c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
226c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
227c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
228c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
229c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if class_of_test(");
230c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(", \"%o\") then B%d else B%d",
232c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org              *hydrogen()->class_name(),
233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org              true_block_id(),
234c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org              false_block_id());
235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
237c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
238c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("if typeof ");
240c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
241c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" == \"%s\" then B%d else B%d",
242afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org              hydrogen()->type_literal()->ToCString().get(),
243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org              true_block_id(), false_block_id());
244c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
246c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
247662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
248662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  stream->Add(" = ");
249662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  function()->PrintTo(stream);
250662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  stream->Add(".code_entry = ");
251662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  code_object()->PrintTo(stream);
252662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
253662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
254662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
2554c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
2564c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org  stream->Add(" = ");
2574c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org  base_object()->PrintTo(stream);
258ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  stream->Add(" + ");
259ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  offset()->PrintTo(stream);
2604c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org}
2614c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
2624c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
26326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) {
26426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  stream->Add("= ");
26526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  function()->PrintTo(stream);
26626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  stream->Add("#%d / ", arity());
26726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
26826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
26926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
27026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
27126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 0; i < InputCount(); i++) {
27226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    InputAt(i)->PrintTo(stream);
27326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    stream->Add(" ");
27426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("#%d / ", arity());
276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
280c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  context()->PrintTo(stream);
281c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("[%d]", slot_index());
282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
283c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
284c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
285c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
286c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  context()->PrintTo(stream);
287c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("[%d] <- ", slot_index());
288c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  value()->PrintTo(stream);
289c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("= ");
294c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  function()->PrintTo(stream);
295c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" #%d / ", arity());
296c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
298c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
299c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) {
300c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("= ");
301c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  constructor()->PrintTo(stream);
302c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" #%d / ", arity());
303c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
304c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
305c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
306750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) {
307750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  stream->Add("= ");
308750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  constructor()->PrintTo(stream);
309750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  stream->Add(" #%d / ", arity());
31007237aaaed914a17c1afd64234883bff619581d5palfia@homejinni.com  ElementsKind kind = hydrogen()->elements_kind();
311750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  stream->Add(" (%s) ", ElementsKindToString(kind));
312750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
313750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
314750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
315c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
316c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  arguments()->PrintTo(stream);
317c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" length ");
318c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  length()->PrintTo(stream);
319c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" index ");
320c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  index()->PrintTo(stream);
321c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
322c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
323c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
324c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
325c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  object()->PrintTo(stream);
326f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OStringStream os;
327f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << hydrogen()->access() << " <- ";
328f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  stream->Add(os.c_str());
329c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  value()->PrintTo(stream);
330c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
331c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
332c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
333c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
334c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  object()->PrintTo(stream);
335c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(".");
336afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  stream->Add(String::cast(*name())->ToCString().get());
337c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" <- ");
338c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  value()->PrintTo(stream);
339c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
340c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
341c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
3428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
343c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  elements()->PrintTo(stream);
344c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("[");
345c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  key()->PrintTo(stream);
3468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (hydrogen()->IsDehoisted()) {
347fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    stream->Add(" + %d]", base_offset());
3488e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  } else {
3498e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    stream->Add("]");
3508e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
352c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
353c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
3548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
3558e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  elements()->PrintTo(stream);
356c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add("[");
357c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  key()->PrintTo(stream);
3588e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (hydrogen()->IsDehoisted()) {
359fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    stream->Add(" + %d] <-", base_offset());
3608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  } else {
3618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    stream->Add("] <- ");
3628e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
36346d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com
36446d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com  if (value() == NULL) {
365e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(hydrogen()->IsConstantHoleStore() &&
36646d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com           hydrogen()->value()->representation().IsDouble());
36746d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com    stream->Add("<the hole(nan)>");
36846d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com  } else {
36946d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com    value()->PrintTo(stream);
37046d4fbda077e1b00e71e62d84d21f05003032e9dpalfia@homejinni.com  }
371c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
372c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
373c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
37483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
37583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  object()->PrintTo(stream);
37683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  stream->Add("[");
37783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  key()->PrintTo(stream);
37883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  stream->Add("] <- ");
37983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  value()->PrintTo(stream);
38083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org}
38183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
38283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
383c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
384c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  object()->PrintTo(stream);
385c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
386c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
387c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
388c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
389c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
390c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Skip a slot if for a double-width slot.
391c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (kind == DOUBLE_REGISTERS) spill_slot_count_++;
392c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return spill_slot_count_++;
393c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
394c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
396c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind)  {
397c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  int index = GetNextSpillIndex(kind);
398c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (kind == DOUBLE_REGISTERS) {
3997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    return LDoubleStackSlot::Create(index, zone());
400c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(kind == GENERAL_REGISTERS);
4027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    return LStackSlot::Create(index, zone());
403c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
404c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
405c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
406c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
40728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() {
408e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_unused());
40928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  chunk_ = new(zone()) LPlatformChunk(info(), graph());
4101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LPhase phase("L_Building chunk", chunk_);
411c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  status_ = BUILDING;
412c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
413c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // If compiling for OSR, reserve space for the unoptimized frame,
414c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // which will be subsumed into this frame.
415c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (graph()->has_osr()) {
416c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
417c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
418c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
419c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  }
420c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
421c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
422c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  for (int i = 0; i < blocks->length(); i++) {
423c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HBasicBlock* next = NULL;
424c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (i < blocks->length() - 1) next = blocks->at(i + 1);
425c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    DoBasicBlock(blocks->at(i), next);
426c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (is_aborted()) return NULL;
427c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
428c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  status_ = DONE;
429c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return chunk_;
430c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
431c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
432c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
433c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
434812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
435812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                  Register::ToAllocationIndex(reg));
436c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
437c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
438c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
439c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) {
440812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
441812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                  DoubleRegister::ToAllocationIndex(reg));
442c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
445c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
446c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value, ToUnallocated(fixed_register));
447c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
448c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
449c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
450c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) {
451c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value, ToUnallocated(reg));
452c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
453c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
454c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
455c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) {
456812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
457c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
458c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
461c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value,
462812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
463812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                      LUnallocated::USED_AT_START));
464c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
465c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
466c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
467c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
468812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
470c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
471c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) {
473812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
474c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
475c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
476c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
477c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) {
478812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
479c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                     LUnallocated::USED_AT_START));
480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
481c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
482c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
483c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
484c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return value->IsConstant()
485c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
486c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : Use(value);
487c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
488c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
489c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
490c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
491c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return value->IsConstant()
492c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : UseAtStart(value);
494c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
495c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
496c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
497c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
498c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return value->IsConstant()
499c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
500c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : UseRegister(value);
501c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
502c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
503c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return value->IsConstant()
506c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : UseRegisterAtStart(value);
508c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
509c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
511f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) {
512f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return chunk_->DefineConstantOperand(HConstant::cast(value));
513f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
514f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
515f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
516c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::UseAny(HValue* value) {
517c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return value->IsConstant()
518c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
519812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
520c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
524c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (value->EmitAtUses()) {
525c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HInstruction* instr = HInstruction::cast(value);
526c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    VisitInstruction(instr);
527c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
528994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  operand->set_virtual_register(value->id());
529c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return operand;
530c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
531c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
532c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
53326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
534c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                    LUnallocated* result) {
535994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  result->set_virtual_register(current_instruction_->id());
536c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  instr->set_result(result);
537c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return instr;
538c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
539c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
540c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
541c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister(
54226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
543812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Define(instr,
544812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
545c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
546c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
547c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled(
54926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr, int index) {
550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Define(instr,
551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
553c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
554c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
555c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst(
55626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
557812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return Define(instr,
558812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
559c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
560c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
561c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
562c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineFixed(
56326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr, Register reg) {
564c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Define(instr, ToUnallocated(reg));
565c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
566c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
567c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
568c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble(
56926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr, DoubleRegister reg) {
570c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Define(instr, ToUnallocated(reg));
571c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
572c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
573c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
574c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
575c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HEnvironment* hydrogen_env = current_block_->last_environment();
576c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int argument_index_accumulator = 0;
577594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  ZoneList<HValue*> objects_to_materialize(0, zone());
578c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  instr->set_environment(CreateEnvironment(hydrogen_env,
579594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                           &argument_index_accumulator,
580594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                           &objects_to_materialize));
581c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return instr;
582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
584c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
585c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
586c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                        HInstruction* hinstr,
587c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                        CanDeoptimize can_deoptimize) {
58859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  info()->MarkAsNonDeferredCalling();
589c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
590c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  instr->VerifyCall();
591c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
592c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  instr->MarkAsCall();
593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  instr = AssignPointerMap(instr);
594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
595c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // If instruction does not have side-effects lazy deoptimization
596c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // after the call will try to deoptimize to the point before the call.
597c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Thus we still need to attach environment to this call even if
598c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // call sequence can not deoptimize eagerly.
599c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool needs_environment =
600c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      !hinstr->HasObservableSideEffects();
602c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (needs_environment && !instr->HasEnvironment()) {
603c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    instr = AssignEnvironment(instr);
604da0c8284c47004231268322ae983e4bd2eb5aff8machenbach@chromium.org    // We can't really figure out if the environment is needed or not.
605da0c8284c47004231268322ae983e4bd2eb5aff8machenbach@chromium.org    instr->environment()->set_has_been_used();
606c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
607c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return instr;
609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
611c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
612c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
613e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!instr->HasPointerMap());
61471f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
615c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return instr;
616c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
617c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
618c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
619c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLUnallocated* LChunkBuilder::TempRegister() {
620812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LUnallocated* operand =
621812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
6222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  int vreg = allocator_->GetVirtualRegister();
6232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  if (!allocator_->AllocationOk()) {
624594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
62557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    vreg = 0;
6262bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  }
6272bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  operand->set_virtual_register(vreg);
628c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return operand;
629c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
631c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
632d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() {
633d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LUnallocated* operand =
634d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER);
635d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  int vreg = allocator_->GetVirtualRegister();
636d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (!allocator_->AllocationOk()) {
637d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
638d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    vreg = 0;
639d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
640d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  operand->set_virtual_register(vreg);
641d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return operand;
642d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
643d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
644d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
645c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) {
646c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LUnallocated* operand = ToUnallocated(reg);
647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
648c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return operand;
649c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
650c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
651c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
652c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) {
653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LUnallocated* operand = ToUnallocated(reg);
654e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
655c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return operand;
656c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
657c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
658c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
659c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
660812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LLabel(instr->block());
661c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
662c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
663c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
66446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
66546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
66646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
66746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
66846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
669d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
670d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  UNREACHABLE();
671d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return NULL;
672d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
673d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
674d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
675c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
676812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return AssignEnvironment(new(zone()) LDeoptimize);
677c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
678c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
679c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op,
681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                     HBitwiseBinaryOperation* instr) {
682528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
683e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
684e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
685528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
686c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
687528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    HValue* right_value = instr->right();
688528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = NULL;
689528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    int constant_value = 0;
690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    bool does_deopt = false;
691528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (right_value->IsConstant()) {
692528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      HConstant* constant = HConstant::cast(right_value);
693528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right = chunk_->DefineConstantOperand(constant);
694528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      constant_value = constant->Integer32Value() & 0x1f;
695528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      // Left shifts can deoptimize if we shift by > 0 and the result cannot be
696528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      // truncated to smi.
697528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (instr->representation().IsSmi() && constant_value > 0) {
698528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
699528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
700528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    } else {
701528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right = UseRegisterAtStart(right_value);
702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
7032f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
704528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // Shift operations can only deoptimize if we do a logical shift
705528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // by 0 and the result cannot be truncated to int32.
706528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (op == Token::SHR && constant_value == 0) {
707528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (FLAG_opt_safe_uint32_operations) {
708528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckFlag(HInstruction::kUint32);
709528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      } else {
710528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32);
711528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
7122f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org    }
7132f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
714528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LInstruction* result =
715528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt));
716528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return does_deopt ? AssignEnvironment(result) : result;
717528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else {
718528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(op, instr);
719528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
720c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
721c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
724c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                           HArithmeticBinaryOperation* instr) {
725e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
727e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsDouble());
728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (op == Token::MOD) {
729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseFixedDouble(instr->left(), f2);
730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = UseFixedDouble(instr->right(), f4);
731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
732528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // We call a C function for double modulo. It can't trigger a GC. We need
733528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // to use fixed result register for the call.
734528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // TODO(fschneider): Allow any register as input registers.
735528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return MarkAsCall(DefineFixedDouble(result, f2), instr);
736528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else {
737528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
738528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
739528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DefineAsRegister(result);
741528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
742c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
743c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
744c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
746528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                           HBinaryOperation* instr) {
747c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HValue* left = instr->left();
748c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HValue* right = instr->right();
749e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(left->representation().IsTagged());
750e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(right->representation().IsTagged());
751fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
752c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* left_operand = UseFixed(left, a1);
753c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* right_operand = UseFixed(right, a0);
754812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LArithmeticT* result =
755fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
758c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
759c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
761e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_building());
762c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  current_block_ = block;
763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  next_block_ = next_block;
764c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (block->IsStartBlock()) {
765c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    block->UpdateEnvironment(graph_->start_environment());
766c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    argument_count_ = 0;
767c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (block->predecessors()->length() == 1) {
768c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // We have a single predecessor => copy environment and outgoing
769c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // argument count from the predecessor.
770e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block->phis()->length() == 0);
771c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
772c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HEnvironment* last_environment = pred->last_environment();
773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(last_environment != NULL);
774c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // Only copy the environment, if it is later used again.
775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (pred->end()->SecondSuccessor() == NULL) {
776e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(pred->end()->FirstSuccessor() == block);
777c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else {
778c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
779c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
780c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        last_environment = last_environment->Copy();
781c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      }
782c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
783c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    block->UpdateEnvironment(last_environment);
784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(pred->argument_count() >= 0);
785c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    argument_count_ = pred->argument_count();
786c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
787c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // We are at a state join => process phis.
788c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
789c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // No need to copy the environment, it cannot be used later.
790c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HEnvironment* last_environment = pred->last_environment();
791c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    for (int i = 0; i < block->phis()->length(); ++i) {
792c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      HPhi* phi = block->phis()->at(i);
793ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org      if (phi->HasMergedIndex()) {
79477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        last_environment->SetValueAt(phi->merged_index(), phi);
79577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      }
796c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
797c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
79877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      if (block->deleted_phis()->at(i) < last_environment->length()) {
79977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        last_environment->SetValueAt(block->deleted_phis()->at(i),
80077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org                                     graph_->GetConstantUndefined());
80177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      }
802c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
803c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    block->UpdateEnvironment(last_environment);
804c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // Pick up the outgoing argument count of one of the predecessors.
805c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    argument_count_ = pred->argument_count();
806c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
807c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HInstruction* current = block->first();
808c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int start = chunk_->instructions()->length();
809c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  while (current != NULL && !is_aborted()) {
810c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // Code for constants in registers is generated lazily.
811c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (!current->EmitAtUses()) {
812c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      VisitInstruction(current);
813c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
814c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    current = current->next();
815c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
816c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int end = chunk_->instructions()->length() - 1;
817c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (end >= start) {
818c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    block->set_first_instruction_index(start);
819c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    block->set_last_instruction_index(end);
820c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
821c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  block->set_argument_count(argument_count_);
822c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  next_block_ = NULL;
823c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  current_block_ = NULL;
824c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
825c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
826c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
827c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
828c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HInstruction* old_current = current_instruction_;
829c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  current_instruction_ = current;
830d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
831d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  LInstruction* instr = NULL;
832d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  if (current->CanReplaceWithDummyUses()) {
833935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    if (current->OperandCount() == 0) {
834935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr = DefineAsRegister(new(zone()) LDummy());
835935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    } else {
836e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(!current->OperandAt(0)->IsControlInstruction());
837935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr = DefineAsRegister(new(zone())
838935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org          LDummyUse(UseAny(current->OperandAt(0))));
839935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    }
840d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    for (int i = 1; i < current->OperandCount(); ++i) {
84109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      if (current->OperandAt(i)->IsControlInstruction()) continue;
842d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      LInstruction* dummy =
843d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
844d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      dummy->set_hydrogen_value(current);
845d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      chunk_->AddInstruction(dummy, current_block_);
846d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    }
847d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  } else {
8488d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    HBasicBlock* successor;
8498d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    if (current->IsControlInstruction() &&
8508d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
8518d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        successor != NULL) {
8528d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = new(zone()) LGoto(successor);
8538d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    } else {
8548d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = current->CompileToLithium(this);
8558d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    }
856d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  }
857d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
858d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  argument_count_ += current->argument_delta();
859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ >= 0);
860c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
861c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (instr != NULL) {
862011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(instr, current);
863011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
864011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
865011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  current_instruction_ = old_current;
866011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
867011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
868011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
869011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr,
870011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org                                   HInstruction* hydrogen_val) {
871011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org// Associate the hydrogen instruction first, since we may need it for
872011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
873011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  instr->set_hydrogen_value(hydrogen_val);
874fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
875f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG
876011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Make sure that the lithium instruction has either no fixed register
877011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // constraints in temps or the result OR no uses that are only used at
878011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // start. If this invariant doesn't hold, the register allocator can decide
879011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // to insert a split of a range immediately before the instruction due to an
880011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // already allocated register needing to be used for the instruction's fixed
881011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // register constraint. In this case, The register allocator won't see an
882011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // interference between the split child and the use-at-start (it would if
883011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the it was just a plain use), so it is free to move the split child into
884011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the same register that is used for the use-at-start.
885011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // See https://code.google.com/p/chromium/issues/detail?id=201590
886011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (!(instr->ClobbersRegisters() &&
887011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org        instr->ClobbersDoubleRegisters(isolate()))) {
888011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int fixed = 0;
889011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int used_at_start = 0;
890011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (UseIterator it(instr); !it.Done(); it.Advance()) {
891011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
892011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->IsUsedAtStart()) ++used_at_start;
893011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
894011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instr->Output() != NULL) {
895011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
896011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
897011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (TempIterator it(instr); !it.Done(); it.Advance()) {
898011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->HasFixedPolicy()) ++fixed;
900f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
901e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(fixed == 0 || used_at_start == 0);
902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
903f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif
904f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignPointerMap(instr);
907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_environments && !instr->HasEnvironment()) {
909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignEnvironment(instr);
910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
911011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  chunk_->AddInstruction(instr, current_block_);
912011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
913011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (instr->IsCall()) {
914011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    HValue* hydrogen_value_for_lazy_bailout = hydrogen_val;
915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* instruction_needing_environment = NULL;
916011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (hydrogen_val->HasObservableSideEffects()) {
917011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      HSimulate* sim = HSimulate::cast(hydrogen_val->next());
918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment = instr;
919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      sim->ReplayEnvironment(current_block_->last_environment());
920011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      hydrogen_value_for_lazy_bailout = sim;
921c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
922011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
923011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
924011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    chunk_->AddInstruction(bailout, current_block_);
925011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instruction_needing_environment != NULL) {
926011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Store the lazy deopt environment with the instruction if needed.
927011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Right now it is only used for LInstanceOfKnownGlobal.
928011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment->
929011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org          SetDeferredLazyDeoptimizationEnvironment(bailout->environment());
930486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    }
931c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
932c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
933c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
934c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
935c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
936d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return new(zone()) LGoto(instr->FirstSuccessor());
937c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
938c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
939c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
940c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
941d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  HValue* value = instr->value();
9424edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  Representation r = value->representation();
943f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HType type = value->type();
9441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ToBooleanStub::Types expected = instr->expected_input_types();
9454edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic();
9464edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
9474edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
9484edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
9494edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LInstruction* branch = new(zone()) LBranch(UseRegister(value));
9504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (!easy_case &&
9514edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) ||
9524edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org       !expected.IsGeneric())) {
9534edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    branch = AssignEnvironment(branch);
954f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
9554edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return branch;
956c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
957c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
958c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
959c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
960e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
961c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
962c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* temp = TempRegister();
963812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LCmpMapAndBranch(value, temp);
964c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
965c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
966c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
967c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
96877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
969812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return DefineAsRegister(
970812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      new(zone()) LArgumentsLength(UseRegister(length->value())));
971c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
972c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
973c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
974c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
97577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
976b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org  return DefineAsRegister(new(zone()) LArgumentsElements);
977c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
978c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
979c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
980c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
981fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
982c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstanceOf* result =
983fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LInstanceOf(context, UseFixed(instr->left(), a0),
984812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                              UseFixed(instr->right(), a1));
985c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
986c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
987c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
988c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
989c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HInstanceOfKnownGlobal* instr) {
991c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstanceOfKnownGlobal* result =
992fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LInstanceOfKnownGlobal(
993fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org          UseFixed(instr->context(), cp),
994fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org          UseFixed(instr->left(), a0),
995fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org          FixedTemp(t0));
996c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
997c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
998c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
999c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
10002c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
10012c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  LOperand* receiver = UseRegisterAtStart(instr->receiver());
10022c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
10032c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
1004ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(result));
10052c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org}
10062c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
10072c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
1008c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1009c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
1010c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* receiver = UseFixed(instr->receiver(), a0);
1011c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* length = UseFixed(instr->length(), a2);
1012c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* elements = UseFixed(instr->elements(), a3);
1013812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LApplyArguments* result = new(zone()) LApplyArguments(function,
1014812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                                        receiver,
1015812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                                        length,
1016812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                                        elements);
1017c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
1018c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1019c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1020c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1021011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
1022011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  int argc = instr->OperandCount();
1023011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  for (int i = 0; i < argc; ++i) {
1024011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LOperand* argument = Use(instr->argument(i));
1025011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(new(zone()) LPushArgument(argument), instr);
1026011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
1027011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return NULL;
1028c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1029c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1030c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1031662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry(
1032662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    HStoreCodeEntry* store_code_entry) {
1033662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* function = UseRegister(store_code_entry->function());
1034662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
1035662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  return new(zone()) LStoreCodeEntry(function, code_object);
1036662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
1037662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1038662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
10394c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject(
1040ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org    HInnerAllocatedObject* instr) {
1041ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* base_object = UseRegisterAtStart(instr->base_object());
1042ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
1043ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  return DefineAsRegister(
1044ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org      new(zone()) LInnerAllocatedObject(base_object, offset));
10454c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org}
10464c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
10474c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
1048c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
1049812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return instr->HasNoUses()
1050812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      ? NULL
1051812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      : DefineAsRegister(new(zone()) LThisFunction);
1052c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1053c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1054c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1055c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) {
1056fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  if (instr->HasNoUses()) return NULL;
1057fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1058fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  if (info()->IsStub()) {
1059fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    return DefineFixed(new(zone()) LContext, cp);
106059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  }
106159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
1062fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return DefineAsRegister(new(zone()) LContext);
1063c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1064c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1065c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1066f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
1067fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1068fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
1069f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org}
1070f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org
1071f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org
107226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction(
107326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HCallJSFunction* instr) {
107426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
107526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
107626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LCallJSFunction* result = new(zone()) LCallJSFunction(function);
107726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
107826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
107926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
108026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
108126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
108226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor(
108326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HCallWithDescriptor* instr) {
10849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  CallInterfaceDescriptor descriptor = instr->descriptor();
108526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
108626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
108726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
108826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ops.Add(target, zone());
108926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 1; i < instr->OperandCount(); i++) {
10909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    LOperand* op =
10919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org        UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1));
109226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    ops.Add(op, zone());
109326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
109426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
109526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
109626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org      descriptor, ops, zone());
109726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
1098c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1099c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1101e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache(
1102e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    HTailCallThroughMegamorphicCache* instr) {
1103e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1104e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* receiver_register =
1105e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister());
1106e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* name_register =
1107e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->name(), LoadDescriptor::NameRegister());
1108e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  // Not marked as call. It can't deoptimize, and it never returns.
1109e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return new (zone()) LTailCallThroughMegamorphicCache(
1110e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      context, receiver_register, name_register);
1111e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
1112e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1113e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1114c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1115fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
1117fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
1118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1120c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  switch (instr->op()) {
1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFloor:
1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathFloor(instr);
1126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathRound:
1127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathRound(instr);
1128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFround:
1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathFround(instr);
1130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathAbs:
1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathAbs(instr);
1132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathLog:
1133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathLog(instr);
1134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathExp:
1135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathExp(instr);
1136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathSqrt:
1137dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathSqrt(instr);
1138dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathPowHalf:
1139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathPowHalf(instr);
1140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathClz32:
1141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathClz32(instr);
1142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    default:
1143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      UNREACHABLE();
1144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return NULL;
1145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1146c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1148c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1150e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1151e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsDouble());
1152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseFixedDouble(instr->value(), f4);
11534f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr);
1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
1158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LMathClz32* result = new(zone()) LMathClz32(input);
1160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(result);
1161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1165e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsDouble());
11678e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  LOperand* input = UseRegister(instr->value());
1168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp1 = TempRegister();
1169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp2 = TempRegister();
1170d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* double_temp = TempDoubleRegister();
1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2);
1172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineAsRegister(result);
1173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf.
1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseFixedDouble(instr->value(), f8);
1179d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp = TempDoubleRegister();
1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp);
1181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineFixedDouble(result, f4);
1182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) {
1186dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LOperand* input = UseRegister(instr->value());
1187dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LMathFround* result = new (zone()) LMathFround(input);
1188dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  return DefineAsRegister(result);
1189dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org}
1190dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
1191dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
1192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
1193fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  Representation r = instr->value()->representation();
1194fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32())
1195fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      ? NULL
1196fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      : UseFixed(instr->context(), cp);
1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
11984edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LInstruction* result =
11994edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      DefineAsRegister(new(zone()) LMathAbs(context, input));
12004edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
12014edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (!r.IsDouble()) result = AssignEnvironment(result);
12024edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return result;
1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
1207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp = TempRegister();
1209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathFloor* result = new(zone()) LMathFloor(input, temp);
1210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
1215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathSqrt* result = new(zone()) LMathSqrt(input);
1217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineAsRegister(result);
1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1223d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  LOperand* temp = TempDoubleRegister();
1224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathRound* result = new(zone()) LMathRound(input, temp);
1225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return AssignEnvironment(DefineAsRegister(result));
1226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1229c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
1230fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), a1);
1232fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCallNew* result = new(zone()) LCallNew(context, constructor);
1233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
1234c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1237750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
1238fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1239750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), a1);
1240fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
1241750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
1242750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
1243750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1244750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1246fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1247c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
1248ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  LCallFunction* call = new(zone()) LCallFunction(context, function);
1249a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  return MarkAsCall(DefineFixed(call, v0), instr);
1250c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1251c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1253c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1254fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1255fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr);
1256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1257c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1258c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1259fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) {
1260fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return DoShift(Token::ROR, instr);
1261fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
1262fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
1263fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
1264c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) {
1265c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return DoShift(Token::SHR, instr);
1266c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1268c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1269c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) {
1270c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return DoShift(Token::SAR, instr);
1271c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1272c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1273c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1274c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) {
1275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return DoShift(Token::SHL, instr);
1276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1280fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
1284c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1285906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1286906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
1287812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LBitI(left, right));
1288c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1289528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(instr->op(), instr);
1290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
129400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1295e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1296e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1297e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
129800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
129900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
130000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
130100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org          dividend, divisor));
130200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
130300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
130400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
130500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org       divisor != 1 && divisor != -1)) {
130600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    result = AssignEnvironment(result);
130700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  }
130800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  return result;
130900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org}
131000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
131100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
131200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1313e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1314e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1315e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
131600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
131700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
131800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI(
131900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org          dividend, divisor));
132000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  if (divisor == 0 ||
132100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
132200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
132300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    result = AssignEnvironment(result);
132400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  }
132500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  return result;
132600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org}
132700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
132800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
13294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) {
1330e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1331e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1332e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1333ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1334ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
13355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  LOperand* temp = TempRegister();
13364edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LInstruction* result =
13375e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp));
13384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
13394edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
13404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) &&
13414edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) ||
13424edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      (!instr->IsMathFloorOfDiv() &&
13434edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) {
13444edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    result = AssignEnvironment(result);
13454edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  }
13464edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return result;
1347ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1348ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1349ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1350c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1351528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
135200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
135300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      return DoDivByPowerOf2I(instr);
135400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
135500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      return DoDivByConstI(instr);
135600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    } else {
135700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org      return DoDivI(instr);
135800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    }
1359528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1360528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticD(Token::DIV, instr);
1361c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1362c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticT(Token::DIV, instr);
1363c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1364c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1365c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1366c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1367bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1368bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1369bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1370381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I(
1371381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org          dividend, divisor));
1372381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1373381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1374381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    result = AssignEnvironment(result);
1375381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
1376381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return result;
1377ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1378ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1379b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
1380ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1381e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1384ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1385bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1386fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  LOperand* temp =
1387fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
1388fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
1389fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org      NULL : TempRegister();
1390fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  LInstruction* result = DefineAsRegister(
1391fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org      new(zone()) LFlooringDivByConstI(dividend, divisor, temp));
1392fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  if (divisor == 0 ||
1393fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
1394fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org    result = AssignEnvironment(result);
1395fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  }
1396fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  return result;
1397b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org}
1398b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
1399b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
14004edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1403e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
14044edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
14054edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
14064edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor);
14074edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(div));
14084edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org}
14094edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
14104edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
1411b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1412bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (instr->RightIsPowerOf2()) {
1413bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return DoFlooringDivByPowerOf2I(instr);
1414fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  } else if (instr->right()->IsConstant()) {
1415fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org    return DoFlooringDivByConstI(instr);
1416ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  } else {
14174edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    return DoFlooringDivI(instr);
1418ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1419ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1420ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1421ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1423e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1424e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1426ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1427ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1428486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1429486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1430e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1432486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1433486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1434486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1435ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1436ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1437ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
143800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1439e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1440e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1441e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
144200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
144300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
144400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModByConstI(
144500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org          dividend, divisor));
144600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
144700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    result = AssignEnvironment(result);
144800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  }
144900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  return result;
145000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org}
145100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
145200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
1453ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1454e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1455e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1456e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1457ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1458ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1459486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModI(
1460486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      dividend, divisor));
1461486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1462486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1463486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1464486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1465486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1466b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org}
1467b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
1468b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
1469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1470fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1471ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr);
1472528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1473528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticD(Token::MOD, instr);
14742f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org  } else {
1475528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(Token::MOD, instr);
1476c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1477c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1478c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1479c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1481fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1482e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1483e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1484c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    HValue* left = instr->BetterLeftOperand();
1485c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    HValue* right = instr->BetterRightOperand();
1486c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    LOperand* left_op;
1487c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    LOperand* right_op;
1488c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1489c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero);
1490c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1491c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    if (right->IsConstant()) {
1492c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      HConstant* constant = HConstant::cast(right);
1493c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      int32_t constant_value = constant->Integer32Value();
1494c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      // Constants -1, 0 and 1 can be optimized if the result can overflow.
1495c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      // For other constants, it can be optimized only without overflow.
1496c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) {
1497c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        left_op = UseRegisterAtStart(left);
1498c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        right_op = UseConstant(right);
1499c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      } else {
1500c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        if (bailout_on_minus_zero) {
1501c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org          left_op = UseRegister(left);
1502c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        } else {
1503c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org          left_op = UseRegisterAtStart(left);
1504c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        }
1505c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        right_op = UseRegister(right);
1506c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      }
1507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else {
1508c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      if (bailout_on_minus_zero) {
1509c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        left_op = UseRegister(left);
1510c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      } else {
1511c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org        left_op = UseRegisterAtStart(left);
1512c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      }
1513c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      right_op = UseRegister(right);
1514c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
1515c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    LMulI* mul = new(zone()) LMulI(left_op, right_op);
1516c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    if (can_overflow || bailout_on_minus_zero) {
1517f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      AssignEnvironment(mul);
1518f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    }
1519f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    return DefineAsRegister(mul);
1520c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (instr->representation().IsDouble()) {
15225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
15234b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org      if (instr->HasOneUse() && instr->uses().value()->IsAdd()) {
152459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        HAdd* add = HAdd::cast(instr->uses().value());
152559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        if (instr == add->left()) {
152659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org          // This mul is the lhs of an add. The add and mul will be folded
152759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org          // into a multiply-add.
152859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org          return NULL;
152959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        }
153059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        if (instr == add->right() && !add->left()->IsMul()) {
153159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org          // This mul is the rhs of an add, where the lhs is not another mul.
153259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org          // The add and mul will be folded into a multiply-add.
153359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org          return NULL;
153459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        }
153559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      }
153659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    }
1537c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticD(Token::MUL, instr);
1538c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1539c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticT(Token::MUL, instr);
1540c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1541c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1542c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1543c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) {
1545fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1546e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1547e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
1549c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
1550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    LSubI* sub = new(zone()) LSubI(left, right);
1551c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LInstruction* result = DefineAsRegister(sub);
1552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
1553c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      result = AssignEnvironment(result);
1554c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
1555c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return result;
1556c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (instr->representation().IsDouble()) {
1557c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticD(Token::SUB, instr);
1558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1559c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticT(Token::SUB, instr);
1560c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1561c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1562c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1563c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
156459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) {
156559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LOperand* multiplier_op = UseRegisterAtStart(mul->left());
156659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LOperand* multiplicand_op = UseRegisterAtStart(mul->right());
156759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LOperand* addend_op = UseRegisterAtStart(addend);
156859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op,
156959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org                                                     multiplicand_op));
157059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org}
157159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
157259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
1573c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1574fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1575e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1576e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1577906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1578906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
1579812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
1580c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LInstruction* result = DefineAsRegister(add);
1581c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
1582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      result = AssignEnvironment(result);
1583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
1584c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return result;
158537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  } else if (instr->representation().IsExternal()) {
1586e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsExternal());
1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsInteger32());
1588e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
158937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
159037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
159137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
159237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LInstruction* result = DefineAsRegister(add);
159337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return result;
1594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (instr->representation().IsDouble()) {
15955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) {
159659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      if (instr->left()->IsMul())
159759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        return DoMultiplyAdd(HMul::cast(instr->left()), instr->right());
159859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
159959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      if (instr->right()->IsMul()) {
1600e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org        DCHECK(!instr->left()->IsMul());
160159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org        return DoMultiplyAdd(HMul::cast(instr->right()), instr->left());
160259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      }
160359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    }
1604c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticD(Token::ADD, instr);
1605c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1606c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DoArithmeticT(Token::ADD, instr);
1607c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1611471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1612471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LOperand* left = NULL;
1613471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LOperand* right = NULL;
1614fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1615e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1617906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    left = UseRegisterAtStart(instr->BetterLeftOperand());
1618906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    right = UseOrConstantAtStart(instr->BetterRightOperand());
1619471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  } else {
1620e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->representation().IsDouble());
1621e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1622e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
1623471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    left = UseRegisterAtStart(instr->left());
1624471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    right = UseRegisterAtStart(instr->right());
1625471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1626471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  return DefineAsRegister(new(zone()) LMathMinMax(left, right));
1627471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
1628471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1629471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1631e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1632c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // We call a C function for double power. It can't trigger a GC.
1633c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // We need to use fixed result register for the call.
1634c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Representation exponent_type = instr->right()->representation();
1635e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
1636c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* left = UseFixedDouble(instr->left(), f2);
16376313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  LOperand* right =
16386313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      exponent_type.IsDouble()
16396313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org          ? UseFixedDouble(instr->right(), f4)
16406313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org          : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
1641812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LPower* result = new(zone()) LPower(left, right);
164264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return MarkAsCall(DefineFixedDouble(result, f0),
1643c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                    instr,
1644c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                    CAN_DEOPTIMIZE_EAGERLY);
1645c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1646c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1647c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1648c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1649e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1650e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
1651fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1652c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* left = UseFixed(instr->left(), a1);
1653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* right = UseFixed(instr->right(), a0);
1654fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCmpT* result = new(zone()) LCmpT(context, left, right);
1655c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
1656c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1657c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1658c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1659e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1660e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    HCompareNumericAndBranch* instr) {
16618e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Representation r = instr->representation();
1662b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (r.IsSmiOrInteger32()) {
1663e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(r));
1664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(r));
1665c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
1666c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
1667e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
1668c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1669e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(r.IsDouble());
1670e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
1672c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
1673c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
1674e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
1675c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1676c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1677c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1678c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1679c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
1680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HCompareObjectEqAndBranch* instr) {
1681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* left = UseRegisterAtStart(instr->left());
1682c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* right = UseRegisterAtStart(instr->right());
1683812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LCmpObjectEqAndBranch(left, right);
1684c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1685c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1686c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1687c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.comLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1688c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com    HCompareHoleAndBranch* instr) {
1689528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1690528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return new(zone()) LCmpHoleAndBranch(value);
1691c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com}
1692c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com
1693c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com
16940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch(
16950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    HCompareMinusZeroAndBranch* instr) {
16960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* value = UseRegister(instr->value());
16970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* scratch = TempRegister();
16980cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return new(zone()) LCompareMinusZeroAndBranch(value, scratch);
16990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org}
17000cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
17010cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
1702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1703e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1704c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* temp = TempRegister();
1705812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()),
1706812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                        temp);
1707c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1708c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1709c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1710f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1711e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1712f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  LOperand* temp = TempRegister();
1713812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()),
1714812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                        temp);
1715f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org}
1716f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1717f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1718c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1719e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1720812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1721c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1724c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
1725c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HIsUndetectableAndBranch* instr) {
1726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1727812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsUndetectableAndBranch(
1728812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      UseRegisterAtStart(instr->value()), TempRegister());
1729c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1730c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1731c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1732f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.orgLInstruction* LChunkBuilder::DoStringCompareAndBranch(
1733f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org    HStringCompareAndBranch* instr) {
1734e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1735e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
1736fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1737f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  LOperand* left = UseFixed(instr->left(), a1);
1738f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  LOperand* right = UseFixed(instr->right(), a0);
1739812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LStringCompareAndBranch* result =
1740fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LStringCompareAndBranch(context, left, right);
1741f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  return MarkAsCall(result, instr);
1742f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org}
1743f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1744f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
1746c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HHasInstanceTypeAndBranch* instr) {
1747e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1748812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1749812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LHasInstanceTypeAndBranch(value);
1750c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1751c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1752c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1753c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1754c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HGetCachedArrayIndex* instr)  {
1755e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1758812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
1759c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1761c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1762c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
1763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HHasCachedArrayIndexAndBranch* instr) {
1764e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1765812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LHasCachedArrayIndexAndBranch(
1766c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      UseRegisterAtStart(instr->value()));
1767c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1768c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1769c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1770c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
1771c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HClassOfTestAndBranch* instr) {
1772e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1773812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()),
1774812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                                           TempRegister());
1775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1776c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1777c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
177878502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
177978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  LOperand* map = UseRegisterAtStart(instr->value());
178078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  return DefineAsRegister(new(zone()) LMapEnumLength(map));
178178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org}
178278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
178378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
1784154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
1785154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* object = UseFixed(instr->value(), a0);
17867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  LDateField* result =
17877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      new(zone()) LDateField(object, FixedTemp(a1), instr->index());
1788de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
1789154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}
1790154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1791154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1792e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
1793e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
1794e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1795e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
1796e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
1797e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1798e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1799a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
18009af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
18019af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* index = FLAG_debug_code
18029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      ? UseRegisterAtStart(instr->index())
18039af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      : UseRegisterOrConstantAtStart(instr->index());
18049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
18059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL;
18069af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return new(zone()) LSeqStringSetChar(context, string, index, value);
1807a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}
1808a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1809a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1810c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1811a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code && instr->skip_check()) return NULL;
1812a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1813a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* length = !index->IsConstantOperand()
1814a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  ? UseRegisterOrConstantAtStart(instr->length())
1815a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  : UseRegisterAtStart(instr->length());
1816a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LInstruction* result = new(zone()) LBoundsCheck(index, length);
1817a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code || !instr->skip_check()) {
1818a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org    result = AssignEnvironment(result);
1819a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  }
1820a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  return result;
1821c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1822c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1823c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1824876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
1825876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    HBoundsCheckBaseIndexInformation* instr) {
1826876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  UNREACHABLE();
1827876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  return NULL;
1828876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
1829876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1830876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1831c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
1832c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  // The control instruction marking the end of a block that completed
1833c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  // abruptly (e.g., threw an exception).  There is nothing specific to do.
1834c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return NULL;
1835c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org}
1836c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1837c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1838c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
1839c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return NULL;
1840c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1841c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1842c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1843c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1844c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // All HForceRepresentation instructions should be eliminated in the
1845c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // representation change phase of Hydrogen.
1846c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  UNREACHABLE();
1847c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return NULL;
1848c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1849c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1850c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1851c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) {
1852c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Representation from = instr->from();
1853c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Representation to = instr->to();
18544edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  HValue* val = instr->value();
1855a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (from.IsSmi()) {
1856a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    if (to.IsTagged()) {
18574edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LOperand* value = UseRegister(val);
1858a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1859a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    }
1860a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    from = Representation::Tagged();
1861a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
1862c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (from.IsTagged()) {
1863c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (to.IsDouble()) {
18644edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LOperand* value = UseRegister(val);
18654edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value));
18664edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
18674edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      return result;
1868a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1869a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      LOperand* value = UseRegister(val);
187053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      if (val->type().IsSmi()) {
187153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org        return DefineSameAsFirst(new(zone()) LDummyUse(value));
187253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      }
1873c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
1874c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else {
1875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
1876662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      if (val->type().IsSmi() || val->representation().IsSmi()) {
18774edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
18784edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiUntag(value, false));
1879c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      } else {
18804edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        LOperand* value = UseRegister(val);
1881c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        LOperand* temp1 = TempRegister();
1882d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        LOperand* temp2 = TempDoubleRegister();
18834edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        LInstruction* result =
18844edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org            DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2));
1885da0c8284c47004231268322ae983e4bd2eb5aff8machenbach@chromium.org        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
18864edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        return result;
1887c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      }
1888c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
1889c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (from.IsDouble()) {
1890c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (to.IsTagged()) {
189159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org      info()->MarkAsDeferredCalling();
18924edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LOperand* value = UseRegister(val);
1893c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      LOperand* temp1 = TempRegister();
1894c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      LOperand* temp2 = TempRegister();
1895c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      LUnallocated* result_temp = TempRegister();
1896812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2);
18974edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      return AssignPointerMap(Define(result, result_temp));
1898a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
18994edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LOperand* value = UseRegister(val);
19008fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org      return AssignEnvironment(
19018fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
1902c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else {
1903e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
19044edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LOperand* value = UseRegister(val);
19054edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value));
19064edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result);
19074edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      return result;
1908c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
1909c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (from.IsInteger32()) {
191059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    info()->MarkAsDeferredCalling();
1911c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    if (to.IsTagged()) {
1912381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      if (!instr->CheckFlag(HValue::kCanOverflow)) {
19134edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1914381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiTag(value));
1915381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      } else if (val->CheckFlag(HInstruction::kUint32)) {
19164edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1917bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp1 = TempRegister();
1918bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp2 = TempRegister();
1919bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
19204edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        return AssignPointerMap(DefineAsRegister(result));
1921c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      } else {
19224edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1923bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp1 = TempRegister();
1924bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp2 = TempRegister();
1925bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2);
19264edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        return AssignPointerMap(DefineAsRegister(result));
1927c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      }
1928a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1929a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      LOperand* value = UseRegister(val);
1930381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
1931381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      if (instr->CheckFlag(HValue::kCanOverflow)) {
1932381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        result = AssignEnvironment(result);
1933a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      }
1934381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      return result;
1935c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    } else {
1936e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsDouble());
19374edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
19384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
193978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org      } else {
19404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val)));
194178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org      }
1942c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    }
1943c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1944c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  UNREACHABLE();
1945c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return NULL;
1946c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1947c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1948c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
19491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
1950c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
19518f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  LInstruction* result = new(zone()) LCheckNonSmi(value);
1952eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  if (!instr->value()->type().IsHeapObject()) {
1953eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    result = AssignEnvironment(result);
1954eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  }
19558f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  return result;
1956c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1957c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1958c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1959e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
1960e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1961e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  return AssignEnvironment(new(zone()) LCheckSmi(value));
1962e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
1963e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1964e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1965c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
1966c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1967812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LInstruction* result = new(zone()) LCheckInstanceType(value);
1968c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return AssignEnvironment(result);
1969c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1970c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1971c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
19721f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
1973c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
19741f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  return AssignEnvironment(new(zone()) LCheckValue(value));
1975c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1976c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1977c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
19781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
1979af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
1980af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1981af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
1982af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->HasMigrationTarget()) {
1983af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    info()->MarkAsDeferredCalling();
1984af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    result = AssignPointerMap(result);
1985594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
1986594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return result;
1987c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
1988c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1989c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1991c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HValue* value = instr->value();
1992c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Representation input_rep = value->representation();
1993c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* reg = UseRegister(value);
1994c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (input_rep.IsDouble()) {
1995c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // Revisit this decision, here and 8 lines below.
1996d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    return DefineAsRegister(new(zone()) LClampDToUint8(reg,
1997d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        TempDoubleRegister()));
1998c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (input_rep.IsInteger32()) {
1999812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LClampIToUint8(reg));
2000c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
2001e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(input_rep.IsSmiOrTagged());
2002d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    LClampTToUint8* result =
2003d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        new(zone()) LClampTToUint8(reg, TempDoubleRegister());
2004c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return AssignEnvironment(DefineAsRegister(result));
2005c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2006c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2007c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2008c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2009ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) {
2010ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  HValue* value = instr->value();
2011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(value->representation().IsDouble());
2012ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value)));
2013ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2014ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2015ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2016ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) {
2017ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* lo = UseRegister(instr->lo());
2018ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* hi = UseRegister(instr->hi());
2019ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LConstructDouble(hi, lo));
2020ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2021ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2022ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2023c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
2024fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = info()->IsStub()
2025fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      ? UseFixed(instr->context(), cp)
2026fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      : NULL;
20276e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
2028fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return new(zone()) LReturn(UseFixed(instr->value(), v0), context,
20296e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org                             parameter_count);
2030c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2031c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2032c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2033c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
2034c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Representation r = instr->representation();
2035b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (r.IsSmi()) {
2036b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    return DefineAsRegister(new(zone()) LConstantS);
2037b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else if (r.IsInteger32()) {
2038812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LConstantI);
2039c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else if (r.IsDouble()) {
2040812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LConstantD);
2041d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  } else if (r.IsExternal()) {
2042d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return DefineAsRegister(new(zone()) LConstantE);
2043b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else if (r.IsTagged()) {
2044812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return DefineAsRegister(new(zone()) LConstantT);
2045c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
2046c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    UNREACHABLE();
2047c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return NULL;
2048c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2049c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2050c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2051c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2052c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
2053812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell;
2054c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return instr->RequiresHoleCheck()
2055c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? AssignEnvironment(DefineAsRegister(result))
2056c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : DefineAsRegister(result);
2057c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2058c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2059c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2060c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
2061fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2062fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* global_object =
20639aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister());
20649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
20659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
20669aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
20679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
2068fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LLoadGlobalGeneric* result =
20699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      new(zone()) LLoadGlobalGeneric(context, global_object, vector);
2070c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
2071c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2072c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2073c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2074c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
2075e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  LOperand* value = UseRegister(instr->value());
2076e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  // Use a temp to check the value in the cell in the case where we perform
2077e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  // a hole check.
2078e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  return instr->RequiresHoleCheck()
2079812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister()))
2080812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      : new(zone()) LStoreGlobalCell(value, NULL);
2081c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2082c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2083c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2084c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
2085c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* context = UseRegisterAtStart(instr->value());
2086812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LInstruction* result =
2087812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      DefineAsRegister(new(zone()) LLoadContextSlot(context));
20884edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
20894edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    result = AssignEnvironment(result);
20904edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  }
20914edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return result;
2092c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2093c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2095c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
2096c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* context;
2097c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* value;
2098c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (instr->NeedsWriteBarrier()) {
2099c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    context = UseTempRegister(instr->context());
2100c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    value = UseTempRegister(instr->value());
2101c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
2102c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    context = UseRegister(instr->context());
2103c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    value = UseRegister(instr->value());
2104c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2105812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LInstruction* result = new(zone()) LStoreContextSlot(context, value);
21064edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
21074edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    result = AssignEnvironment(result);
21084edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  }
21094edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return result;
2110c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2111c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2112c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2113c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
2114f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  LOperand* obj = UseRegisterAtStart(instr->object());
2115f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
2116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2119c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
2120fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2121fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
21229aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
21239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
21249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
21259aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
21269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
21279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
2128fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LInstruction* result =
21299d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), v0);
2130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(result, instr);
2131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2132c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2133c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2134c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
2135c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HLoadFunctionPrototype* instr) {
2136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return AssignEnvironment(DefineAsRegister(
2137812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
2138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2141528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
2142528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return DefineAsRegister(new(zone()) LLoadRoot);
2143528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org}
2144528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
2145528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
2146e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
2147e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsSmiOrInteger32());
2148e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  ElementsKind elements_kind = instr->elements_kind();
2149c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
21504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LInstruction* result = NULL;
2151c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
21525c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!instr->is_typed_elements()) {
2153e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    LOperand* obj = NULL;
2154e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    if (instr->representation().IsDouble()) {
2155fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      obj = UseRegister(instr->elements());
2156e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    } else {
2157e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsSmiOrTagged());
2158e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      obj = UseRegisterAtStart(instr->elements());
2159e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    }
21604edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key));
2161e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  } else {
2162e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(
2163e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        (instr->representation().IsInteger32() &&
21644edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org         !IsDoubleOrFloatElementsKind(elements_kind)) ||
2165e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        (instr->representation().IsDouble() &&
21664edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org         IsDoubleOrFloatElementsKind(elements_kind)));
21675c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    LOperand* backing_store = UseRegister(instr->elements());
21684edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key));
2169e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
2170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
21714edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  if ((instr->is_external() || instr->is_fixed_typed_array()) ?
21724edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      // see LCodeGen::DoLoadKeyedExternalArray
21734edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      ((elements_kind == EXTERNAL_UINT32_ELEMENTS ||
21744edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        elements_kind == UINT32_ELEMENTS) &&
21754edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org       !instr->CheckFlag(HInstruction::kUint32)) :
21764edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      // see LCodeGen::DoLoadKeyedFixedDoubleArray and
21774edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      // LCodeGen::DoLoadKeyedFixedArray
21784edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org      instr->RequiresHoleCheck()) {
21794edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    result = AssignEnvironment(result);
21804edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  }
21814edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return result;
2182c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2183c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2184c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2185c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
2186fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2187fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
21889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
21899aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister());
21909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
21919d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
21929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
21939d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
2194c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* result =
21969d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector),
21979d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  v0);
2198c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(result, instr);
2199c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2200c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2201c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2202e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
22035c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!instr->is_typed_elements()) {
2204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->elements()->representation().IsTagged());
22058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    bool needs_write_barrier = instr->NeedsWriteBarrier();
2206e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    LOperand* object = NULL;
22078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    LOperand* val = NULL;
22088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    LOperand* key = NULL;
22098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
2210e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    if (instr->value()->representation().IsDouble()) {
2211e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      object = UseRegisterAtStart(instr->elements());
22128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      key = UseRegisterOrConstantAtStart(instr->key());
2213528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      val = UseRegister(instr->value());
2214e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    } else {
2215e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsSmiOrTagged());
2216528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (needs_write_barrier) {
2217528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        object = UseTempRegister(instr->elements());
2218528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        val = UseTempRegister(instr->value());
2219528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        key = UseTempRegister(instr->key());
2220528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      } else {
2221528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        object = UseRegisterAtStart(instr->elements());
2222528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        val = UseRegisterAtStart(instr->value());
2223528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        key = UseRegisterOrConstantAtStart(instr->key());
2224528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
2225e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    }
2226e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
22278e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    return new(zone()) LStoreKeyed(object, key, val);
2228e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
2229e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
2230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(
22318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      (instr->value()->representation().IsInteger32() &&
22325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org       !IsDoubleOrFloatElementsKind(instr->elements_kind())) ||
22338e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      (instr->value()->representation().IsDouble() &&
22345c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org       IsDoubleOrFloatElementsKind(instr->elements_kind())));
2235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((instr->is_fixed_typed_array() &&
22365c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instr->elements()->representation().IsTagged()) ||
22375c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         (instr->is_external() &&
22385c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instr->elements()->representation().IsExternal()));
2239528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LOperand* val = UseRegister(instr->value());
22408e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
22415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  LOperand* backing_store = UseRegister(instr->elements());
22425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return new(zone()) LStoreKeyed(backing_store, key, val);
2243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2244c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2246c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2247fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2248fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* obj =
22499aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
22509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister());
22519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2253e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->object()->representation().IsTagged());
2254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsTagged());
2255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
2256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2257fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(
2258fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr);
2259c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2260c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2261c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoTransitionElementsKind(
2263c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HTransitionElementsKind* instr) {
2264003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
22652f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseRegister(instr->object());
2266c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LOperand* new_map_reg = TempRegister();
2267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LTransitionElementsKind* result =
2268fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org        new(zone()) LTransitionElementsKind(object, NULL, new_map_reg);
2269f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return result;
2270c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org  } else {
22712f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseFixed(instr->object(), a0);
2272fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
2273c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org    LTransitionElementsKind* result =
2274fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org        new(zone()) LTransitionElementsKind(object, context, NULL);
22752f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    return MarkAsCall(result, instr);
2276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
22807c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento(
22817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    HTrapAllocationMemento* instr) {
22827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* object = UseRegister(instr->object());
22837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* temp = TempRegister();
22847c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LTrapAllocationMemento* result =
22857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org      new(zone()) LTrapAllocationMemento(object, temp);
22867c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  return AssignEnvironment(result);
22877c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
22887c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
22897c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
2290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
229153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  bool is_in_object = instr->access().IsInobject();
2292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool needs_write_barrier = instr->NeedsWriteBarrier();
2293594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool needs_write_barrier_for_map = instr->has_transition() &&
229437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      instr->NeedsWriteBarrierForMap();
229537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
229637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  LOperand* obj;
229737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  if (needs_write_barrier) {
229853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    obj = is_in_object
229937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        ? UseRegister(instr->object())
230037141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        : UseTempRegister(instr->object());
230137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  } else {
230237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org    obj = needs_write_barrier_for_map
230337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        ? UseRegister(instr->object())
230437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        : UseRegisterAtStart(instr->object());
230537141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  }
2306c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
230757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  LOperand* val;
2308d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  if (needs_write_barrier) {
230957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    val = UseTempRegister(instr->value());
2310bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  } else if (instr->field_representation().IsDouble()) {
231157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    val = UseRegisterAtStart(instr->value());
231257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  } else {
231357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    val = UseRegister(instr->value());
231457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
2315c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
231637141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // We need a temporary register for write barrier of the map field.
231737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL;
231837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
2319d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return new(zone()) LStoreNamedField(obj, val, temp);
2320c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2321c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2322c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2323c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2324fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2325fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* obj =
23269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
23279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2328c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2329fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val);
2330c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(result, instr);
2331c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2332c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2333c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2334c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2335fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2336bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  LOperand* left = UseFixed(instr->left(), a1);
2337bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  LOperand* right = UseFixed(instr->right(), a0);
2338fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(
2339fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      DefineFixed(new(zone()) LStringAdd(context, left, right), v0),
2340fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      instr);
2341c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2342c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2343c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2344c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
2345c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* string = UseTempRegister(instr->string());
2346c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* index = UseTempRegister(instr->index());
2347fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2348fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStringCharCodeAt* result =
2349fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LStringCharCodeAt(context, string, index);
23504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
2351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2352c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2353c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2354c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
2355c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* char_code = UseRegister(instr->value());
2356fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2357fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStringCharFromCode* result =
2358fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      new(zone()) LStringCharFromCode(context, char_code);
2359c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return AssignPointerMap(DefineAsRegister(result));
2360c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2361c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2362c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
23637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
23647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  info()->MarkAsDeferredCalling();
2365fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2366c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org  LOperand* size = UseRegisterOrConstant(instr->size());
23677c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* temp1 = TempRegister();
23687c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* temp2 = TempRegister();
2369fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2);
23707c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  return AssignPointerMap(DefineAsRegister(result));
23717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
23727c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
23737c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
2374c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
2375fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2376fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(
2377fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      DefineFixed(new(zone()) LRegExpLiteral(context), v0), instr);
2378c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2379c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2380c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2381c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
2382fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2383fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(
2384fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org      DefineFixed(new(zone()) LFunctionLiteral(context), v0), instr);
2385c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2386c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2387c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2388c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2389e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ == 0);
2390c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  allocator_->MarkAsOsrEntry();
2391c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  current_block_->last_environment()->set_ast_id(instr->ast_id());
2392812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return AssignEnvironment(new(zone()) LOsrEntry);
2393c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2394c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2396c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
239759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LParameter* result = new(zone()) LParameter;
23987c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  if (instr->kind() == HParameter::STACK_PARAMETER) {
239959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    int spill_index = chunk()->GetParameterStackSlot(instr->index());
240059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    return DefineAsSpilled(result, spill_index);
240159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  } else {
2402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(info()->IsStub());
2403e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    CallInterfaceDescriptor descriptor =
2404e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org        info()->code_stub()->GetCallInterfaceDescriptor();
2405ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    int index = static_cast<int>(instr->index());
240642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org    Register reg = descriptor.GetEnvironmentParameterRegister(index);
240759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    return DefineFixed(result, reg);
240859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  }
2409c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2410c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2411c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2412c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2413c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // Use an index that corresponds to the location in the unoptimized frame,
2414c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // which the optimized frame will subsume.
2415c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  int env_index = instr->index();
2416c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  int spill_index = 0;
2417c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (instr->environment()->is_parameter_index(env_index)) {
2418c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    spill_index = chunk()->GetParameterStackSlot(env_index);
2419c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  } else {
2420c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    spill_index = env_index - instr->environment()->first_local_index();
2421c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2422b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      Retry(kTooManySpillSlotsNeededForOSR);
2423c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      spill_index = 0;
2424c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
2425c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2426812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2427c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2428c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2429c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2430c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
2431fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2432fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), v0), instr);
2433c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2434c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2435c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2436c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
2437c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // There are no real uses of the arguments object.
2438c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // arguments.length and element access are supported directly on
2439c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // stack arguments, and any real arguments object use causes a bailout.
2440c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // So this value is never used.
2441c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return NULL;
2442c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2445594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
2446662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
24471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2448594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // There are no real uses of a captured object.
2449594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return NULL;
2450594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
2451594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
2452594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
2453c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
245477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
2455c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* args = UseRegister(instr->arguments());
245690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  LOperand* length = UseRegisterOrConstantAtStart(instr->length());
245790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
2458c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
2459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2461c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2462c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2463c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* object = UseFixed(instr->value(), a0);
2464812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LToFastProperties* result = new(zone()) LToFastProperties(object);
2465c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
2466c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2467c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2468c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2470fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2471fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0));
2472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
2473c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2474c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2475c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2476c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2477812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
2478c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2479c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2481c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
2482c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    HIsConstructCallAndBranch* instr) {
2483812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return new(zone()) LIsConstructCallAndBranch(TempRegister());
2484c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2485c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2486c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2487c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2488662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
2489c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return NULL;
2490c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2491c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2492c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2494c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (instr->is_function_entry()) {
2495fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
2496fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    return MarkAsCall(new(zone()) LStackCheck(context), instr);
2497c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
2498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->is_backwards_branch());
2499fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    LOperand* context = UseAny(instr->context());
2500fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    return AssignEnvironment(
2501fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org        AssignPointerMap(new(zone()) LStackCheck(context)));
2502c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2503c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2506c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
2507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HEnvironment* outer = current_block_->last_environment();
2508f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  outer->set_ast_id(instr->ReturnId());
2509c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HConstant* undefined = graph()->GetConstantUndefined();
2510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
2511fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org                                               instr->arguments_count(),
2512c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                               instr->function(),
2513c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                               undefined,
2514e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org                                               instr->inlining_kind());
2515b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  // Only replay binding of arguments object if it wasn't removed from graph.
2516b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
2517b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    inner->Bind(instr->arguments_var(), instr->arguments_object());
25188c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org  }
2519ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  inner->BindContext(instr->closure_context());
252056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  inner->set_entry(instr);
2521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  current_block_->UpdateEnvironment(inner);
2522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  chunk_->AddInlinedClosure(instr->closure());
2523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return NULL;
2524c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2525c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2526c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2527c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
252828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  LInstruction* pop = NULL;
252928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
253028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  HEnvironment* env = current_block_->last_environment();
253128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
253233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (env->entry()->arguments_pushed()) {
253328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    int argument_count = env->arguments_environment()->parameter_count();
253428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    pop = new(zone()) LDrop(argument_count);
2535e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->argument_delta() == -argument_count);
253628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  }
253728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
2538fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  HEnvironment* outer = current_block_->last_environment()->
2539fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org      DiscardInlined(false);
2540c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  current_block_->UpdateEnvironment(outer);
254128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
254228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  return pop;
2543c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
2544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2545c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2546812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2547fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2548812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* object = UseFixed(instr->enumerable(), a0);
2549fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
2550812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
2551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
2552812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2553812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2554812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
2555812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* map = UseRegister(instr->map());
255689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map)));
2557812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
2558812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2559812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2560812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
2561812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2562812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* map = UseRegisterAtStart(instr->map());
256335814e51cffd39ade0aaeaaafb9b4612aa1d9efbfschneider@chromium.org  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
2564812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
2565812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2566812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2567812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2568812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* object = UseRegister(instr->object());
2569a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org  LOperand* index = UseTempRegister(instr->index());
2570ab43d2fe8b76a093650c03e80a89b6344b6be49emachenbach@chromium.org  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
2571ab43d2fe8b76a093650c03e80a89b6344b6be49emachenbach@chromium.org  LInstruction* result = DefineSameAsFirst(load);
2572ab43d2fe8b76a093650c03e80a89b6344b6be49emachenbach@chromium.org  return AssignPointerMap(result);
2573812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
2574812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2575812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
25761e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
25771e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
25781e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseRegisterAtStart(instr->context());
25791e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return new(zone()) LStoreFrameContext(context);
25801e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
25811e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
25821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
25831e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext(
25841e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    HAllocateBlockContext* instr) {
25851e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
25861e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
25871e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LAllocateBlockContext* result =
25881e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      new(zone()) LAllocateBlockContext(context, function);
25891e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, cp), instr);
25901e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
25911e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
2592c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} }  // namespace v8::internal
25937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
25947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_TARGET_ARCH_MIPS
2595