1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2013 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.
4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm64/lithium-codegen-arm64.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-osr.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h"
10f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
11f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace v8 {
12f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace internal {
13f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
14f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#define DEFINE_COMPILE(type)                            \
15f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void L##type::CompileToNative(LCodeGen* generator) {  \
16f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    generator->Do##type(this);                          \
17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#undef DEFINE_COMPILE
20f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#ifdef DEBUG
22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::VerifyCall() {
23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Call instructions can use only fixed registers as temporaries and
24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // outputs because all registers are blocked by the calling convention.
25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Inputs operands must use a fixed register or use-at-start policy or
26f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // a non-register policy.
27e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(Output() == NULL ||
28f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org         LUnallocated::cast(Output())->HasFixedPolicy() ||
29f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org         !LUnallocated::cast(Output())->HasRegisterPolicy());
30f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (UseIterator it(this); !it.Done(); it.Advance()) {
31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
32e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||
33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org           operand->IsUsedAtStart());
34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (TempIterator it(this); !it.Done(); it.Advance()) {
36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
37e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif
41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) {
44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LGap::PrintDataTo(stream);
45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LLabel* rep = replacement();
46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (rep != NULL) {
47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    stream->Add(" Dead block replaced with B%d", rep->block_id());
48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
49f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  arguments()->PrintTo(stream);
54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" length ");
55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  length()->PrintTo(stream);
56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" index ");
57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  index()->PrintTo(stream);
58f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
59f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
60f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) {
62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
66f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) {
68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("= ");
69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  function()->PrintTo(stream);
70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("#%d / ", arity());
71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
72f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
73f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
74f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
75f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (int i = 0; i < InputCount(); i++) {
76f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    InputAt(i)->PrintTo(stream);
77f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    stream->Add(" ");
78f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
79f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("#%d / ", arity());
80f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
81f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
82f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
83f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) {
84f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("= ");
85f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  constructor()->PrintTo(stream);
86f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" #%d / ", arity());
87f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
88f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
89f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
90f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) {
91f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("= ");
92f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  constructor()->PrintTo(stream);
93f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" #%d / ", arity());
94f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ElementsKind kind = hydrogen()->elements_kind();
95f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" (%s) ", ElementsKindToString(kind));
96f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
97f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
98f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
99f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if class_of_test(");
101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(", \"%o\") then B%d else B%d",
103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org              *hydrogen()->class_name(),
104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org              true_block_id(),
105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org              false_block_id());
106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
110f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if ");
111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  left()->PrintTo(stream);
112f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" %s ", Token::String(op()));
113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  right()->PrintTo(stream);
114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
117f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
118f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if has_cached_array_index(");
120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const {
126f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return !gen->IsNextEmittedBlock(block_id());
127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
130f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) {
131f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("B%d", block_id());
132f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
133f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
134f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
135f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" = ");
137f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  base_object()->PrintTo(stream);
138f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" + ");
139f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  offset()->PrintTo(stream);
140f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
141f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
142f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
143f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
144f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("= ");
145f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  function()->PrintTo(stream);
146f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" #%d / ", arity());
147f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
148f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
149f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
150f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) {
151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("%s ", this->Mnemonic());
152f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  PrintOutputOperandTo(stream);
154f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
155f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  PrintDataTo(stream);
156f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (HasEnvironment()) {
158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    stream->Add(" ");
159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    environment()->PrintTo(stream);
160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (HasPointerMap()) {
163f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    stream->Add(" ");
164f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    pointer_map()->PrintTo(stream);
165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
166f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
167f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
168f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
169f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) {
170f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("= ");
171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (int i = 0; i < InputCount(); i++) {
172f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (i > 0) stream->Add(" ");
173f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (InputAt(i) == NULL) {
174f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      stream->Add("NULL");
175f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
176f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      InputAt(i)->PrintTo(stream);
177f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
178f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
179f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
180f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
181f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
182f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
183f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (HasResult()) result()->PrintTo(stream);
184f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
185f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
186f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if has_instance_type(");
189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
194f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
195f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if is_object(");
196f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
197f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
198f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
199f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if is_string(");
203f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
209f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if is_smi(");
210f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
211f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
213f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
214f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
215f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
216f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if typeof ");
217f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
218f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" == \"%s\" then B%d else B%d",
219f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org              hydrogen()->type_literal()->ToCString().get(),
220f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org              true_block_id(), false_block_id());
221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
222f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
223f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
224f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
225f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if is_undetectable(");
226f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
227f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
229f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
230f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
231f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgbool LGap::IsRedundant() const {
232f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (int i = 0; i < 4; i++) {
233f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if ((parallel_moves_[i] != NULL) && !parallel_moves_[i]->IsRedundant()) {
234f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return false;
235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
236f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return true;
239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
240f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) {
243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (int i = 0; i < 4; i++) {
244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    stream->Add("(");
245f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (parallel_moves_[i] != NULL) {
246f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      parallel_moves_[i]->PrintDataTo(stream);
247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
248f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    stream->Add(") ");
249f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
252f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
254f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  context()->PrintTo(stream);
255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("[%d]", slot_index());
256f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" = ");
261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  function()->PrintTo(stream);
262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(".code_entry = ");
263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  code_object()->PrintTo(stream);
264f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
268f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  context()->PrintTo(stream);
269f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("[%d] <- ", slot_index());
270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
271f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
272f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
274f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
275f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  object()->PrintTo(stream);
276f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("[");
277f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  key()->PrintTo(stream);
278f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("] <- ");
279f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
280f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
281f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
283f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  object()->PrintTo(stream);
285f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OStringStream os;
286f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << hydrogen()->access();
287f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  stream->Add(os.c_str());
288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" <- ");
289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
290f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
291f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  object()->PrintTo(stream);
295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(".");
296f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(String::cast(*name())->ToCString().get());
297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(" <- ");
298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("if string_compare(");
304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  left()->PrintTo(stream);
305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  right()->PrintTo(stream);
306f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
307f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
308f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  object()->PrintTo(stream);
312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  stream->Add("%p -> %p", *original_map(), *transitioned_map());
313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgtemplate<int T>
317f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LUnaryMathOperation<T>::PrintDataTo(StringStream* stream) {
318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  value()->PrintTo(stream);
319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgconst char* LArithmeticD::Mnemonic() const {
323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  switch (op()) {
324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::ADD: return "add-d";
325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::SUB: return "sub-d";
326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::MUL: return "mul-d";
327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::DIV: return "div-d";
328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::MOD: return "mod-d";
329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    default:
330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UNREACHABLE();
331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return NULL;
332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
333f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgconst char* LArithmeticT::Mnemonic() const {
337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  switch (op()) {
338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::ADD: return "add-t";
339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::SUB: return "sub-t";
340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::MUL: return "mul-t";
341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::MOD: return "mod-t";
342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::DIV: return "div-t";
343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::BIT_AND: return "bit-and-t";
344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::BIT_OR: return "bit-or-t";
345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::BIT_XOR: return "bit-xor-t";
346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::ROR: return "ror-t";
347f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::SHL: return "shl-t";
348f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::SAR: return "sar-t";
349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case Token::SHR: return "shr-t";
350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    default:
351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UNREACHABLE();
352f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return NULL;
353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                  Register::ToAllocationIndex(reg));
360f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) {
364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                  DoubleRegister::ToAllocationIndex(reg));
366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (value->EmitAtUses()) {
371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HInstruction* instr = HInstruction::cast(value);
372f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    VisitInstruction(instr);
373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  operand->set_virtual_register(value->id());
375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return operand;
376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Use(value, ToUnallocated(fixed_register));
381f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
382f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
383f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
384f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value,
385f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                        DoubleRegister fixed_register) {
386f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Use(value, ToUnallocated(fixed_register));
387f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
388f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
390f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) {
391f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
392f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
393f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
394f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
395f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterAndClobber(HValue* value) {
396f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
398f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
399f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
400f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
401f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Use(value,
402f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
403f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      LUnallocated::USED_AT_START));
404f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
405f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
406f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
408f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return value->IsConstant() ? UseConstant(value) : UseRegister(value);
409f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
410f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
411f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
412f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
413f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return value->IsConstant() ? UseConstant(value) : UseRegisterAtStart(value);
414f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
415f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
416f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
417f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLConstantOperand* LChunkBuilder::UseConstant(HValue* value) {
418f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return chunk_->DefineConstantOperand(HConstant::cast(value));
419f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
420f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
421f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
422f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::UseAny(HValue* value) {
423f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return value->IsConstant()
424f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ? UseConstant(value)
425f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      : Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
426f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
427f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
428f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
429f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
430f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                    LUnallocated* result) {
431f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  result->set_virtual_register(current_instruction_->id());
432f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->set_result(result);
433f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return instr;
434f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
436f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister(
438f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTemplateResultInstruction<1>* instr) {
439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Define(instr,
440f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
441f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
442f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
443f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled(
445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTemplateResultInstruction<1>* instr, int index) {
446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Define(instr,
447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
451f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst(
452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTemplateResultInstruction<1>* instr) {
453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Define(instr,
454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineFixed(
459f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTemplateResultInstruction<1>* instr, Register reg) {
460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Define(instr, ToUnallocated(reg));
461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble(
465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTemplateResultInstruction<1>* instr, DoubleRegister reg) {
466f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return Define(instr, ToUnallocated(reg));
467f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
471f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                        HInstruction* hinstr,
472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                        CanDeoptimize can_deoptimize) {
473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  info()->MarkAsNonDeferredCalling();
474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#ifdef DEBUG
475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->VerifyCall();
476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif
477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->MarkAsCall();
478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr = AssignPointerMap(instr);
479f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // If instruction does not have side-effects lazy deoptimization
481f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // after the call will try to deoptimize to the point before the call.
482f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Thus we still need to attach environment to this call even if
483f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // call sequence can not deoptimize eagerly.
484f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool needs_environment =
485f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
486f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      !hinstr->HasObservableSideEffects();
487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (needs_environment && !instr->HasEnvironment()) {
488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    instr = AssignEnvironment(instr);
4894edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    // We can't really figure out if the environment is needed or not.
4904edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    instr->environment()->set_has_been_used();
491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return instr;
494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!instr->HasPointerMap());
499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return instr;
501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
503f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLUnallocated* LChunkBuilder::TempRegister() {
505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LUnallocated* operand =
506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int vreg = allocator_->GetVirtualRegister();
508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!allocator_->AllocationOk()) {
509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    vreg = 0;
511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  operand->set_virtual_register(vreg);
513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return operand;
514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
516f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
5175924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() {
5185924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LUnallocated* operand =
5195924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER);
5205924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  int vreg = allocator_->GetVirtualRegister();
5215924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (!allocator_->AllocationOk()) {
5225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
5235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    vreg = 0;
5245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
5255924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  operand->set_virtual_register(vreg);
5265924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  return operand;
5275924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org}
5285924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
5295924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgint LPlatformChunk::GetNextSpillIndex() {
531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return spill_slot_count_++;
532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) {
536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int index = GetNextSpillIndex();
537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (kind == DOUBLE_REGISTERS) {
538f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return LDoubleStackSlot::Create(index, zone());
539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
540e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(kind == GENERAL_REGISTERS);
541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return LStackSlot::Create(index, zone());
542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
5469d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) {
5479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LUnallocated* operand = ToUnallocated(reg);
548e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
5499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  return operand;
5509d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org}
5519d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
5529d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) {
554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LUnallocated* operand = ToUnallocated(reg);
555e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return operand;
557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
559f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
560f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLPlatformChunk* LChunkBuilder::Build() {
561e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_unused());
562f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  chunk_ = new(zone()) LPlatformChunk(info_, graph_);
563f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LPhase phase("L_Building chunk", chunk_);
564f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  status_ = BUILDING;
565f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
566f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // If compiling for OSR, reserve space for the unoptimized frame,
567f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // which will be subsumed into this frame.
568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (graph()->has_osr()) {
569f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // TODO(all): GetNextSpillIndex just increments a field. It has no other
570f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // side effects, so we should get rid of this loop.
571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      chunk_->GetNextSpillIndex();
573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
575f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  const ZoneList<HBasicBlock*>* blocks = graph_->blocks();
577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (int i = 0; i < blocks->length(); i++) {
578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    DoBasicBlock(blocks->at(i));
579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (is_aborted()) return NULL;
580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  status_ = DONE;
582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return chunk_;
583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block) {
587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_building());
588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  current_block_ = block;
589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
590f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (block->IsStartBlock()) {
591f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    block->UpdateEnvironment(graph_->start_environment());
592f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    argument_count_ = 0;
593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (block->predecessors()->length() == 1) {
594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // We have a single predecessor => copy environment and outgoing
595f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // argument count from the predecessor.
596e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block->phis()->length() == 0);
597f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HEnvironment* last_environment = pred->last_environment();
599e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(last_environment != NULL);
600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
601f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // Only copy the environment, if it is later used again.
602f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (pred->end()->SecondSuccessor() == NULL) {
603e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(pred->end()->FirstSuccessor() == block);
604f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if ((pred->end()->FirstSuccessor()->block_id() > block->block_id()) ||
606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          (pred->end()->SecondSuccessor()->block_id() > block->block_id())) {
607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        last_environment = last_environment->Copy();
608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    block->UpdateEnvironment(last_environment);
611e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(pred->argument_count() >= 0);
612f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    argument_count_ = pred->argument_count();
613f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // We are at a state join => process phis.
615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
616f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // No need to copy the environment, it cannot be used later.
617f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HEnvironment* last_environment = pred->last_environment();
618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    for (int i = 0; i < block->phis()->length(); ++i) {
619f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      HPhi* phi = block->phis()->at(i);
620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (phi->HasMergedIndex()) {
621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        last_environment->SetValueAt(phi->merged_index(), phi);
622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (block->deleted_phis()->at(i) < last_environment->length()) {
626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        last_environment->SetValueAt(block->deleted_phis()->at(i),
627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     graph_->GetConstantUndefined());
628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    block->UpdateEnvironment(last_environment);
631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // Pick up the outgoing argument count of one of the predecessors.
632f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    argument_count_ = pred->argument_count();
633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Translate hydrogen instructions to lithium ones for the current block.
636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HInstruction* current = block->first();
637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int start = chunk_->instructions()->length();
638f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  while ((current != NULL) && !is_aborted()) {
639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // Code for constants in registers is generated lazily.
640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (!current->EmitAtUses()) {
641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      VisitInstruction(current);
642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    current = current->next();
644f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
645f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int end = chunk_->instructions()->length() - 1;
646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (end >= start) {
647f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    block->set_first_instruction_index(start);
648f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    block->set_last_instruction_index(end);
649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
650f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  block->set_argument_count(argument_count_);
651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  current_block_ = NULL;
652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HInstruction* old_current = current_instruction_;
657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  current_instruction_ = current;
658f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* instr = NULL;
660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (current->CanReplaceWithDummyUses()) {
661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (current->OperandCount() == 0) {
662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      instr = DefineAsRegister(new(zone()) LDummy());
663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(!current->OperandAt(0)->IsControlInstruction());
665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      instr = DefineAsRegister(new(zone())
666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          LDummyUse(UseAny(current->OperandAt(0))));
667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    for (int i = 1; i < current->OperandCount(); ++i) {
669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (current->OperandAt(i)->IsControlInstruction()) continue;
670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LInstruction* dummy =
671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      dummy->set_hydrogen_value(current);
673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      chunk_->AddInstruction(dummy, current_block_);
674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
6768d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    HBasicBlock* successor;
6778d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    if (current->IsControlInstruction() &&
6788d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
6798d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        successor != NULL) {
6808d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = new(zone()) LGoto(successor);
6818d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    } else {
6828d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = current->CompileToLithium(this);
6838d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    }
684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  argument_count_ += current->argument_delta();
687e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ >= 0);
688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr != NULL) {
690011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(instr, current);
691011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
692011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
693011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  current_instruction_ = old_current;
694011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
695011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
696011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
697011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr,
698011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org                                   HInstruction* hydrogen_val) {
699011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Associate the hydrogen instruction first, since we may need it for
700011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
701011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  instr->set_hydrogen_value(hydrogen_val);
702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#if DEBUG
704011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Make sure that the lithium instruction has either no fixed register
705011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // constraints in temps or the result OR no uses that are only used at
706011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // start. If this invariant doesn't hold, the register allocator can decide
707011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // to insert a split of a range immediately before the instruction due to an
708011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // already allocated register needing to be used for the instruction's fixed
709011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // register constraint. In this case, the register allocator won't see an
710011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // interference between the split child and the use-at-start (it would if
711011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the it was just a plain use), so it is free to move the split child into
712011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the same register that is used for the use-at-start.
713011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // See https://code.google.com/p/chromium/issues/detail?id=201590
714011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (!(instr->ClobbersRegisters() &&
715011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org        instr->ClobbersDoubleRegisters(isolate()))) {
716011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int fixed = 0;
717011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int used_at_start = 0;
718011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (UseIterator it(instr); !it.Done(); it.Advance()) {
719011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
720011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->IsUsedAtStart()) ++used_at_start;
721f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
722011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instr->Output() != NULL) {
723011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
724011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
725011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (TempIterator it(instr); !it.Done(); it.Advance()) {
726011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
727011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->HasFixedPolicy()) ++fixed;
728011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
729e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(fixed == 0 || used_at_start == 0);
730011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
731f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif
732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
733011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
734011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignPointerMap(instr);
735011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
736011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_environments && !instr->HasEnvironment()) {
737011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignEnvironment(instr);
738011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
739011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  chunk_->AddInstruction(instr, current_block_);
740011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
741011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (instr->IsCall()) {
742011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    HValue* hydrogen_value_for_lazy_bailout = hydrogen_val;
743011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* instruction_needing_environment = NULL;
744011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (hydrogen_val->HasObservableSideEffects()) {
745011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      HSimulate* sim = HSimulate::cast(hydrogen_val->next());
746011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment = instr;
747011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      sim->ReplayEnvironment(current_block_->last_environment());
748011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      hydrogen_value_for_lazy_bailout = sim;
749f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
750011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
751011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
752011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    chunk_->AddInstruction(bailout, current_block_);
753011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instruction_needing_environment != NULL) {
754011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Store the lazy deopt environment with the instruction if needed.
755011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Right now it is only used for LInstanceOfKnownGlobal.
756011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment->
757011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org          SetDeferredLazyDeoptimizationEnvironment(bailout->environment());
758486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    }
759f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
760f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
761f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
762f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
763f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
764f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HEnvironment* hydrogen_env = current_block_->last_environment();
765f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int argument_index_accumulator = 0;
766f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ZoneList<HValue*> objects_to_materialize(0, zone());
767f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->set_environment(CreateEnvironment(hydrogen_env,
768f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           &argument_index_accumulator,
769f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           &objects_to_materialize));
770f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return instr;
771f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
772f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
773f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
774f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
775f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // The control instruction marking the end of a block that completed
776f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // abruptly (e.g., threw an exception). There is nothing specific to do.
777f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
778f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
779f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
780f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
781f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
782f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           HArithmeticBinaryOperation* instr) {
783e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
785e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsDouble());
786f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
787f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (op == Token::MOD) {
788f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* left = UseFixedDouble(instr->left(), d0);
789f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right = UseFixedDouble(instr->right(), d1);
790f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(Token::MOD, left, right);
791f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return MarkAsCall(DefineFixedDouble(result, d0), instr);
792f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
793f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
794f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
795f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
796f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(result);
797f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
798f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
799f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
800f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
801f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
802f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           HBinaryOperation* instr) {
803e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((op == Token::ADD) || (op == Token::SUB) || (op == Token::MUL) ||
804f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org         (op == Token::DIV) || (op == Token::MOD) || (op == Token::SHR) ||
805f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org         (op == Token::SHL) || (op == Token::SAR) || (op == Token::ROR) ||
806f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org         (op == Token::BIT_OR) || (op == Token::BIT_AND) ||
807f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org         (op == Token::BIT_XOR));
808f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HValue* left = instr->left();
809f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HValue* right = instr->right();
810f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
811f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // TODO(jbramley): Once we've implemented smi support for all arithmetic
812f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // operations, these assertions should check IsTagged().
813e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrTagged());
814e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(left->representation().IsSmiOrTagged());
815e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(right->representation().IsSmiOrTagged());
816f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
817f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
818f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left_operand = UseFixed(left, x1);
819f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* right_operand = UseFixed(right, x0);
820f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LArithmeticT* result =
821f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
822f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
823f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
824f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
825f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
826f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
827f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HBoundsCheckBaseIndexInformation* instr) {
828f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  UNREACHABLE();
829f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
830f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
831f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
832f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
833f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
834f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  info()->MarkAsRequiresFrame();
835f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* args = NULL;
836f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* length = NULL;
837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* index = NULL;
838f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
839f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->length()->IsConstant() && instr->index()->IsConstant()) {
840f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    args = UseRegisterAtStart(instr->arguments());
841f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    length = UseConstant(instr->length());
842f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    index = UseConstant(instr->index());
843f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
844f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    args = UseRegister(instr->arguments());
845f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    length = UseRegisterAtStart(instr->length());
846f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    index = UseRegisterOrConstantAtStart(instr->index());
847f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
848f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
849f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
850f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
851f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
852f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
853f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
855e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
856e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
8575924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
8585924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    LInstruction* shifted_operation = TryDoOpWithShiftedRightOperand(instr);
8595924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    if (shifted_operation != NULL) {
8605924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      return shifted_operation;
8615924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    }
8625924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
863f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
864f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right =
865f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        UseRegisterOrConstantAtStart(instr->BetterRightOperand());
866f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LInstruction* result = instr->representation().IsSmi() ?
867f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LAddS(left, right)) :
868f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LAddI(left, right));
869f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
870f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      result = AssignEnvironment(result);
871f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
872f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return result;
873f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (instr->representation().IsExternal()) {
874e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsExternal());
875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsInteger32());
876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
877f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
878f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
879f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LAddE(left, right));
880f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (instr->representation().IsDouble()) {
881f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticD(Token::ADD, instr);
882f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
883e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->representation().IsTagged());
884f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticT(Token::ADD, instr);
885f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
886f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
887f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
888f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
889f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
890f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  info()->MarkAsDeferredCalling();
891f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseAny(instr->context());
892f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* size = UseRegisterOrConstant(instr->size());
893f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp1 = TempRegister();
894f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp2 = TempRegister();
895381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LOperand* temp3 = instr->MustPrefillWithFiller() ? TempRegister() : NULL;
896381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2, temp3);
897f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignPointerMap(DefineAsRegister(result));
898f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
899f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
900f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
901f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
902f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseFixed(instr->function(), x1);
903f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* receiver = UseFixed(instr->receiver(), x0);
904f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* length = UseFixed(instr->length(), x2);
905f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* elements = UseFixed(instr->elements(), x3);
906f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LApplyArguments* result = new(zone()) LApplyArguments(function,
907f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                        receiver,
908f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                        length,
909f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                        elements);
910f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr, CAN_DEOPTIMIZE_EAGERLY);
911f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
912f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
913f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
914f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* instr) {
915f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  info()->MarkAsRequiresFrame();
916f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = instr->from_inlined() ? NULL : TempRegister();
917f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LArgumentsElements(temp));
918f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
919f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
920f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
921f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) {
922f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  info()->MarkAsRequiresFrame();
923f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
924f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LArgumentsLength(value));
925f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
926f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
928f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // There are no real uses of the arguments object.
930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // arguments.length and element access are supported directly on
931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // stack arguments, and any real arguments object use causes a bailout.
932f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // So this value is never used.
933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
936f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
937f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
938f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
939e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
940e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
941e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
942f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
9435924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    LInstruction* shifted_operation = TryDoOpWithShiftedRightOperand(instr);
9445924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    if (shifted_operation != NULL) {
9455924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      return shifted_operation;
9465924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    }
9475924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
948f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
949f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right =
950f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        UseRegisterOrConstantAtStart(instr->BetterRightOperand());
951f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return instr->representation().IsSmi() ?
952f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LBitS(left, right)) :
953f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LBitI(left, right));
954f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
955f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticT(instr->op(), instr);
956f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
957f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
958f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
959f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
960f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
961f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // V8 expects a label to be generated for each basic block.
962f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // This is used in some places like LAllocator::IsBlockBoundary
963f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // in lithium-allocator.cc
964f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LLabel(instr->block());
965f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
966f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
967f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
968f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
969a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code && instr->skip_check()) return NULL;
970a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
971a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* length = !index->IsConstantOperand()
972a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      ? UseRegisterOrConstantAtStart(instr->length())
973a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      : UseRegisterAtStart(instr->length());
974a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LInstruction* result = new(zone()) LBoundsCheck(index, length);
975a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code || !instr->skip_check()) {
976a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org    result = AssignEnvironment(result);
977a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  }
978a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  return result;
979f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
980f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
981f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
982f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
983f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HValue* value = instr->value();
984f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation r = value->representation();
985f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HType type = value->type();
986f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
987f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (r.IsInteger32() || r.IsSmi() || r.IsDouble()) {
988f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // These representations have simple checks that cannot deoptimize.
989f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LBranch(UseRegister(value), NULL, NULL);
990f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
991e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(r.IsTagged());
992f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (type.IsBoolean() || type.IsSmi() || type.IsJSArray() ||
993f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        type.IsHeapNumber()) {
994f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      // These types have simple checks that cannot deoptimize.
995f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return new(zone()) LBranch(UseRegister(value), NULL, NULL);
996f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
997f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
998f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (type.IsString()) {
999f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      // This type cannot deoptimize, but needs a scratch register.
1000f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return new(zone()) LBranch(UseRegister(value), TempRegister(), NULL);
1001f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1002f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1003f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    ToBooleanStub::Types expected = instr->expected_input_types();
1004f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    bool needs_temps = expected.NeedsMap() || expected.IsEmpty();
1005f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* temp1 = needs_temps ? TempRegister() : NULL;
1006f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* temp2 = needs_temps ? TempRegister() : NULL;
1007f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1008f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (expected.IsGeneric() || expected.IsEmpty()) {
1009f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      // The generic case cannot deoptimize because it already supports every
1010f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      // possible input type.
1011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(needs_temps);
1012f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return new(zone()) LBranch(UseRegister(value), temp1, temp2);
1013f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
1014f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return AssignEnvironment(
1015f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          new(zone()) LBranch(UseRegister(value), temp1, temp2));
1016f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1017f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1018f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1019f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1020f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1021f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction(
1022f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HCallJSFunction* instr) {
1023f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseFixed(instr->function(), x1);
1024f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1025f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LCallJSFunction* result = new(zone()) LCallJSFunction(function);
1026f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1027f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1028f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1029f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1030f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1031f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor(
1032f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HCallWithDescriptor* instr) {
10339aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  CallInterfaceDescriptor descriptor = instr->descriptor();
1034f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1035f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
1036f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
1037f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ops.Add(target, zone());
1038f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  for (int i = 1; i < instr->OperandCount(); i++) {
10399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    LOperand* op =
10409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org        UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1));
1041f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    ops.Add(op, zone());
1042f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1043f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1044f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(descriptor,
1045f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                                ops,
1046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                                zone());
1047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1048f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1049f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1050f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1051f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1052f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1053f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseFixed(instr->function(), x1);
1054f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LCallFunction* call = new(zone()) LCallFunction(context, function);
1055f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(call, x0), instr);
1056f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1057f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1058f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1059f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
1060f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1061f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // The call to CallConstructStub will expect the constructor to be in x1.
1062f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), x1);
1063f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LCallNew* result = new(zone()) LCallNew(context, constructor);
1064f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1065f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1066f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1067f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1068f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
1069f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1070f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // The call to ArrayConstructCode will expect the constructor to be in x1.
1071f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), x1);
1072f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
1073f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1074f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1075f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1076f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1077f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1078f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1079f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), x0), instr);
1080f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1081f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1082f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1083f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
1084f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1085f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), x0), instr);
1086f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1087f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1088f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1089f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
1090f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
1091f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1092f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // There are no real uses of a captured object.
1093f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
1094f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1095f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1096f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1097f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) {
1098f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation from = instr->from();
1099f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation to = instr->to();
1100ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  HValue* val = instr->value();
1101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (from.IsSmi()) {
1102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (to.IsTagged()) {
1103ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    from = Representation::Tagged();
1107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (from.IsTagged()) {
1109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (to.IsDouble()) {
1110ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp = TempRegister();
1112ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LInstruction* result =
1113ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org          DefineAsRegister(new(zone()) LNumberUntagD(value, temp));
1114ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1115ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      return result;
1116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else if (to.IsSmi()) {
1117ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1118ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->type().IsSmi()) {
1119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        return DefineSameAsFirst(new(zone()) LDummyUse(value));
1120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
1122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
1123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
1124ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->type().IsSmi() || val->representation().IsSmi()) {
1125ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1126ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiUntag(value, false));
1127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
1128ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegister(val);
1129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* temp1 = TempRegister();
11305924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org        LOperand* temp2 = instr->CanTruncateToInt32()
11315924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org            ? NULL : TempDoubleRegister();
1132ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LInstruction* result =
1133ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            DefineAsRegister(new(zone()) LTaggedToI(value, temp1, temp2));
11344edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1135ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return result;
1136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1137f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1138f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (from.IsDouble()) {
1139f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (to.IsTagged()) {
1140f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      info()->MarkAsDeferredCalling();
1141ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1142f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp1 = TempRegister();
1143f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp2 = TempRegister();
1144f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2);
1145f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return AssignPointerMap(DefineAsRegister(result));
1146f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
1147e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsSmi() || to.IsInteger32());
1148f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (instr->CanTruncateToInt32()) {
1149ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegister(val);
1150ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return DefineAsRegister(new(zone()) LTruncateDoubleToIntOrSmi(value));
1151f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
1152ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegister(val);
1153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LDoubleToIntOrSmi* result = new(zone()) LDoubleToIntOrSmi(value);
1154f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        return AssignEnvironment(DefineAsRegister(result));
1155f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1156f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1157f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (from.IsInteger32()) {
1158f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    info()->MarkAsDeferredCalling();
1159f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (to.IsTagged()) {
1160ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
1161ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegister(val);
1162ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LNumberTagU* result =
1163ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            new(zone()) LNumberTagU(value, TempRegister(), TempRegister());
1164ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return AssignPointerMap(DefineAsRegister(result));
1165f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
1166f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        STATIC_ASSERT((kMinInt == Smi::kMinValue) &&
1167f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                      (kMaxInt == Smi::kMaxValue));
1168ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
1169f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        return DefineAsRegister(new(zone()) LSmiTag(value));
1170f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else if (to.IsSmi()) {
1172ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegisterAtStart(val);
1173381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
1174ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
1175381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        result = AssignEnvironment(result);
1176f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1177381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      return result;
1178f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
1179e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsDouble());
1180ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
1181f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        return DefineAsRegister(
1182ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            new(zone()) LUint32ToDouble(UseRegisterAtStart(val)));
1183f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
1184f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        return DefineAsRegister(
1185ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            new(zone()) LInteger32ToDouble(UseRegisterAtStart(val)));
1186f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1188f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  UNREACHABLE();
1190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
1191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1193f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1194f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
11959801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
11969801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  return AssignEnvironment(new(zone()) LCheckValue(value));
1197f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1198f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1199f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
1201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
1203f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result = new(zone()) LCheckInstanceType(value, temp);
1204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(result);
1205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
1209af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
1210af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1211af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LOperand* temp = TempRegister();
1212af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value, temp));
1213af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->HasMigrationTarget()) {
1214af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    info()->MarkAsDeferredCalling();
1215af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    result = AssignPointerMap(result);
1216ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
1217ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
1218f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1219f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1220f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
1222f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
12238f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  LInstruction* result = new(zone()) LCheckNonSmi(value);
1224eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  if (!instr->value()->type().IsHeapObject()) {
1225eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    result = AssignEnvironment(result);
1226eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  }
12278f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  return result;
1228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1229f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1230f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1231f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
1232f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1233f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(new(zone()) LCheckSmi(value));
1234f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1236f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1238f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HValue* value = instr->value();
1239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation input_rep = value->representation();
1240f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* reg = UseRegister(value);
1241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (input_rep.IsDouble()) {
1242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LClampDToUint8(reg));
1243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (input_rep.IsInteger32()) {
1244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LClampIToUint8(reg));
1245f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1246e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(input_rep.IsSmiOrTagged());
1247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return AssignEnvironment(
1248f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LClampTToUint8(reg,
12495924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org                                                    TempDoubleRegister())));
1250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1252f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1254f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
1255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HClassOfTestAndBranch* instr) {
1256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LClassOfTestAndBranch(value,
1259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           TempRegister(),
1260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                           TempRegister());
1261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1264f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HCompareNumericAndBranch* instr) {
1266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation r = instr->representation();
1267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (r.IsSmiOrInteger32()) {
1268e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(r));
1269e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(r));
1270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
1271f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
1272f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
1273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1274e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(r.IsDouble());
1275e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
1277248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    if (instr->left()->IsConstant() && instr->right()->IsConstant()) {
1278248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      LOperand* left = UseConstant(instr->left());
1279248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      LOperand* right = UseConstant(instr->right());
1280248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      return new(zone()) LCompareNumericAndBranch(left, right);
1281248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    }
1282248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
1283248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
1284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
1285f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1286f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1287f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1290e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1291e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
1292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = UseFixed(instr->left(), x1);
1294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* right = UseFixed(instr->right(), x0);
1295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LCmpT* result = new(zone()) LCmpT(context, left, right);
1296f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HCompareHoleAndBranch* instr) {
1302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegister(instr->value());
1303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsTagged()) {
1304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LCmpHoleAndBranchT(value);
1305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1306f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* temp = TempRegister();
1307f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LCmpHoleAndBranchD(value, temp);
1308f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
1313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HCompareObjectEqAndBranch* instr) {
1314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = UseRegisterAtStart(instr->left());
1315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* right = UseRegisterAtStart(instr->right());
1316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LCmpObjectEqAndBranch(left, right);
1317f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1318f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1319f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1320f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
1321e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
1324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LCmpMapAndBranch(value, temp);
1325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation r = instr->representation();
1330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (r.IsSmi()) {
1331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LConstantS);
1332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (r.IsInteger32()) {
1333f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LConstantI);
1334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (r.IsDouble()) {
1335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LConstantD);
1336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (r.IsExternal()) {
1337f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LConstantE);
1338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (r.IsTagged()) {
1339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LConstantT);
1340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    UNREACHABLE();
1342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return NULL;
1343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1347f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) {
1348f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->HasNoUses()) return NULL;
1349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (info()->IsStub()) {
1351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineFixed(new(zone()) LContext, cp);
1352f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LContext);
1355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
1359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseFixed(instr->value(), x0);
1360f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LDateField* result = new(zone()) LDateField(object, instr->index());
1361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr, CAN_DEOPTIMIZE_EAGERLY);
1362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
1366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LDebugBreak();
1367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
1371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1372f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
1373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
1377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(new(zone()) LDeoptimize);
1378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1381ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1385ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1386ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1387486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
1388486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1389486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1390486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
1391ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
1392486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org       divisor != 1 && divisor != -1)) {
1393486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1394486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1395486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1396ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1397ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1398ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1399bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1400e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1403bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1404bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1405486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)
1406486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      ? NULL : TempRegister();
1407486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI(
1408486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp));
1409486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (divisor == 0 ||
1410486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1411486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
1412486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1413486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1414486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1415bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1416bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1417bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1418ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HBinaryOperation* instr) {
1419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1420e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1421e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1422ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1423ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1424ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)
1425ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      ? NULL : TempRegister();
1426ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* result =
1427ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp));
1428ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (!instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) {
1429ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
1430ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
1431ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
1432ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1433ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1434ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1436ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1437bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
1438bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivByPowerOf2I(instr);
1439bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
1440bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivByConstI(instr);
1441bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else {
1442bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivI(instr);
1443bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
1444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (instr->representation().IsDouble()) {
1445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticD(Token::DIV, instr);
1446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticT(Token::DIV, instr);
1448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1451f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
1453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
1454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
1458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HEnvironment* outer = current_block_->last_environment();
1459f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  outer->set_ast_id(instr->ReturnId());
1460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HConstant* undefined = graph()->GetConstantUndefined();
1461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
1462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                               instr->arguments_count(),
1463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                               instr->function(),
1464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                               undefined,
1465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                               instr->inlining_kind());
1466f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Only replay binding of arguments object if it wasn't removed from graph.
1467f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if ((instr->arguments_var() != NULL) &&
1468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      instr->arguments_object()->IsLinked()) {
1469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    inner->Bind(instr->arguments_var(), instr->arguments_object());
1470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1471ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  inner->BindContext(instr->closure_context());
1472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  inner->set_entry(instr);
1473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  current_block_->UpdateEnvironment(inner);
1474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  chunk_->AddInlinedClosure(instr->closure());
1475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
1476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1479f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
1480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  UNREACHABLE();
1481f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
1482f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1483f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1484f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1485f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(
1486f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HForceRepresentation* instr) {
1487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // All HForceRepresentation instructions should be eliminated in the
1488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // representation change phase of Hydrogen.
1489f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  UNREACHABLE();
1490f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
1491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
1495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(
1497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      DefineFixed(new(zone()) LFunctionLiteral(context), x0), instr);
1498f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HGetCachedArrayIndex* instr) {
1503e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
1506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
1510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LGoto(instr->FirstSuccessor());
1511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
1515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HHasCachedArrayIndexAndBranch* instr) {
1516e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LHasCachedArrayIndexAndBranch(
1518f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UseRegisterAtStart(instr->value()), TempRegister());
1519f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1520f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1521f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1522f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
1523f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HHasInstanceTypeAndBranch* instr) {
1524e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1525f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LHasInstanceTypeAndBranch(value, TempRegister());
1527f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1528f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject(
1531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HInnerAllocatedObject* instr) {
1532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* base_object = UseRegisterAtStart(instr->base_object());
1533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
1534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(
1535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LInnerAllocatedObject(base_object, offset));
1536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1538f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
1540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstanceOf* result = new(zone()) LInstanceOf(
1542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      context,
1543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UseFixed(instr->left(), InstanceofStub::left()),
1544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UseFixed(instr->right(), InstanceofStub::right()));
1545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1546f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1549f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1550f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HInstanceOfKnownGlobal* instr) {
1551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstanceOfKnownGlobal* result = new(zone()) LInstanceOfKnownGlobal(
1552f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UseFixed(instr->context(), cp),
1553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UseFixed(instr->left(), InstanceofStub::left()));
1554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1555f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1558e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache(
1559e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    HTailCallThroughMegamorphicCache* instr) {
1560e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1561e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* receiver_register =
1562e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister());
1563e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* name_register =
1564e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->name(), LoadDescriptor::NameRegister());
1565e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  // Not marked as call. It can't deoptimize, and it never returns.
1566e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return new (zone()) LTailCallThroughMegamorphicCache(
1567e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      context, receiver_register, name_register);
1568e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
1569e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1570e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // The function is required (by MacroAssembler::InvokeFunction) to be in x1.
1574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseFixed(instr->function(), x1);
1575f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
1576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
1581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HIsConstructCallAndBranch* instr) {
1582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LIsConstructCallAndBranch(TempRegister(), TempRegister());
1583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch(
1587f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HCompareMinusZeroAndBranch* instr) {
1588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegister(instr->value());
1589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* scratch = TempRegister();
1590f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LCompareMinusZeroAndBranch(value, scratch);
1591f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1592f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1595e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1596f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1597f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp1 = TempRegister();
1598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp2 = TempRegister();
1599f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LIsObjectAndBranch(value, temp1, temp2);
1600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1601f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1602f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1603f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1604e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
1607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LIsStringAndBranch(value, temp);
1608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1611f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1612e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1613f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LIsSmiAndBranch(UseRegisterAtStart(instr->value()));
1614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1616f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1617f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
1618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HIsUndetectableAndBranch* instr) {
1619e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
1620f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LIsUndetectableAndBranch(value, TempRegister());
1622f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1625f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
1626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* pop = NULL;
1627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HEnvironment* env = current_block_->last_environment();
1628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (env->entry()->arguments_pushed()) {
1630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    int argument_count = env->arguments_environment()->parameter_count();
1631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    pop = new(zone()) LDrop(argument_count);
1632e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->argument_delta() == -argument_count);
1633f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  HEnvironment* outer =
1636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      current_block_->last_environment()->DiscardInlined(false);
1637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  current_block_->UpdateEnvironment(outer);
1638f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return pop;
1640f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1641f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1642f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1643f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
1644f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseRegisterAtStart(instr->value());
1645f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result =
1646f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      DefineAsRegister(new(zone()) LLoadContextSlot(context));
1647ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
1648ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
1649ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
1650ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
1651f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1652f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1653f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1654f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
1655f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HLoadFunctionPrototype* instr) {
1656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseRegister(instr->function());
1657f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
1658f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(DefineAsRegister(
1659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LLoadFunctionPrototype(function, temp)));
1660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1663f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
1664f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell();
1665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return instr->RequiresHoleCheck()
1666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ? AssignEnvironment(DefineAsRegister(result))
1667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      : DefineAsRegister(result);
1668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
1672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1673fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* global_object =
16749aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister());
16759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
16769d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
16779aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
16789d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
16799d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LLoadGlobalGeneric* result =
16819d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      new(zone()) LLoadGlobalGeneric(context, global_object, vector);
1682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
1683f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
1687e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsSmiOrInteger32());
1688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  ElementsKind elements_kind = instr->elements_kind();
1689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* elements = UseRegister(instr->elements());
16905924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LOperand* key = UseRegisterOrConstant(instr->key());
1691f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!instr->is_typed_elements()) {
1693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (instr->representation().IsDouble()) {
1694f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp = (!instr->key()->IsConstant() ||
1695f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                        instr->RequiresHoleCheck())
1696f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org             ? TempRegister()
1697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org             : NULL;
1698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LLoadKeyedFixedDouble* result =
1700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          new(zone()) LLoadKeyedFixedDouble(elements, key, temp);
1701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return instr->RequiresHoleCheck()
1702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          ? AssignEnvironment(DefineAsRegister(result))
1703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          : DefineAsRegister(result);
1704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
1705e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsSmiOrTagged() ||
1706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org             instr->representation().IsInteger32());
1707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp = instr->key()->IsConstant() ? NULL : TempRegister();
1708f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LLoadKeyedFixed* result =
1709f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          new(zone()) LLoadKeyedFixed(elements, key, temp);
1710f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return instr->RequiresHoleCheck()
1711f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          ? AssignEnvironment(DefineAsRegister(result))
1712f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          : DefineAsRegister(result);
1713f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1714f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1715e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK((instr->representation().IsInteger32() &&
1716f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org            !IsDoubleOrFloatElementsKind(instr->elements_kind())) ||
1717f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org           (instr->representation().IsDouble() &&
1718f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org            IsDoubleOrFloatElementsKind(instr->elements_kind())));
1719f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1720f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* temp = instr->key()->IsConstant() ? NULL : TempRegister();
1721ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    LInstruction* result = DefineAsRegister(
1722ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        new(zone()) LLoadKeyedExternal(elements, key, temp));
1723ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    if ((elements_kind == EXTERNAL_UINT32_ELEMENTS ||
1724ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org         elements_kind == UINT32_ELEMENTS) &&
1725ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        !instr->CheckFlag(HInstruction::kUint32)) {
1726ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      result = AssignEnvironment(result);
1727f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1728ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    return result;
1729f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1730f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1731f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1733f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
1734f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1735fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
17369aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
17379aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister());
17389d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
17399d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
17409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
17419d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
1742f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1743f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result =
17449d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector),
17459d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  x0);
1746f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(result, instr);
1747f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1748f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1749f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1750f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
1751f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseRegisterAtStart(instr->object());
1752f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LLoadNamedField(object));
1753f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1754f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1755f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1756f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
1757f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1758fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
17599aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
17609d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
17619d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
17629aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
17639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
17649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1765f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result =
17669d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), x0);
1767f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(result, instr);
1768f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1769f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1770f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1771f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
1772f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LLoadRoot);
1773f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1774f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1775f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1776f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
1777f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* map = UseRegisterAtStart(instr->value());
1778f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LMapEnumLength(map));
1779f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1780f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1781f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1782ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1783e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1785e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1786ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1787ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1788381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I(
1789381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org          dividend, divisor));
1790381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1791381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1792381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    result = AssignEnvironment(result);
1793381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
1794381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return result;
1795ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1796ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1797ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1798bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1799e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1800e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1801e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1802bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1803bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
18047010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LOperand* temp =
18057010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
18067010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
18077010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      NULL : TempRegister();
18087010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LInstruction* result = DefineAsRegister(
18097010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      new(zone()) LFlooringDivByConstI(dividend, divisor, temp));
18107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  if (divisor == 0 ||
18117010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
18127010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    result = AssignEnvironment(result);
18137010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  }
18147010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  return result;
1815bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1816bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1817bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1818ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1819f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* dividend = UseRegister(instr->left());
1820ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1821f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* remainder = TempRegister();
1822ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* result =
1823ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      DefineAsRegister(new(zone()) LFlooringDivI(dividend, divisor, remainder));
1824ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return AssignEnvironment(result);
1825ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1826ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1827ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1828ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1829ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (instr->RightIsPowerOf2()) {
1830ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return DoFlooringDivByPowerOf2I(instr);
18317010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  } else if (instr->right()->IsConstant()) {
18327010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    return DoFlooringDivByConstI(instr);
1833ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  } else {
1834ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return DoFlooringDivI(instr);
1835ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
1836f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1838f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1839f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1840f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = NULL;
1841f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* right = NULL;
1842f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1843e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1844e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1845f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    left = UseRegisterAtStart(instr->BetterLeftOperand());
1846f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    right = UseRegisterOrConstantAtStart(instr->BetterRightOperand());
1847f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1848e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->representation().IsDouble());
1849e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1850e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
1851f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    left = UseRegisterAtStart(instr->left());
1852f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    right = UseRegisterAtStart(instr->right());
1853f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(new(zone()) LMathMinMax(left, right));
1855f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1856f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1857f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1858ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1860e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1861e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1862ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1863ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1864486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1865486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1866e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1867e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1868486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1869486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1870486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1871ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1872f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1873f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1874bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1875e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1877e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1878bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1879bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1880bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp = TempRegister();
1881486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModByConstI(
1882486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp));
1883486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1884486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1885486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1886486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1887bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1888bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1889bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1890ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1891e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1892e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1893e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
1894ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1895ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1896486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModI(dividend, divisor));
1897486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1898486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1899486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1900486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1901486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1902ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1903f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1904f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1905ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1906ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1907bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
1908bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModByPowerOf2I(instr);
1909bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
1910bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModByConstI(instr);
1911bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else {
1912bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModI(instr);
1913bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
1914ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1915ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return DoArithmeticD(Token::MOD, instr);
1916f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1917ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return DoArithmeticT(Token::MOD, instr);
1918f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1919f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1920f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1921f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1922f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1923f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1924e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1925e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1926f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1928f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero);
1929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HValue* least_const = instr->BetterLeftOperand();
1931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HValue* most_const = instr->BetterRightOperand();
1932f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // LMulConstI can handle a subset of constants:
1934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    //  With support for overflow detection:
1935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    //    -1, 0, 1, 2
1936f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    //    2^n, -(2^n)
19377a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org    //  Without support for overflow detection:
1938f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    //    2^n + 1, -(2^n - 1)
1939f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (most_const->IsConstant()) {
1940f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      int32_t constant = HConstant::cast(most_const)->Integer32Value();
19417a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org      bool small_constant = (constant >= -1) && (constant <= 2);
19427a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org      bool end_range_constant = (constant <= -kMaxInt) || (constant == kMaxInt);
19437a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org      int32_t constant_abs = Abs(constant);
19447a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org
19457a1bfbe9bc8295770315c55f7ce40822b7951aabmachenbach@chromium.org      if (!end_range_constant &&
194621d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org          (small_constant || (base::bits::IsPowerOfTwo32(constant_abs)) ||
194721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org           (!can_overflow && (base::bits::IsPowerOfTwo32(constant_abs + 1) ||
194821d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org                              base::bits::IsPowerOfTwo32(constant_abs - 1))))) {
1949f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LConstantOperand* right = UseConstant(most_const);
195021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org        bool need_register =
195121d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org            base::bits::IsPowerOfTwo32(constant_abs) && !small_constant;
1952ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* left = need_register ? UseRegister(least_const)
1953ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org                                       : UseRegisterAtStart(least_const);
1954ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LInstruction* result =
1955ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            DefineAsRegister(new(zone()) LMulConstIS(left, right));
1956ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        if ((bailout_on_minus_zero && constant <= 0) || can_overflow) {
1957ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org          result = AssignEnvironment(result);
1958ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        }
1959ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return result;
1960f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
1961f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1962f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1963f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // LMulI/S can handle all cases, but it requires that a register is
1964f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // allocated for the second operand.
1965ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    LOperand* left = UseRegisterAtStart(least_const);
1966ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    LOperand* right = UseRegisterAtStart(most_const);
1967ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    LInstruction* result = instr->representation().IsSmi()
1968ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        ? DefineAsRegister(new(zone()) LMulS(left, right))
1969ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        : DefineAsRegister(new(zone()) LMulI(left, right));
1970ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    if ((bailout_on_minus_zero && least_const != most_const) || can_overflow) {
1971ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      result = AssignEnvironment(result);
1972f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
1973f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return result;
1974f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (instr->representation().IsDouble()) {
1975f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticD(Token::MUL, instr);
1976f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1977f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticT(Token::MUL, instr);
1978f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
1979f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1980f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1981f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1982f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
1983e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ == 0);
1984f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  allocator_->MarkAsOsrEntry();
1985f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  current_block_->last_environment()->set_ast_id(instr->ast_id());
1986f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(new(zone()) LOsrEntry);
1987f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1988f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1989f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1990f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
1991f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LParameter* result = new(zone()) LParameter;
1992f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->kind() == HParameter::STACK_PARAMETER) {
1993f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    int spill_index = chunk_->GetParameterStackSlot(instr->index());
1994f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsSpilled(result, spill_index);
1995f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
1996e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(info()->IsStub());
1997e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    CallInterfaceDescriptor descriptor =
1998e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org        info()->code_stub()->GetCallInterfaceDescriptor();
1999f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    int index = static_cast<int>(instr->index());
200042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org    Register reg = descriptor.GetEnvironmentParameterRegister(index);
2001f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineFixed(result, reg);
2002f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2003f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2004f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2005f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2006f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) {
2007e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
2008f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // We call a C function for double power. It can't trigger a GC.
2009f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // We need to use fixed result register for the call.
2010f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation exponent_type = instr->right()->representation();
2011e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
2012f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = UseFixedDouble(instr->left(), d0);
20136313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  LOperand* right;
20146313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  if (exponent_type.IsInteger32()) {
20156313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org    right = UseFixed(instr->right(), MathPowIntegerDescriptor::exponent());
20166313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  } else if (exponent_type.IsDouble()) {
20176313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org    right = UseFixedDouble(instr->right(), d1);
20186313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  } else {
20196313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org    right = UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
20206313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  }
2021f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LPower* result = new(zone()) LPower(left, right);
2022f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixedDouble(result, d0),
2023f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                    instr,
2024f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                    CAN_DEOPTIMIZE_EAGERLY);
2025f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2026f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2027f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2028011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
2029011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  int argc = instr->OperandCount();
2030011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  AddInstruction(new(zone()) LPreparePushArguments(argc), instr);
2031011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
2032011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  LPushArguments* push_args = new(zone()) LPushArguments(zone());
2033011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
2034011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  for (int i = 0; i < argc; ++i) {
2035011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (push_args->ShouldSplitPush()) {
2036011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      AddInstruction(push_args, instr);
2037011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      push_args = new(zone()) LPushArguments(zone());
2038011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
2039011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    push_args->AddArgument(UseRegister(instr->argument(i)));
2040011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
2041011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
2042011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return push_args;
2043f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2044f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2045f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
2047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2048f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(
2049f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      DefineFixed(new(zone()) LRegExpLiteral(context), x0), instr);
2050f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2051f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2052f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2053ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) {
2054ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  HValue* value = instr->value();
2055e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(value->representation().IsDouble());
2056ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value)));
2057ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2058ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2059ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2060ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) {
2061aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  LOperand* lo = UseRegisterAndClobber(instr->lo());
2062ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* hi = UseRegister(instr->hi());
2063aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org  return DefineAsRegister(new(zone()) LConstructDouble(hi, lo));
2064ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2065ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2066ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2067f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
2068f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = info()->IsStub()
2069f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ? UseFixed(instr->context(), cp)
2070f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      : NULL;
2071f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
2072f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LReturn(UseFixed(instr->value(), x0), context,
2073f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                             parameter_count);
2074f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2075f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2076f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2077f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
2078381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
2079381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
2080f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
2081f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LSeqStringGetChar* result =
2082f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LSeqStringGetChar(string, index, temp);
2083f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(result);
2084f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2085f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2086f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2087f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
2088f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* string = UseRegister(instr->string());
2089f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* index = FLAG_debug_code
2090f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ? UseRegister(instr->index())
2091f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      : UseRegisterOrConstant(instr->index());
2092f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegister(instr->value());
2093f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL;
2094f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
2095f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LSeqStringSetChar* result =
2096f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LSeqStringSetChar(context, string, index, value, temp);
2097f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(result);
2098f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2099f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
21015924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgHBitwiseBinaryOperation* LChunkBuilder::CanTransformToShiftedOp(HValue* val,
21025924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org                                                                HValue** left) {
21035924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (!val->representation().IsInteger32()) return NULL;
21045924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (!(val->IsBitwise() || val->IsAdd() || val->IsSub())) return NULL;
21055924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21065924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  HBinaryOperation* hinstr = HBinaryOperation::cast(val);
21075924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  HValue* hleft = hinstr->left();
21085924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  HValue* hright = hinstr->right();
2109e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(hleft->representation().Equals(hinstr->representation()));
2110e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(hright->representation().Equals(hinstr->representation()));
21115924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21125924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if ((hright->IsConstant() &&
21135924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org       LikelyFitsImmField(hinstr, HConstant::cast(hright)->Integer32Value())) ||
21145924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      (hinstr->IsCommutative() && hleft->IsConstant() &&
21155924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org       LikelyFitsImmField(hinstr, HConstant::cast(hleft)->Integer32Value()))) {
21165924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    // The constant operand will likely fit in the immediate field. We are
21175924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    // better off with
21185924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    //     lsl x8, x9, #imm
21195924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    //     add x0, x8, #imm2
21205924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    // than with
21215924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    //     mov x16, #imm2
21225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    //     add x0, x16, x9 LSL #imm
21235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    return NULL;
21245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21255924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21265924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  HBitwiseBinaryOperation* shift = NULL;
21275924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  // TODO(aleram): We will miss situations where a shift operation is used by
21285924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  // different instructions both as a left and right operands.
21295924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (hright->IsBitwiseBinaryShift() &&
21305924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      HBitwiseBinaryOperation::cast(hright)->right()->IsConstant()) {
21315924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    shift = HBitwiseBinaryOperation::cast(hright);
21325924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    if (left != NULL) {
21335924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      *left = hleft;
21345924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    }
21355924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  } else if (hinstr->IsCommutative() &&
21365924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org             hleft->IsBitwiseBinaryShift() &&
21375924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org             HBitwiseBinaryOperation::cast(hleft)->right()->IsConstant()) {
21385924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    shift = HBitwiseBinaryOperation::cast(hleft);
21395924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    if (left != NULL) {
21405924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      *left = hright;
21415924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    }
21425924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  } else {
21435924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    return NULL;
21445924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21455924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21465924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if ((JSShiftAmountFromHConstant(shift->right()) == 0) && shift->IsShr()) {
21475924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    // Shifts right by zero can deoptimize.
21485924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    return NULL;
21495924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21505924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21515924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  return shift;
21525924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org}
21535924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21545924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21555924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgbool LChunkBuilder::ShiftCanBeOptimizedAway(HBitwiseBinaryOperation* shift) {
21565924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (!shift->representation().IsInteger32()) {
21575924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    return false;
21585924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21595924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  for (HUseIterator it(shift->uses()); !it.Done(); it.Advance()) {
21605924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    if (shift != CanTransformToShiftedOp(it.value())) {
21615924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      return false;
21625924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    }
21635924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21645924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  return true;
21655924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org}
21665924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21675924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21685924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgLInstruction* LChunkBuilder::TryDoOpWithShiftedRightOperand(
21695924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    HBinaryOperation* instr) {
21705924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  HValue* left;
21715924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  HBitwiseBinaryOperation* shift = CanTransformToShiftedOp(instr, &left);
21725924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21735924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if ((shift != NULL) && ShiftCanBeOptimizedAway(shift)) {
21745924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    return DoShiftedBinaryOp(instr, left, shift);
21755924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21765924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  return NULL;
21775924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org}
21785924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21795924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21805924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoShiftedBinaryOp(
21815924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    HBinaryOperation* hinstr, HValue* hleft, HBitwiseBinaryOperation* hshift) {
2182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(hshift->IsBitwiseBinaryShift());
2183e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!hshift->IsShr() || (JSShiftAmountFromHConstant(hshift->right()) > 0));
21845924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21855924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LTemplateResultInstruction<1>* res;
21865924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LOperand* left = UseRegisterAtStart(hleft);
21875924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LOperand* right = UseRegisterAtStart(hshift->left());
21885924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LOperand* shift_amount = UseConstant(hshift->right());
21895924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  Shift shift_op;
21905924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  switch (hshift->opcode()) {
21915924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    case HValue::kShl: shift_op = LSL; break;
21925924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    case HValue::kShr: shift_op = LSR; break;
21935924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    case HValue::kSar: shift_op = ASR; break;
21945924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    default: UNREACHABLE(); shift_op = NO_SHIFT;
21955924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
21965924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
21975924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (hinstr->IsBitwise()) {
21985924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    res = new(zone()) LBitI(left, right, shift_op, shift_amount);
21995924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  } else if (hinstr->IsAdd()) {
22005924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    res = new(zone()) LAddI(left, right, shift_op, shift_amount);
22015924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  } else {
2202e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(hinstr->IsSub());
22035924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    res = new(zone()) LSubI(left, right, shift_op, shift_amount);
22045924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
22055924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (hinstr->CheckFlag(HValue::kCanOverflow)) {
22065924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    AssignEnvironment(res);
22075924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
22085924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  return DefineAsRegister(res);
22095924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org}
22105924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
22115924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
2212f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op,
2213f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                     HBitwiseBinaryOperation* instr) {
2214f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsTagged()) {
2215f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticT(op, instr);
2216f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2217f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2218a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
2219e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
2220e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
2221f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
22225924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (ShiftCanBeOptimizedAway(instr)) {
22235924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    return NULL;
22245924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  }
22255924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
2226f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = instr->representation().IsSmi()
2227f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      ? UseRegister(instr->left())
2228f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      : UseRegisterAtStart(instr->left());
2229a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  LOperand* right = UseRegisterOrConstantAtStart(instr->right());
2230a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
2231a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  // The only shift that can deoptimize is `left >>> 0`, where left is negative.
2232a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  // In these cases, the result is a uint32 that is too large for an int32.
2233a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  bool right_can_be_zero = !instr->right()->IsConstant() ||
2234a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                           (JSShiftAmountFromHConstant(instr->right()) == 0);
2235a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  bool can_deopt = false;
2236a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  if ((op == Token::SHR) && right_can_be_zero) {
2237f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (FLAG_opt_safe_uint32_operations) {
2238a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      can_deopt = !instr->CheckFlag(HInstruction::kUint32);
2239f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
2240a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      can_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32);
2241f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2242f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2243f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2244f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result;
2245f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsInteger32()) {
2246a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    result = DefineAsRegister(new (zone()) LShiftI(op, left, right, can_deopt));
2247f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2248e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->representation().IsSmi());
2249a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    result = DefineAsRegister(new (zone()) LShiftS(op, left, right, can_deopt));
2250f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2251f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2252a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  return can_deopt ? AssignEnvironment(result) : result;
2253f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2254f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2255f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2256f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) {
2257f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DoShift(Token::ROR, instr);
2258f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2259f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2260f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2261f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) {
2262f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DoShift(Token::SAR, instr);
2263f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2264f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2265f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2266f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) {
2267f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DoShift(Token::SHL, instr);
2268f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2269f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2270f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2271f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) {
2272f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DoShift(Token::SHR, instr);
2273f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2274f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2275f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2276f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2277f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
2278f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
2279f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2280f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2281f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2282f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2283f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->is_function_entry()) {
2284f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
2285f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return MarkAsCall(new(zone()) LStackCheck(context), instr);
2286f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2287e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->is_backwards_branch());
2288f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* context = UseAny(instr->context());
2289f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return AssignEnvironment(
2290f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        AssignPointerMap(new(zone()) LStackCheck(context)));
2291f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2292f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2293f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2294f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2295f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry(HStoreCodeEntry* instr) {
2296f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseRegister(instr->function());
2297f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* code_object = UseRegisterAtStart(instr->code_object());
2298f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
2299f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LStoreCodeEntry(function, code_object, temp);
2300f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2301f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2302f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2303f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
2304f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
2305f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context;
2306f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value;
2307f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->NeedsWriteBarrier()) {
2308f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // TODO(all): Replace these constraints when RecordWriteStub has been
2309f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // rewritten.
2310f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    context = UseRegisterAndClobber(instr->context());
2311f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    value = UseRegisterAndClobber(instr->value());
2312f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2313f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    context = UseRegister(instr->context());
2314f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    value = UseRegister(instr->value());
2315f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2316f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp);
2317ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2318ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
2319ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
2320ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
2321f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2322f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2323f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2324f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
2325f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegister(instr->value());
2326f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->RequiresHoleCheck()) {
2327f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return AssignEnvironment(new(zone()) LStoreGlobalCell(value,
2328f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                          TempRegister(),
2329f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                                          TempRegister()));
2330f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2331f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LStoreGlobalCell(value, TempRegister(), NULL);
2332f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2333f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2334f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2335f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2336f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
23375924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  LOperand* key = UseRegisterOrConstant(instr->key());
2338f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = NULL;
2339f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* elements = NULL;
2340f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* val = NULL;
2341f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2342f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!instr->is_typed_elements() &&
2343f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      instr->value()->representation().IsTagged() &&
2344f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      instr->NeedsWriteBarrier()) {
2345f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    // RecordWrite() will clobber all registers.
2346f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    elements = UseRegisterAndClobber(instr->elements());
2347f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    val = UseRegisterAndClobber(instr->value());
2348ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    temp = TempRegister();
2349f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2350f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    elements = UseRegister(instr->elements());
2351f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    val = UseRegister(instr->value());
2352ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    temp = instr->key()->IsConstant() ? NULL : TempRegister();
2353f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2354f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2355f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->is_typed_elements()) {
2356e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK((instr->value()->representation().IsInteger32() &&
2357f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org            !IsDoubleOrFloatElementsKind(instr->elements_kind())) ||
2358f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org           (instr->value()->representation().IsDouble() &&
2359f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org            IsDoubleOrFloatElementsKind(instr->elements_kind())));
2360e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK((instr->is_fixed_typed_array() &&
2361f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org            instr->elements()->representation().IsTagged()) ||
2362f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org           (instr->is_external() &&
2363f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org            instr->elements()->representation().IsExternal()));
2364f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LStoreKeyedExternal(elements, key, val, temp);
2365f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2366f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (instr->value()->representation().IsDouble()) {
2367e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->elements()->representation().IsTagged());
2368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LStoreKeyedFixedDouble(elements, key, val, temp);
2369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2371e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->elements()->representation().IsTagged());
2372e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->value()->representation().IsSmiOrTagged() ||
2373f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org           instr->value()->representation().IsInteger32());
2374f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return new(zone()) LStoreKeyedFixed(elements, key, val, temp);
2375f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2376f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2377f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2378f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2379f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2380f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2381fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
23829aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
23839aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister());
23849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2385f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2386e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->object()->representation().IsTagged());
2387e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsTagged());
2388e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
2389f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2390f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(
2391f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LStoreKeyedGeneric(context, object, key, value), instr);
2392f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2393f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2394f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2395f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
2396f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // TODO(jbramley): It might be beneficial to allow value to be a constant in
2397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // some cases. x64 makes use of this with FLAG_track_fields, for example.
2398f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2399f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseRegister(instr->object());
2400486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LOperand* value;
2401486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LOperand* temp0 = NULL;
2402486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LOperand* temp1 = NULL;
2403486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
2404486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->access().IsExternalMemory() ||
2405486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->field_representation().IsDouble()) {
2406486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    value = UseRegister(instr->value());
2407486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  } else if (instr->NeedsWriteBarrier()) {
2408486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    value = UseRegisterAndClobber(instr->value());
2409486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    temp0 = TempRegister();
2410486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    temp1 = TempRegister();
2411486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  } else if (instr->NeedsWriteBarrierForMap()) {
2412486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    value = UseRegister(instr->value());
2413486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    temp0 = TempRegister();
2414486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    temp1 = TempRegister();
2415486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  } else {
2416486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    value = UseRegister(instr->value());
2417486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    temp0 = TempRegister();
2418486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
2419f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2420d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return new(zone()) LStoreNamedField(object, value, temp0, temp1);
2421f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2422f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2423f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2424f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2425f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2426fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
24279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
24289aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
242970d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org
2430f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* result = new(zone()) LStoreNamedGeneric(context, object, value);
2431f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(result, instr);
2432f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2433f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2434f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2435f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2436f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = UseFixed(instr->left(), x1);
2438f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* right = UseFixed(instr->right(), x0);
2439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2440f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LStringAdd* result = new(zone()) LStringAdd(context, left, right);
2441f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
2442f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2443f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2444f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2445f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
2446f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* string = UseRegisterAndClobber(instr->string());
2447f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* index = UseRegisterAndClobber(instr->index());
2448f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseAny(instr->context());
2449f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LStringCharCodeAt* result =
2450f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LStringCharCodeAt(context, string, index);
2451ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
2452f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2453f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2454f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2455f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
2456f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* char_code = UseRegister(instr->value());
2457f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseAny(instr->context());
2458f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LStringCharFromCode* result =
2459f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LStringCharFromCode(context, char_code);
2460f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignPointerMap(DefineAsRegister(result));
2461f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2463f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2464f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoStringCompareAndBranch(
2465f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HStringCompareAndBranch* instr) {
2466e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
2467e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
2468f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2469f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* left = UseFixed(instr->left(), x1);
2470f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* right = UseFixed(instr->right(), x0);
2471f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LStringCompareAndBranch* result =
2472f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LStringCompareAndBranch(context, left, right);
2473f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(result, instr);
2474f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2475f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2476f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2477f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) {
2478f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
2479e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
2480e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
24815924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
24825924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    LInstruction* shifted_operation = TryDoOpWithShiftedRightOperand(instr);
24835924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    if (shifted_operation != NULL) {
24845924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      return shifted_operation;
24855924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org    }
24865924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org
2487f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand *left;
2488f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (instr->left()->IsConstant() &&
24899801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org        (HConstant::cast(instr->left())->Integer32Value() == 0)) {
2490f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      left = UseConstant(instr->left());
2491f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    } else {
2492f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      left = UseRegisterAtStart(instr->left());
2493f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2494f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
2495f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LInstruction* result = instr->representation().IsSmi() ?
2496f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LSubS(left, right)) :
2497f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        DefineAsRegister(new(zone()) LSubI(left, right));
2498f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
2499f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      result = AssignEnvironment(result);
2500f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2501f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return result;
2502f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else if (instr->representation().IsDouble()) {
2503f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticD(Token::SUB, instr);
2504f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2505f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DoArithmeticT(Token::SUB, instr);
2506f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2507f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2508f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2509f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2510f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
2511f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->HasNoUses()) {
2512f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return NULL;
2513f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2514f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return DefineAsRegister(new(zone()) LThisFunction);
2515f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2516f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2518f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2519f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2520f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseFixed(instr->value(), x0);
2521f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LToFastProperties* result = new(zone()) LToFastProperties(object);
2522f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
2523f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2524f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2525f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTransitionElementsKind(
2527f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HTransitionElementsKind* instr) {
2528f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
25292f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseRegister(instr->object());
2530f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTransitionElementsKind* result =
2531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        new(zone()) LTransitionElementsKind(object, NULL,
2532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                            TempRegister(), TempRegister());
2533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return result;
2534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
25352f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseFixed(instr->object(), x0);
2536f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
2537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    LTransitionElementsKind* result =
25382f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org        new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
25392f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    return MarkAsCall(result, instr);
2540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento(
2545f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    HTrapAllocationMemento* instr) {
2546f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseRegister(instr->object());
2547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp1 = TempRegister();
2548f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp2 = TempRegister();
2549f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LTrapAllocationMemento* result =
2550f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LTrapAllocationMemento(object, temp1, temp2);
2551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(result);
2552f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2553f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2554f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2555f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // TODO(jbramley): In ARM, this uses UseFixed to force the input to x0.
2558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // However, LCodeGen::DoTypeof just pushes it to the stack (for CallRuntime)
2559f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // anyway, so the input doesn't have to be in x0. We might be able to improve
2560f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // the ARM back-end a little by relaxing this restriction.
2561f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LTypeof* result =
2562f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      new(zone()) LTypeof(context, UseRegisterAtStart(instr->value()));
2563f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr);
2564f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2565f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2566f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2567f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // We only need temp registers in some cases, but we can't dereference the
2569f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // instr->type_literal() handle to test that here.
2570f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp1 = TempRegister();
2571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp2 = TempRegister();
2572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return new(zone()) LTypeofIsAndBranch(
2574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UseRegister(instr->value()), temp1, temp2);
2575f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2576f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2577f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2578f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
2579f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  switch (instr->op()) {
2580f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathAbs: {
2581f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      Representation r = instr->representation();
2582f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (r.IsTagged()) {
2583f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        // The tagged case might need to allocate a HeapNumber for the result,
2584f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        // so it is handled by a separate LInstruction.
2585f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* context = UseFixed(instr->context(), cp);
2586f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* input = UseRegister(instr->value());
2587f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* temp1 = TempRegister();
2588f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* temp2 = TempRegister();
2589f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* temp3 = TempRegister();
2590ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LInstruction* result = DefineAsRegister(
2591ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            new(zone()) LMathAbsTagged(context, input, temp1, temp2, temp3));
2592ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return AssignEnvironment(AssignPointerMap(result));
2593f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
2594f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        LOperand* input = UseRegisterAtStart(instr->value());
2595ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LInstruction* result = DefineAsRegister(new(zone()) LMathAbs(input));
2596ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        if (!r.IsDouble()) result = AssignEnvironment(result);
2597ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return result;
2598f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
2599f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2600f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathExp: {
2601e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsDouble());
2602e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2603f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseRegister(instr->value());
26045924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org      LOperand* double_temp1 = TempDoubleRegister();
2605f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp1 = TempRegister();
2606f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp2 = TempRegister();
2607f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* temp3 = TempRegister();
2608f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LMathExp* result = new(zone()) LMathExp(input, double_temp1,
2609f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                              temp1, temp2, temp3);
2610f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return DefineAsRegister(result);
2611f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2612f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathFloor: {
2613e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2614f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseRegisterAtStart(instr->value());
2615a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      if (instr->representation().IsInteger32()) {
2616a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        LMathFloorI* result = new(zone()) LMathFloorI(input);
2617a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
2618a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      } else {
2619e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org        DCHECK(instr->representation().IsDouble());
2620a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        LMathFloorD* result = new(zone()) LMathFloorD(input);
2621a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        return DefineAsRegister(result);
2622a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      }
2623f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2624f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathLog: {
2625e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsDouble());
2626e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2627f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseFixedDouble(instr->value(), d0);
2628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LMathLog* result = new(zone()) LMathLog(input);
2629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return MarkAsCall(DefineFixedDouble(result, d0), instr);
2630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathPowHalf: {
2632e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsDouble());
2633e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2634f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseRegister(instr->value());
2635f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return DefineAsRegister(new(zone()) LMathPowHalf(input));
2636f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2637f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathRound: {
2638e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2639f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseRegister(instr->value());
2640a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      if (instr->representation().IsInteger32()) {
26415924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org        LOperand* temp = TempDoubleRegister();
26425924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org        LMathRoundI* result = new(zone()) LMathRoundI(input, temp);
2643a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        return AssignEnvironment(DefineAsRegister(result));
2644a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      } else {
2645e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org        DCHECK(instr->representation().IsDouble());
2646a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        LMathRoundD* result = new(zone()) LMathRoundD(input);
2647a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        return DefineAsRegister(result);
2648a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      }
2649f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2650dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFround: {
2651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2652dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      LOperand* input = UseRegister(instr->value());
2653dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      LMathFround* result = new (zone()) LMathFround(input);
2654dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DefineAsRegister(result);
2655dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    }
2656f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathSqrt: {
2657e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsDouble());
2658e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsDouble());
2659f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseRegisterAtStart(instr->value());
2660f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return DefineAsRegister(new(zone()) LMathSqrt(input));
2661f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2662f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathClz32: {
2663e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsInteger32());
2664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsInteger32());
2665f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      LOperand* input = UseRegisterAtStart(instr->value());
2666f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return DefineAsRegister(new(zone()) LMathClz32(input));
2667f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2668f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    default:
2669f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      UNREACHABLE();
2670f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      return NULL;
2671f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2672f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2673f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2674f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2676f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Use an index that corresponds to the location in the unoptimized frame,
2677f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // which the optimized frame will subsume.
2678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int env_index = instr->index();
2679f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int spill_index = 0;
2680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (instr->environment()->is_parameter_index(env_index)) {
2681f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    spill_index = chunk_->GetParameterStackSlot(env_index);
2682f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
2683f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    spill_index = env_index - instr->environment()->first_local_index();
2684f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2685b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      Retry(kTooManySpillSlotsNeededForOSR);
2686f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      spill_index = 0;
2687f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
2688f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
2689f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2690f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2691f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
2694f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return NULL;
2695f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2696f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Assign object to a fixed register different from those already used in
2701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // LForInPrepareMap.
2702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseFixed(instr->enumerable(), x0);
2703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
2704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return MarkAsCall(DefineFixed(result, x0), instr, CAN_DEOPTIMIZE_EAGERLY);
2705f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2708f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
2709f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* map = UseRegister(instr->map());
2710f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map)));
2711f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2712f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2713f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2714f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
2715f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2716f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* map = UseRegister(instr->map());
2717f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* temp = TempRegister();
2718f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(new(zone()) LCheckMapValue(value, map, temp));
2719f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2720f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2721f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2722f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2723f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* object = UseRegisterAtStart(instr->object());
2724a7cc028b1ce5d5b762b630529fa1956d89f76541machenbach@chromium.org  LOperand* index = UseRegisterAndClobber(instr->index());
272563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
272663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  LInstruction* result = DefineSameAsFirst(load);
272763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  return AssignPointerMap(result);
2728f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2729f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2730f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2731f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
2732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* receiver = UseRegister(instr->receiver());
2733f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* function = UseRegister(instr->function());
2734f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
2735f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return AssignEnvironment(DefineAsRegister(result));
2736f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
2737f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
2738f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
27391e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
27401e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseRegisterAtStart(instr->context());
27411e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return new(zone()) LStoreFrameContext(context);
27421e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
27431e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27441e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27451e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext(
27461e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    HAllocateBlockContext* instr) {
27471e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
27481e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
27491e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LAllocateBlockContext* result =
27501e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      new(zone()) LAllocateBlockContext(context, function);
27511e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, cp), instr);
27521e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
27531e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27541e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
2755f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} }  // namespace v8::internal
2756