1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_IA32
8c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium-allocator-inl.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ia32/lithium-ia32.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ia32/lithium-codegen-ia32.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-osr.h"
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DEFINE_COMPILE(type)                            \
18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void L##type::CompileToNative(LCodeGen* generator) {  \
19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    generator->Do##type(this);                          \
20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DEFINE_COMPILE
23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG
2683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LInstruction::VerifyCall() {
27160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // Call instructions can use only fixed registers as temporaries and
28160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // outputs because all registers are blocked by the calling convention.
29160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // Inputs operands must use a fixed register or use-at-start policy or
30160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  // a non-register policy.
3183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  ASSERT(Output() == NULL ||
3283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org         LUnallocated::cast(Output())->HasFixedPolicy() ||
3383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org         !LUnallocated::cast(Output())->HasRegisterPolicy());
34e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  for (UseIterator it(this); !it.Done(); it.Advance()) {
35e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
36160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    ASSERT(operand->HasFixedPolicy() ||
37160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org           operand->IsUsedAtStart());
3883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
39e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  for (TempIterator it(this); !it.Done(); it.Advance()) {
40e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
41160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org    ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
4383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
4483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif
4583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
4683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
47e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool LInstruction::HasDoubleRegisterResult() {
48e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return HasResult() && result()->IsDoubleRegister();
49e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
50e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
51e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
52e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool LInstruction::HasDoubleRegisterInput() {
53e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  for (int i = 0; i < InputCount(); i++) {
54e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    LOperand* op = InputAt(i);
55ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    if (op != NULL && op->IsDoubleRegister()) {
56e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return true;
57e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    }
58e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return false;
60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
63c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) {
64a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("%s ", this->Mnemonic());
6583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
6683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  PrintOutputOperandTo(stream);
67c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  PrintDataTo(stream);
69a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (HasEnvironment()) {
71a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(" ");
72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    environment()->PrintTo(stream);
73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
74a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
75a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (HasPointerMap()) {
76a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(" ");
77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    pointer_map()->PrintTo(stream);
78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
79a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
82c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) {
830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  stream->Add("= ");
84c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  for (int i = 0; i < InputCount(); i++) {
856d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org    if (i > 0) stream->Add(" ");
864cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    if (InputAt(i) == NULL) {
874cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      stream->Add("NULL");
884cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    } else {
894cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org      InputAt(i)->PrintTo(stream);
904cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    }
916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  }
92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
95c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
96c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (HasResult()) result()->PrintTo(stream);
97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
98a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
99a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) {
101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LGap::PrintDataTo(stream);
102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LLabel* rep = replacement();
103c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  if (rep != NULL) {
104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    stream->Add(" Dead block replaced with B%d", rep->block_id());
105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool LGap::IsRedundant() const {
110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < 4; i++) {
111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return false;
113a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return true;
117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
120c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) {
121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < 4; i++) {
122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add("(");
123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (parallel_moves_[i] != NULL) {
124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      parallel_moves_[i]->PrintDataTo(stream);
125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    stream->Add(") ");
127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
128a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
129a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
130a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticD::Mnemonic() const {
132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  switch (op()) {
133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::ADD: return "add-d";
134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::SUB: return "sub-d";
135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MUL: return "mul-d";
136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::DIV: return "div-d";
137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MOD: return "mod-d";
138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    default:
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      UNREACHABLE();
140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return NULL;
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* LArithmeticT::Mnemonic() const {
146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  switch (op()) {
147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::ADD: return "add-t";
148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::SUB: return "sub-t";
149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MUL: return "mul-t";
150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::MOD: return "mod-t";
151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case Token::DIV: return "div-t";
1520a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    case Token::BIT_AND: return "bit-and-t";
1530a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    case Token::BIT_OR: return "bit-or-t";
1540a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    case Token::BIT_XOR: return "bit-xor-t";
155e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    case Token::ROR: return "ror-t";
1560a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    case Token::SHL: return "sal-t";
1570a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    case Token::SAR: return "sar-t";
1580a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    case Token::SHR: return "shr-t";
159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    default:
160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      UNREACHABLE();
161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return NULL;
162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
16632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const {
16732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  return !gen->IsNextEmittedBlock(block_id());
16832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
16932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
17032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
171c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) {
172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("B%d", block_id());
173a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
175a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
176c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) {
177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
17856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
182e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if ");
18456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  left()->PrintTo(stream);
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" %s ", Token::String(op()));
18656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  right()->PrintTo(stream);
187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
191c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
1925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  stream->Add("if is_object(");
19356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
1945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
1965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
1975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
1980ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
1990ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add("if is_string(");
20056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
2010ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2020ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
2030ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
2040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
205c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if is_smi(");
20756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
209a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
2137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  stream->Add("if is_undetectable(");
21456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
2157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
2177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
2187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
2190ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2200ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add("if string_compare(");
22156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  left()->PrintTo(stream);
22256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  right()->PrintTo(stream);
2230ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2240ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
2250ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
2260ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
227c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if has_instance_type(");
22956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
231a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
233a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
234c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
235a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if has_cached_array_index(");
23656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
238a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
239a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
240a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
241c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if class_of_test(");
24356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
244a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(", \"%o\") then B%d else B%d",
245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              *hydrogen()->class_name(),
246a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              true_block_id(),
247a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              false_block_id());
248a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
251c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("if typeof ");
25356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
254a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" == \"%s\" then B%d else B%d",
255afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org              hydrogen()->type_literal()->ToCString().get(),
256a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org              true_block_id(), false_block_id());
257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
259a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
260662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
261662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  stream->Add(" = ");
262662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  function()->PrintTo(stream);
263662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  stream->Add(".code_entry = ");
264662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  code_object()->PrintTo(stream);
265662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
266662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
267662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
2682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
2692bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  stream->Add(" = ");
2702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  base_object()->PrintTo(stream);
271ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  stream->Add(" + ");
272ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  offset()->PrintTo(stream);
2732bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org}
2742bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
2752bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
27626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) {
27726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  stream->Add("= ");
27826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  function()->PrintTo(stream);
27926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  stream->Add("#%d / ", arity());
28026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
28126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
28226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
28326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
28426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 0; i < InputCount(); i++) {
28526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    InputAt(i)->PrintTo(stream);
28626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    stream->Add(" ");
28726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
288a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("#%d / ", arity());
289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
290a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
292c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
29356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  context()->PrintTo(stream);
29483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  stream->Add("[%d]", slot_index());
29583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
29683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
29783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
29883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
29956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  context()->PrintTo(stream);
30083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  stream->Add("[%d] <- ", slot_index());
30156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  value()->PrintTo(stream);
302c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
303c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
304c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
305160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
306160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  stream->Add("= ");
30756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  context()->PrintTo(stream);
308160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  stream->Add(" ");
30956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  function()->PrintTo(stream);
310160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  stream->Add(" #%d / ", arity());
311160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}
312160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
313160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
314c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) {
315c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  stream->Add("= ");
31656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  context()->PrintTo(stream);
31756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  stream->Add(" ");
31856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  constructor()->PrintTo(stream);
319a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" #%d / ", arity());
320a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
321a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
322a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3234a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) {
3244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add("= ");
3254a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  context()->PrintTo(stream);
3264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add(" ");
3274a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  constructor()->PrintTo(stream);
3284a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add(" #%d / ", arity());
3291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ElementsKind kind = hydrogen()->elements_kind();
3304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  stream->Add(" (%s) ", ElementsKindToString(kind));
3314a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
3324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
3334a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
334c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
335a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  arguments()->PrintTo(stream);
336a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
337a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" length ");
338a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  length()->PrintTo(stream);
339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
340a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" index ");
341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  index()->PrintTo(stream);
342a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
343a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
345c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
346a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Skip a slot if for a double-width slot.
347c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (kind == DOUBLE_REGISTERS) {
3487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    spill_slot_count_++;
3497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    spill_slot_count_ |= 1;
3507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    num_double_slots_++;
3517028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return spill_slot_count_++;
353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
356c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) {
357c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  int index = GetNextSpillIndex(kind);
358c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  if (kind == DOUBLE_REGISTERS) {
3597028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    return LDoubleStackSlot::Create(index, zone());
360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
361c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    ASSERT(kind == GENERAL_REGISTERS);
3627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    return LStackSlot::Create(index, zone());
363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
364a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
366a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3673a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  object()->PrintTo(stream);
369a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  hydrogen()->access().PrintTo(stream);
370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add(" <- ");
371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  value()->PrintTo(stream);
372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
3763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  object()->PrintTo(stream);
3773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  stream->Add(".");
378afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  stream->Add(String::cast(*name())->ToCString().get());
3793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  stream->Add(" <- ");
3803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  value()->PrintTo(stream);
3813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
3823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
3833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
3848e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
3858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  elements()->PrintTo(stream);
3868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  stream->Add("[");
3878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  key()->PrintTo(stream);
3888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (hydrogen()->IsDehoisted()) {
389fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    stream->Add(" + %d]", base_offset());
3908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  } else {
3918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    stream->Add("]");
3928e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
3938e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
3948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
3958e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
396e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
397717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  elements()->PrintTo(stream);
398717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  stream->Add("[");
399717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  key()->PrintTo(stream);
4008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (hydrogen()->IsDehoisted()) {
401fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org    stream->Add(" + %d] <-", base_offset());
4028e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  } else {
4038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    stream->Add("] <- ");
4048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
405d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
406d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  if (value() == NULL) {
407d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    ASSERT(hydrogen()->IsConstantHoleStore() &&
408d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org           hydrogen()->value()->representation().IsDouble());
409d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    stream->Add("<the hole(nan)>");
410d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  } else {
411d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    value()->PrintTo(stream);
412d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  }
413717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org}
414717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
415717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
4163a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  object()->PrintTo(stream);
418a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("[");
419a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  key()->PrintTo(stream);
420a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  stream->Add("] <- ");
421a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  value()->PrintTo(stream);
422a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
424a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
425394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
426394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  object()->PrintTo(stream);
427394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
428394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
429394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
430394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
43128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgLPlatformChunk* LChunkBuilder::Build() {
432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(is_unused());
43328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  chunk_ = new(zone()) LPlatformChunk(info(), graph());
4341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LPhase phase("L_Building chunk", chunk_);
435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  status_ = BUILDING;
4367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
4377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // Reserve the first spill slot for the state of dynamic alignment.
438a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (info()->IsOptimizing()) {
439c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org    int alignment_state_index = chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
440a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    ASSERT_EQ(alignment_state_index, 0);
441a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    USE(alignment_state_index);
442a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
4437028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
444c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // If compiling for OSR, reserve space for the unoptimized frame,
445c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // which will be subsumed into this frame.
446c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (graph()->has_osr()) {
447c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
448c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
449c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
450c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  }
451c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < blocks->length(); i++) {
454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* next = NULL;
455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (i < blocks->length() - 1) next = blocks->at(i + 1);
456a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    DoBasicBlock(blocks->at(i), next);
457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (is_aborted()) return NULL;
458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  status_ = DONE;
460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return chunk_;
461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
464594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid LChunkBuilder::Abort(BailoutReason reason) {
46546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  info()->set_bailout_reason(reason);
466a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  status_ = ABORTED;
467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
471c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                  Register::ToAllocationIndex(reg));
473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) {
477c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
478c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                  XMMRegister::ToAllocationIndex(reg));
479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Use(value, ToUnallocated(fixed_register));
484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) {
488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Use(value, ToUnallocated(reg));
489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) {
493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Use(value,
499c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
500c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                      LUnallocated::USED_AT_START));
501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) {
510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
511a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
512a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
513a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
514a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) {
515c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
516c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                             LUnallocated::USED_AT_START));
517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
519a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
520c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.orgstatic inline bool CanBeImmediateConstant(HValue* value) {
521c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  return value->IsConstant() && HConstant::cast(value)->NotInNewSpace();
522c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org}
523c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
524c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org
525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
526c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  return CanBeImmediateConstant(value)
527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : Use(value);
529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
532a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
533c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  return CanBeImmediateConstant(value)
534a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
535a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : UseAtStart(value);
536a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
537a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
539e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLOperand* LChunkBuilder::UseFixedOrConstant(HValue* value,
540e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                                            Register fixed_register) {
541e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return CanBeImmediateConstant(value)
542e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
543e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      : UseFixed(value, fixed_register);
544e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
545e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
546e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
548c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  return CanBeImmediateConstant(value)
549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : UseRegister(value);
551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
555c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org  return CanBeImmediateConstant(value)
556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : UseRegisterAtStart(value);
558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
561f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) {
562f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return chunk_->DefineConstantOperand(HConstant::cast(value));
563f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
564f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
565f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
5660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comLOperand* LChunkBuilder::UseAny(HValue* value) {
5670511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  return value->IsConstant()
5680511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com      ? chunk_->DefineConstantOperand(HConstant::cast(value))
569c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
5700511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
5710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
5720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (value->EmitAtUses()) {
575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HInstruction* instr = HInstruction::cast(value);
576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    VisitInstruction(instr);
577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
578994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  operand->set_virtual_register(value->id());
579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
58326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
584c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                                    LUnallocated* result) {
585994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  result->set_virtual_register(current_instruction_->id());
586c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  instr->set_result(result);
587c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return instr;
588c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
589c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
590c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
591c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister(
59226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Define(instr,
594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
598c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled(
59926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr,
600c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    int index) {
601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Define(instr,
602c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
606c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst(
60726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return Define(instr,
609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
61326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr,
614c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                                         Register reg) {
615a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Define(instr, ToUnallocated(reg));
616a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
617a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
618a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
619c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble(
62026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LTemplateResultInstruction<1>* instr,
621c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    XMMRegister reg) {
622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return Define(instr, ToUnallocated(reg));
623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
626a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
627a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HEnvironment* hydrogen_env = current_block_->last_environment();
628c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int argument_index_accumulator = 0;
629594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  ZoneList<HValue*> objects_to_materialize(0, zone());
630c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  instr->set_environment(CreateEnvironment(hydrogen_env,
631594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                           &argument_index_accumulator,
632594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                           &objects_to_materialize));
633a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return instr;
634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
636a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
637a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
638a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                        HInstruction* hinstr,
639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                        CanDeoptimize can_deoptimize) {
640a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  info()->MarkAsNonDeferredCalling();
641a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
64283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG
64383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  instr->VerifyCall();
64483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif
64583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  instr->MarkAsCall();
646a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  instr = AssignPointerMap(instr);
647a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // If instruction does not have side-effects lazy deoptimization
649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // after the call will try to deoptimize to the point before the call.
650a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Thus we still need to attach environment to this call even if
651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // call sequence can not deoptimize eagerly.
652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool needs_environment =
653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
654c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      !hinstr->HasObservableSideEffects();
655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (needs_environment && !instr->HasEnvironment()) {
656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    instr = AssignEnvironment(instr);
6574edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    // We can't really figure out if the environment is needed or not.
6584edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    instr->environment()->set_has_been_used();
659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
660a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
661a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return instr;
662a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
663a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
664a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
665a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
666a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(!instr->HasPointerMap());
66771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return instr;
669a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
671a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLUnallocated* LChunkBuilder::TempRegister() {
673c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LUnallocated* operand =
674c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
6752bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  int vreg = allocator_->GetVirtualRegister();
676994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  if (!allocator_->AllocationOk()) {
677594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
67857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    vreg = 0;
679994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  }
6802bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  operand->set_virtual_register(vreg);
681a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
682a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
683a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
684a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
685a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) {
686a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LUnallocated* operand = ToUnallocated(reg);
687994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  ASSERT(operand->HasFixedPolicy());
688a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
690a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
691a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
692a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) {
693a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LUnallocated* operand = ToUnallocated(reg);
694994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org  ASSERT(operand->HasFixedPolicy());
695a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return operand;
696a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
697a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
699a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
700c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LLabel(instr->block());
701a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
702a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
703a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
70446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
70546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
70646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
70746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
70846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
709d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
710d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  UNREACHABLE();
711d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return NULL;
712d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
713d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
714d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
715a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
716c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return AssignEnvironment(new(zone()) LDeoptimize);
717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
719a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
720a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op,
721a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                     HBitwiseBinaryOperation* instr) {
722528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
723528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    ASSERT(instr->left()->representation().Equals(instr->representation()));
724528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    ASSERT(instr->right()->representation().Equals(instr->representation()));
725528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
726a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
727528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    HValue* right_value = instr->right();
728528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = NULL;
729528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    int constant_value = 0;
730528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    bool does_deopt = false;
731528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (right_value->IsConstant()) {
732528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      HConstant* constant = HConstant::cast(right_value);
733528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right = chunk_->DefineConstantOperand(constant);
734528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      constant_value = constant->Integer32Value() & 0x1f;
735528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      // Left shifts can deoptimize if we shift by > 0 and the result cannot be
736528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      // truncated to smi.
737528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (instr->representation().IsSmi() && constant_value > 0) {
738528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
739528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
740528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    } else {
741528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      right = UseFixed(right_value, ecx);
742a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
7432f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
744528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // Shift operations can only deoptimize if we do a logical shift by 0 and
745528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    // the result cannot be truncated to int32.
746528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    if (op == Token::SHR && constant_value == 0) {
747528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      if (FLAG_opt_safe_uint32_operations) {
748528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckFlag(HInstruction::kUint32);
749528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      } else {
750528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32);
751528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      }
7522f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org    }
7532f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org
754528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LInstruction* result =
755528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt));
756528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return does_deopt ? AssignEnvironment(result) : result;
757528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else {
758528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(op, instr);
759528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
760a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
761a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
763a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
764a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                           HArithmeticBinaryOperation* instr) {
765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->representation().IsDouble());
766a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->left()->representation().IsDouble());
767a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->right()->representation().IsDouble());
768528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (op == Token::MOD) {
769528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
770528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->BetterRightOperand());
771528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
772528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return MarkAsCall(DefineSameAsFirst(result), instr);
773528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else {
774528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
775528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->BetterRightOperand());
776528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
777528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DefineSameAsFirst(result);
778528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
780a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
781a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
782a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
783528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                           HBinaryOperation* instr) {
784a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HValue* left = instr->left();
785a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HValue* right = instr->right();
786fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ASSERT(left->representation().IsTagged());
787fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ASSERT(right->representation().IsTagged());
788ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
789a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* left_operand = UseFixed(left, edx);
790a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* right_operand = UseFixed(right, eax);
791ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LArithmeticT* result =
792c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
793a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
794a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
795a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
796ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org
797a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
798a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(is_building());
799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_ = block;
800a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next_block_ = next_block;
801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (block->IsStartBlock()) {
802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->UpdateEnvironment(graph_->start_environment());
803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    argument_count_ = 0;
804a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (block->predecessors()->length() == 1) {
805a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // We have a single predecessor => copy environment and outgoing
806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // argument count from the predecessor.
807a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ASSERT(block->phis()->length() == 0);
808a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
809a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HEnvironment* last_environment = pred->last_environment();
810a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ASSERT(last_environment != NULL);
811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Only copy the environment, if it is later used again.
812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (pred->end()->SecondSuccessor() == NULL) {
813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ASSERT(pred->end()->FirstSuccessor() == block);
814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
817a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        last_environment = last_environment->Copy();
818a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
819a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
820a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->UpdateEnvironment(last_environment);
821a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ASSERT(pred->argument_count() >= 0);
822a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    argument_count_ = pred->argument_count();
823a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
824a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // We are at a state join => process phis.
825a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // No need to copy the environment, it cannot be used later.
827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HEnvironment* last_environment = pred->last_environment();
828a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int i = 0; i < block->phis()->length(); ++i) {
829a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      HPhi* phi = block->phis()->at(i);
830ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org      if (phi->HasMergedIndex()) {
831b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org        last_environment->SetValueAt(phi->merged_index(), phi);
832b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      }
833a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
834a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
835b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      if (block->deleted_phis()->at(i) < last_environment->length()) {
836b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org        last_environment->SetValueAt(block->deleted_phis()->at(i),
837b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org                                     graph_->GetConstantUndefined());
838b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      }
839a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
840a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->UpdateEnvironment(last_environment);
841a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Pick up the outgoing argument count of one of the predecessors.
842a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    argument_count_ = pred->argument_count();
843a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
844a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction* current = block->first();
845a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int start = chunk_->instructions()->length();
846a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (current != NULL && !is_aborted()) {
847a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    // Code for constants in registers is generated lazily.
848a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (!current->EmitAtUses()) {
849a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      VisitInstruction(current);
850a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
851a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    current = current->next();
852a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
853a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int end = chunk_->instructions()->length() - 1;
854a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (end >= start) {
855a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->set_first_instruction_index(start);
856a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    block->set_last_instruction_index(end);
857a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
858a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  block->set_argument_count(argument_count_);
859a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next_block_ = NULL;
860a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_ = NULL;
861a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
862a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
863a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
864a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
865a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction* old_current = current_instruction_;
866a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_instruction_ = current;
867d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
868d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  LInstruction* instr = NULL;
869d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  if (current->CanReplaceWithDummyUses()) {
870935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    if (current->OperandCount() == 0) {
871935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr = DefineAsRegister(new(zone()) LDummy());
872935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    } else {
87309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      ASSERT(!current->OperandAt(0)->IsControlInstruction());
874935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr = DefineAsRegister(new(zone())
875935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org          LDummyUse(UseAny(current->OperandAt(0))));
876935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    }
877d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    for (int i = 1; i < current->OperandCount(); ++i) {
87809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      if (current->OperandAt(i)->IsControlInstruction()) continue;
879d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      LInstruction* dummy =
880d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
881d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      dummy->set_hydrogen_value(current);
882d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      chunk_->AddInstruction(dummy, current_block_);
883d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    }
884d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  } else {
8858d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    HBasicBlock* successor;
8868d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    if (current->IsControlInstruction() &&
8878d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
8888d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org        successor != NULL) {
8898d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = new(zone()) LGoto(successor);
8908d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    } else {
8918d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      instr = current->CompileToLithium(this);
8928d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    }
893d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  }
894d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
895d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  argument_count_ += current->argument_delta();
896d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  ASSERT(argument_count_ >= 0);
897a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
898a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (instr != NULL) {
899011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(instr, current);
900011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
901011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
902011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  current_instruction_ = old_current;
903011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
904011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
905011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
906011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr,
907011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org                                   HInstruction* hydrogen_val) {
908011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Associate the hydrogen instruction first, since we may need it for
909011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
910011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  instr->set_hydrogen_value(hydrogen_val);
911fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
912f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#if DEBUG
913011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // Make sure that the lithium instruction has either no fixed register
914011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // constraints in temps or the result OR no uses that are only used at
915011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // start. If this invariant doesn't hold, the register allocator can decide
916011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // to insert a split of a range immediately before the instruction due to an
917011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // already allocated register needing to be used for the instruction's fixed
918011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // register constraint. In this case, The register allocator won't see an
919011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // interference between the split child and the use-at-start (it would if
920011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the it was just a plain use), so it is free to move the split child into
921011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // the same register that is used for the use-at-start.
922011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  // See https://code.google.com/p/chromium/issues/detail?id=201590
923011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (!(instr->ClobbersRegisters() &&
924011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org        instr->ClobbersDoubleRegisters(isolate()))) {
925011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int fixed = 0;
926011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    int used_at_start = 0;
927011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (UseIterator it(instr); !it.Done(); it.Advance()) {
928011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
929011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->IsUsedAtStart()) ++used_at_start;
930011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
931011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instr->Output() != NULL) {
932011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
933011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    }
934011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    for (TempIterator it(instr); !it.Done(); it.Advance()) {
935011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
936011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      if (operand->HasFixedPolicy()) ++fixed;
937f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    }
938011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    ASSERT(fixed == 0 || used_at_start == 0);
939011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
940f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org#endif
941f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
942011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
943011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignPointerMap(instr);
944011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
945011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (FLAG_stress_environments && !instr->HasEnvironment()) {
946011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    instr = AssignEnvironment(instr);
947011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
948011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  chunk_->AddInstruction(instr, current_block_);
949011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
950011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  if (instr->IsCall()) {
951011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    HValue* hydrogen_value_for_lazy_bailout = hydrogen_val;
952011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* instruction_needing_environment = NULL;
953011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (hydrogen_val->HasObservableSideEffects()) {
954011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      HSimulate* sim = HSimulate::cast(hydrogen_val->next());
955011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment = instr;
956011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      sim->ReplayEnvironment(current_block_->last_environment());
957011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      hydrogen_value_for_lazy_bailout = sim;
958a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
959011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
960011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
961011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    chunk_->AddInstruction(bailout, current_block_);
962011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    if (instruction_needing_environment != NULL) {
963011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Store the lazy deopt environment with the instruction if needed.
964011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      // Right now it is only used for LInstanceOfKnownGlobal.
965011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      instruction_needing_environment->
966011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org          SetDeferredLazyDeoptimizationEnvironment(bailout->environment());
967486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    }
968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
970a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
971a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
9734a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  return new(zone()) LGoto(instr->FirstSuccessor());
974a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
975a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
976a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
9774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
978d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  HValue* value = instr->value();
979b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  Representation r = value->representation();
980f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  HType type = value->type();
981b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  ToBooleanStub::Types expected = instr->expected_input_types();
982b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic();
9831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
984b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
985b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
986b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  LOperand* temp = !easy_case && expected.NeedsMap() ? TempRegister() : NULL;
987b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  LInstruction* branch = new(zone()) LBranch(UseRegister(value), temp);
988b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if (!easy_case &&
989b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) ||
990b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org       !expected.IsGeneric())) {
991b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    branch = AssignEnvironment(branch);
9921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
993b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return branch;
994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
995a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
996a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
9974e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
9984e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  return new(zone()) LDebugBreak();
9994e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org}
10004e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
10014e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
10020a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
1003a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->value()->representation().IsTagged());
1004a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1005c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LCmpMapAndBranch(value);
1006a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1007a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1008a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1009a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
101077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
1011c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value())));
1012a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1013a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1014a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1015a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
101677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
1017b2a1c078e6f552a66c1426482a3d007b7ea7af7ddanno@chromium.org  return DefineAsRegister(new(zone()) LArgumentsElements);
1018a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1019a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1020a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1021a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
1022496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* left = UseFixed(instr->left(), InstanceofStub::left());
1023496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* right = UseFixed(instr->right(), InstanceofStub::right());
1024496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
1025c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstanceOf* result = new(zone()) LInstanceOf(context, left, right);
1026a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
1027a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1028a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1029a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1030d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1031d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org    HInstanceOfKnownGlobal* instr) {
1032c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstanceOfKnownGlobal* result =
1033c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LInstanceOfKnownGlobal(
1034ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org          UseFixed(instr->context(), esi),
1035ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org          UseFixed(instr->left(), InstanceofStub::left()),
1036d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org          FixedTemp(edi));
10379ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
1038d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
1039d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1040d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1041154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
1042154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* receiver = UseRegister(instr->receiver());
10439ed27460593e67bc55b9feb15ca7c301e9f804b0rossberg@chromium.org  LOperand* function = UseRegister(instr->function());
1044154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* temp = TempRegister();
1045154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LWrapReceiver* result =
1046154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org      new(zone()) LWrapReceiver(receiver, function, temp);
1047154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  return AssignEnvironment(DefineSameAsFirst(result));
1048154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}
1049154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1050154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1051a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1052a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* function = UseFixed(instr->function(), edi);
1053a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* receiver = UseFixed(instr->receiver(), eax);
1054496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* length = UseFixed(instr->length(), ebx);
1055496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* elements = UseFixed(instr->elements(), ecx);
1056c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LApplyArguments* result = new(zone()) LApplyArguments(function,
1057c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                                        receiver,
1058c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                                        length,
1059154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org                                                        elements);
1060a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr, CAN_DEOPTIMIZE_EAGERLY);
1061a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1062a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1063a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1064011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
1065011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  int argc = instr->OperandCount();
1066011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  for (int i = 0; i < argc; ++i) {
1067011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    LOperand* argument = UseAny(instr->argument(i));
1068011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    AddInstruction(new(zone()) LPushArgument(argument), instr);
1069011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  }
1070011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return NULL;
1071a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1072a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1073a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1074662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry(
1075662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    HStoreCodeEntry* store_code_entry) {
1076662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* function = UseRegister(store_code_entry->function());
1077662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
1078662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  return new(zone()) LStoreCodeEntry(function, code_object);
1079662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
1080662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1081662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
10822bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject(
1083ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org    HInnerAllocatedObject* instr) {
1084ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* base_object = UseRegisterAtStart(instr->base_object());
1085ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
1086ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  return DefineAsRegister(
1087ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org      new(zone()) LInnerAllocatedObject(base_object, offset));
10882bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org}
10892bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
10902bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
1091d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
1092c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return instr->HasNoUses()
1093c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? NULL
1094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : DefineAsRegister(new(zone()) LThisFunction);
1095d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
1096d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
1097d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
109883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) {
10994cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  if (instr->HasNoUses()) return NULL;
11004cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
11014cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  if (info()->IsStub()) {
11024cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org    return DefineFixed(new(zone()) LContext, esi);
11034cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  }
11044cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
11054cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  return DefineAsRegister(new(zone()) LContext);
110683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
110783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
110883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
110956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
111056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
111156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
111256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org}
111356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
111456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
111526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction(
111626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HCallJSFunction* instr) {
111726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function = UseFixed(instr->function(), edi);
111826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
111926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LCallJSFunction* result = new(zone()) LCallJSFunction(function);
112026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
112126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
112226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
112326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
112426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
112526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor(
112626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HCallWithDescriptor* instr) {
112726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  const CallInterfaceDescriptor* descriptor = instr->descriptor();
112826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
112926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
113026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
113126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ops.Add(target, zone());
113226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 1; i < instr->OperandCount(); i++) {
113326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    LOperand* op = UseFixed(instr->OperandAt(i),
113426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org        descriptor->GetParameterRegister(i - 1));
113526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    ops.Add(op, zone());
113626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
113726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
113826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
113926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org      descriptor, ops, zone());
114026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1144160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1145160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
1146160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  LOperand* function = UseFixed(instr->function(), edi);
1147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
1148160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1149160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}
1150160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1151160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  switch (instr->op()) {
1154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathFloor: return DoMathFloor(instr);
1155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathRound: return DoMathRound(instr);
1156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathAbs: return DoMathAbs(instr);
1157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathLog: return DoMathLog(instr);
1158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathExp: return DoMathExp(instr);
1159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathSqrt: return DoMathSqrt(instr);
1160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case kMathPowHalf: return DoMathPowHalf(instr);
1161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    case kMathClz32: return DoMathClz32(instr);
1162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    default:
1163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      UNREACHABLE();
1164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return NULL;
1165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
1170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathFloor* result = new(zone()) LMathFloor(input);
1172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return AssignEnvironment(DefineAsRegister(result));
1173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
1177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegister(instr->value());
1178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp = FixedTemp(xmm4);
1179935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LMathRound* result = new(zone()) LMathRound(input, temp);
1180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return AssignEnvironment(DefineAsRegister(result));
1181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
1185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* context = UseAny(instr->context());  // Deferred use.
1186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1187b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  LInstruction* result =
1188b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      DefineSameAsFirst(new(zone()) LMathAbs(context, input));
1189b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  Representation r = instr->value()->representation();
1190b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
1191b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if (!r.IsDouble()) result = AssignEnvironment(result);
1192b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return result;
1193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(instr->representation().IsDouble());
1198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(instr->value()->representation().IsDouble());
1199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
12004f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  return MarkAsCall(DefineSameAsFirst(new(zone()) LMathLog(input)), instr);
1201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
1205f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1206f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LMathClz32* result = new(zone()) LMathClz32(input);
1207f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return DefineAsRegister(result);
1208f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
1209f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1210f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(instr->representation().IsDouble());
1213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(instr->value()->representation().IsDouble());
1214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value = UseTempRegister(instr->value());
1215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp1 = TempRegister();
1216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp2 = TempRegister();
1217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathExp* result = new(zone()) LMathExp(value, temp1, temp2);
1218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineAsRegister(result);
1219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
12237e6132b924829c353864933f29124419916db550machenbach@chromium.org  LOperand* input = UseAtStart(instr->value());
12247e6132b924829c353864933f29124419916db550machenbach@chromium.org  return DefineAsRegister(new(zone()) LMathSqrt(input));
1225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
1229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
1230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp = TempRegister();
1231935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp);
1232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return DefineSameAsFirst(result);
1233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
1237496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
1238a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), edi);
1239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCallNew* result = new(zone()) LCallNew(context, constructor);
1240a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
1241a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1242a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1243a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
12444a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
12454a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
12464a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), edi);
12474a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
12484a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
12494a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
12504a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
12514a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1253496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
1254c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  LOperand* function = UseFixed(instr->function(), edi);
1255ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org  LCallFunction* call = new(zone()) LCallFunction(context, function);
1256a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  return MarkAsCall(DefineFixed(call, eax), instr);
1257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1259a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1260a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1261ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
1262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), eax), instr);
1263a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1264a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1266e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) {
1267e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  return DoShift(Token::ROR, instr);
1268e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org}
1269e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1270e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
1271a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) {
1272a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return DoShift(Token::SHR, instr);
1273a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1274a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1275a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1276a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) {
1277a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return DoShift(Token::SAR, instr);
1278a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1279a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1280a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1281a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) {
1282a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return DoShift(Token::SHL, instr);
1283a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1284a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1286c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1287fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1288594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->left()->representation().Equals(instr->representation()));
1289594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->right()->representation().Equals(instr->representation()));
1290528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    ASSERT(instr->CheckFlag(HValue::kTruncatingToInt32));
1291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1292906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1293906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
1294c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DefineSameAsFirst(new(zone()) LBitI(left, right));
1295c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  } else {
1296528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(instr->op(), instr);
1297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1298a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1301ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1302ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->representation().IsSmiOrInteger32());
1303ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1304ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1305ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1306ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1307486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
1308486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1309486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1310486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
1311ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
1312486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org       divisor != 1 && divisor != -1)) {
1313486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1314486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1315486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1316ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1317ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1318ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1319bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1320bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->representation().IsInteger32());
1321bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1322bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1323bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1324bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1325bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp1 = FixedTemp(eax);
1326bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp2 = FixedTemp(edx);
1327486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineFixed(new(zone()) LDivByConstI(
1328486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp1, temp2), edx);
1329486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (divisor == 0 ||
1330486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1331486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
1332486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1333486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1334486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1335bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1336bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1337bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1338ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) {
1339ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->representation().IsSmiOrInteger32());
1340ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1341ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1342ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseFixed(instr->left(), eax);
1343ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1344ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* temp = FixedTemp(edx);
1345486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineFixed(new(zone()) LDivI(
1346486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp), eax);
1347486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1348486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1349486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->CheckFlag(HValue::kCanOverflow) ||
1350ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) {
1351486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1352486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1353486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1354ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1355ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1356ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1358528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1359bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
1360bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivByPowerOf2I(instr);
1361bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
1362bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivByConstI(instr);
1363bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else {
1364bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoDivI(instr);
1365bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
1366528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1367528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticD(Token::DIV, instr);
1368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::DIV, instr);
1370a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1372a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1374ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1375ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1376ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1377381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I(
1378381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org          dividend, divisor));
1379381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1380381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1381381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    result = AssignEnvironment(result);
1382381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
1383381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return result;
1384ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1385ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1386ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1387ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1388bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->representation().IsInteger32());
1389bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1390bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1391bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1392ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1393bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp1 = FixedTemp(eax);
1394bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp2 = FixedTemp(edx);
13957010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LOperand* temp3 =
13967010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
13977010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
13987010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      NULL : TempRegister();
1399ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* result =
1400bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      DefineFixed(new(zone()) LFlooringDivByConstI(dividend,
1401bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                                                   divisor,
1402bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                                                   temp1,
14037010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org                                                   temp2,
14047010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org                                                   temp3),
1405bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                  edx);
14067010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  if (divisor == 0 ||
14077010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
14087010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    result = AssignEnvironment(result);
14097010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  }
14107010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  return result;
1411ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
14124cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
1413ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1414ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1415ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  ASSERT(instr->representation().IsSmiOrInteger32());
1416ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1417ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1418ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* dividend = UseFixed(instr->left(), eax);
1419ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1420ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* temp = FixedTemp(edx);
1421ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* result = DefineFixed(new(zone()) LFlooringDivI(
1422ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org          dividend, divisor, temp), eax);
1423ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1424ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1425ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      instr->CheckFlag(HValue::kCanOverflow)) {
1426ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    result = AssignEnvironment(result);
1427ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
1428ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  return result;
1429ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org}
1430ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
1431ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
1432ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1433ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  if (instr->RightIsPowerOf2()) {
1434ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    return DoFlooringDivByPowerOf2I(instr);
14357010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  } else if (instr->right()->IsConstant()) {
14367010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    return DoFlooringDivByConstI(instr);
1437d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org  } else {
1438ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    return DoFlooringDivI(instr);
1439d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org  }
1440d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org}
1441d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org
1442d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org
1443ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1444ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->representation().IsSmiOrInteger32());
1445ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1446ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1447ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
1448ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1449486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1450486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor));
1451486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1452486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1453486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1454486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1455ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1456ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1457ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1458bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1459bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->representation().IsSmiOrInteger32());
1460bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1461bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1462bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
1463bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
1464bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp1 = FixedTemp(eax);
1465bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp2 = FixedTemp(edx);
1466486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineFixed(new(zone()) LModByConstI(
1467486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp1, temp2), eax);
1468486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1469486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1470486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1471486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1472bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1473bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1474bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1475ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1476ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->representation().IsSmiOrInteger32());
1477ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->left()->representation().Equals(instr->representation()));
1478ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(instr->right()->representation().Equals(instr->representation()));
1479ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend = UseFixed(instr->left(), eax);
1480ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1481ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* temp = FixedTemp(edx);
1482486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  LInstruction* result = DefineFixed(new(zone()) LModI(
1483486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org          dividend, divisor, temp), edx);
1484486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1485486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1486486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    result = AssignEnvironment(result);
1487486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
1488486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return result;
1489ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
1490ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1491ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
1492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1493fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1494bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
1495bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModByPowerOf2I(instr);
1496bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
1497bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModByConstI(instr);
1498bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    } else {
1499bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return DoModI(instr);
1500bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
1501528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  } else if (instr->representation().IsDouble()) {
1502528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticD(Token::MOD, instr);
15032f877ace3ac6432b1ce44abd553cd3ff97321680hpayer@chromium.org  } else {
1504528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return DoArithmeticT(Token::MOD, instr);
1505a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1510fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1511fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    ASSERT(instr->left()->representation().Equals(instr->representation()));
1512fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    ASSERT(instr->right()->representation().Equals(instr->representation()));
1513906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1514906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = UseOrConstant(instr->BetterRightOperand());
1515a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    LOperand* temp = NULL;
1516a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      temp = TempRegister();
1518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1519c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LMulI* mul = new(zone()) LMulI(left, right, temp);
1520f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    if (instr->CheckFlag(HValue::kCanOverflow) ||
1521f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com        instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1522f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com      AssignEnvironment(mul);
1523f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    }
1524f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    return DefineSameAsFirst(mul);
1525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (instr->representation().IsDouble()) {
1526169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return DoArithmeticD(Token::MUL, instr);
1527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::MUL, instr);
1529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1532a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1533a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) {
1534fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1535594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->left()->representation().Equals(instr->representation()));
1536594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->right()->representation().Equals(instr->representation()));
15370ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
15380ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
1539c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LSubI* sub = new(zone()) LSubI(left, right);
1540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    LInstruction* result = DefineSameAsFirst(sub);
1541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
1542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      result = AssignEnvironment(result);
1543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
1545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (instr->representation().IsDouble()) {
1546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticD(Token::SUB, instr);
1547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1548a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::SUB, instr);
1549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1554fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1555594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->left()->representation().Equals(instr->representation()));
1556594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->right()->representation().Equals(instr->representation()));
1557906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    // Check to see if it would be advantageous to use an lea instruction rather
1558906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    // than an add. This is the case when no overflow check is needed and there
1559906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    // are multiple uses of the add's inputs, so using a 3-register add will
1560906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    // preserve all input values for later uses.
1561906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    bool use_lea = LAddI::UseLea(instr);
1562906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1563906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    HValue* right_candidate = instr->BetterRightOperand();
1564906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LOperand* right = use_lea
1565906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org        ? UseRegisterOrConstantAtStart(right_candidate)
1566906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org        : UseOrConstantAtStart(right_candidate);
1567c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
1568906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1569906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    LInstruction* result = use_lea
1570906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org        ? DefineAsRegister(add)
1571906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org        : DefineSameAsFirst(add);
1572906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (can_overflow) {
1573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      result = AssignEnvironment(result);
1574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
1576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (instr->representation().IsDouble()) {
1577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticD(Token::ADD, instr);
157837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  } else if (instr->representation().IsExternal()) {
157937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    ASSERT(instr->left()->representation().IsExternal());
158037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    ASSERT(instr->right()->representation().IsInteger32());
158137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    ASSERT(!instr->CheckFlag(HValue::kCanOverflow));
158237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    bool use_lea = LAddI::UseLea(instr);
158337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
158437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    HValue* right_candidate = instr->right();
158537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LOperand* right = use_lea
158637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org        ? UseRegisterOrConstantAtStart(right_candidate)
158737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org        : UseOrConstantAtStart(right_candidate);
158837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
158937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    LInstruction* result = use_lea
159037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org        ? DefineAsRegister(add)
159137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org        : DefineSameAsFirst(add);
159237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return result;
1593a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return DoArithmeticT(Token::ADD, instr);
1595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1598a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1599471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1600471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LOperand* left = NULL;
1601471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LOperand* right = NULL;
1602fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1603594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->left()->representation().Equals(instr->representation()));
1604594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->right()->representation().Equals(instr->representation()));
1605906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    left = UseRegisterAtStart(instr->BetterLeftOperand());
1606906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    right = UseOrConstantAtStart(instr->BetterRightOperand());
1607471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  } else {
1608471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ASSERT(instr->representation().IsDouble());
1609471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ASSERT(instr->left()->representation().IsDouble());
1610471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    ASSERT(instr->right()->representation().IsDouble());
1611471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    left = UseRegisterAtStart(instr->left());
1612471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    right = UseRegisterAtStart(instr->right());
1613471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1614471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LMathMinMax* minmax = new(zone()) LMathMinMax(left, right);
1615471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  return DefineSameAsFirst(minmax);
1616471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
1617471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1618471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
16195f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) {
16205f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  ASSERT(instr->representation().IsDouble());
16215f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // We call a C function for double power. It can't trigger a GC.
16225f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // We need to use fixed result register for the call.
16235f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  Representation exponent_type = instr->right()->representation();
16245f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  ASSERT(instr->left()->representation().IsDouble());
162564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  LOperand* left = UseFixedDouble(instr->left(), xmm2);
16265f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  LOperand* right = exponent_type.IsDouble() ?
162764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      UseFixedDouble(instr->right(), xmm1) :
16285f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      UseFixed(instr->right(), eax);
1629c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LPower* result = new(zone()) LPower(left, right);
16305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return MarkAsCall(DefineFixedDouble(result, xmm3), instr,
16315f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                    CAN_DEOPTIMIZE_EAGERLY);
16325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
16335f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
16345f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
16354f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
163653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  ASSERT(instr->left()->representation().IsSmiOrTagged());
163753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  ASSERT(instr->right()->representation().IsSmiOrTagged());
1638ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
1639394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  LOperand* left = UseFixed(instr->left(), edx);
1640394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  LOperand* right = UseFixed(instr->right(), eax);
1641c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCmpT* result = new(zone()) LCmpT(context, left, right);
16424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
16434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org}
16444f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
16454f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1646e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1647e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    HCompareNumericAndBranch* instr) {
1648fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation r = instr->representation();
1649c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  if (r.IsSmiOrInteger32()) {
1650594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->left()->representation().Equals(r));
1651594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    ASSERT(instr->right()->representation().Equals(r));
1652394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
1653a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
1654e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
16554f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  } else {
16564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    ASSERT(r.IsDouble());
1657c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    ASSERT(instr->left()->representation().IsDouble());
1658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ASSERT(instr->right()->representation().IsDouble());
1659394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* left;
1660394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* right;
16614000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org    if (CanBeImmediateConstant(instr->left()) &&
16624000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org        CanBeImmediateConstant(instr->right())) {
16634000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org      // The code generator requires either both inputs to be constant
16644000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org      // operands, or neither.
16654000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org      left = UseConstant(instr->left());
16664000f228dd279f96628ed845f1e81d01ba7e14d8jkummerow@chromium.org      right = UseConstant(instr->right());
1667394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    } else {
1668394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      left = UseRegisterAtStart(instr->left());
1669394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      right = UseRegisterAtStart(instr->right());
1670394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    }
1671e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
1672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1675a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
16764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
16774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HCompareObjectEqAndBranch* instr) {
1678a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* left = UseRegisterAtStart(instr->left());
1679b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  LOperand* right = UseOrConstantAtStart(instr->right());
1680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LCmpObjectEqAndBranch(left, right);
16817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
16827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
16837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1684c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1685c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org    HCompareHoleAndBranch* instr) {
1686528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1687528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return new(zone()) LCmpHoleAndBranch(value);
1688c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org}
1689c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
1690c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
16910cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch(
16920cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    HCompareMinusZeroAndBranch* instr) {
16930cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* value = UseRegister(instr->value());
16940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* scratch = TempRegister();
16950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return new(zone()) LCompareMinusZeroAndBranch(value, scratch);
16960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org}
16970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
16980cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
16994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
170053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  ASSERT(instr->value()->representation().IsSmiOrTagged());
17014f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  LOperand* temp = TempRegister();
1702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LIsObjectAndBranch(UseRegister(instr->value()), temp);
17035f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
17045f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
17055f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
17060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
17070ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  ASSERT(instr->value()->representation().IsTagged());
17080ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* temp = TempRegister();
17097028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return new(zone()) LIsStringAndBranch(UseRegister(instr->value()), temp);
17100ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
17110ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17120ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->value()->representation().IsTagged());
1715c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
17204f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HIsUndetectableAndBranch* instr) {
172153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  ASSERT(instr->value()->representation().IsTagged());
1722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LIsUndetectableAndBranch(
1723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      UseRegisterAtStart(instr->value()), TempRegister());
17247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
17257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
17267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
17270ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryLInstruction* LChunkBuilder::DoStringCompareAndBranch(
17280ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HStringCompareAndBranch* instr) {
17290ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  ASSERT(instr->left()->representation().IsTagged());
17300ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  ASSERT(instr->right()->representation().IsTagged());
17310ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* context = UseFixed(instr->context(), esi);
17320ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* left = UseFixed(instr->left(), edx);
17330ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  LOperand* right = UseFixed(instr->right(), eax);
17340ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  LStringCompareAndBranch* result = new(zone())
17360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      LStringCompareAndBranch(context, left, right);
17370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return MarkAsCall(result, instr);
17390ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
17400ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17410ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
17424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
17434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HHasInstanceTypeAndBranch* instr) {
1744a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->value()->representation().IsTagged());
1745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LHasInstanceTypeAndBranch(
1746c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      UseRegisterAtStart(instr->value()),
1747c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      TempRegister());
1748a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1749a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
175149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
175249edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    HGetCachedArrayIndex* instr)  {
17538f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  ASSERT(instr->value()->representation().IsTagged());
17548f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
17558f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
1756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
175749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org}
175849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
175949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
17604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
17614f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HHasCachedArrayIndexAndBranch* instr) {
1762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->value()->representation().IsTagged());
1763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LHasCachedArrayIndexAndBranch(
17644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      UseRegisterAtStart(instr->value()));
1765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1766a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1767a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
17694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HClassOfTestAndBranch* instr) {
1770a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->value()->representation().IsTagged());
1771f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()),
1772f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com                                           TempRegister(),
1773f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com                                           TempRegister());
1774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1775a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1776a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1777355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
1778355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  LOperand* map = UseRegisterAtStart(instr->value());
1779355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  return DefineAsRegister(new(zone()) LMapEnumLength(map));
1780355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}
1781355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1782355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
17834efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
17844efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  LOperand* date = UseFixed(instr->value(), eax);
17854efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  LDateField* result =
17864efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org      new(zone()) LDateField(date, FixedTemp(ecx), instr->index());
1787de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr, CAN_DEOPTIMIZE_EAGERLY);
17884efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org}
17894efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
17904efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
1791e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
1792e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
1793e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1794e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
1795e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
1796e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1797e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
17989af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgLOperand* LChunkBuilder::GetSeqStringSetCharOperand(HSeqStringSetChar* instr) {
17999af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  if (instr->encoding() == String::ONE_BYTE_ENCODING) {
18009af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    if (FLAG_debug_code) {
18019af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      return UseFixed(instr->value(), eax);
18029af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    } else {
18039af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      return UseFixedOrConstant(instr->value(), eax);
18049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    }
18059af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  } else {
18069af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    if (FLAG_debug_code) {
18079af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      return UseRegisterAtStart(instr->value());
18089af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    } else {
18099af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      return UseRegisterOrConstantAtStart(instr->value());
18109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    }
18119af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
18129af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org}
18139af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
18149af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
181532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
1816e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
18179af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* index = FLAG_debug_code
18189af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      ? UseRegisterAtStart(instr->index())
18199af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org      : UseRegisterOrConstantAtStart(instr->index());
18209af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* value = GetSeqStringSetCharOperand(instr);
18219af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), esi) : NULL;
18229af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LInstruction* result = new(zone()) LSeqStringSetChar(context, string,
18239af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org                                                       index, value);
18249af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  if (FLAG_debug_code) {
18259af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    result = MarkAsCall(result, instr);
18269af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
18279af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return result;
182832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
182932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
183032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
1831a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1832a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code && instr->skip_check()) return NULL;
1833a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1834a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LOperand* length = !index->IsConstantOperand()
1835a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      ? UseOrConstantAtStart(instr->length())
1836a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      : UseAtStart(instr->length());
1837a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  LInstruction* result = new(zone()) LBoundsCheck(index, length);
1838a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (!FLAG_debug_code || !instr->skip_check()) {
1839a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org    result = AssignEnvironment(result);
1840a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  }
1841a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  return result;
1842a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1843a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1844a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1845876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
1846876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    HBoundsCheckBaseIndexInformation* instr) {
1847876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  UNREACHABLE();
1848876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  return NULL;
1849876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
1850876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1851876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1852c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
1853c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  // The control instruction marking the end of a block that completed
1854c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  // abruptly (e.g., threw an exception).  There is nothing specific to do.
1855c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  return NULL;
1856c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org}
1857c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1858c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org
1859d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
1860d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  return NULL;
1861d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
1862d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
1863d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
1864c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1865c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // All HForceRepresentation instructions should be eliminated in the
1866c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // representation change phase of Hydrogen.
1867c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  UNREACHABLE();
1868c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  return NULL;
1869c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org}
1870c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
1871c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
1872a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) {
1873a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Representation from = instr->from();
1874a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Representation to = instr->to();
1875ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  HValue* val = instr->value();
1876a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (from.IsSmi()) {
1877a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    if (to.IsTagged()) {
1878ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
187953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1880a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    }
1881a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    from = Representation::Tagged();
1882a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
1883a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (from.IsTagged()) {
1884a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (to.IsDouble()) {
1885ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
18864a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org      LOperand* temp = TempRegister();
1887ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LInstruction* result =
1888ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org          DefineAsRegister(new(zone()) LNumberUntagD(value, temp));
1889ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1890b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      return result;
1891a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1892a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      LOperand* value = UseRegister(val);
1893a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      if (val->type().IsSmi()) {
1894a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        return DefineSameAsFirst(new(zone()) LDummyUse(value));
1895a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      }
189653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
1897a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1898a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ASSERT(to.IsInteger32());
1899662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      if (val->type().IsSmi() || val->representation().IsSmi()) {
1900662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        LOperand* value = UseRegister(val);
190153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org        return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
19027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      } else {
1903ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LOperand* value = UseRegister(val);
1904c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org        bool truncating = instr->CanTruncateToInt32();
19053c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org        LOperand* xmm_temp = !truncating ? FixedTemp(xmm1) : NULL;
1906ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        LInstruction* result =
1907ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org            DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp));
19084edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1909b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org        return result;
1910a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
1911a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1912a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (from.IsDouble()) {
1913a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (to.IsTagged()) {
1914a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      info()->MarkAsDeferredCalling();
1915ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegisterAtStart(val);
1916068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org      LOperand* temp = FLAG_inline_new ? TempRegister() : NULL;
1917a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      LUnallocated* result_temp = TempRegister();
1918c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      LNumberTagD* result = new(zone()) LNumberTagD(value, temp);
1919a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return AssignPointerMap(Define(result, result_temp));
1920a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1921ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = UseRegister(val);
1922a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      return AssignEnvironment(
1923a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
1924a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1925a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ASSERT(to.IsInteger32());
1926c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org      bool truncating = instr->CanTruncateToInt32();
19273c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      bool needs_temp = !truncating;
1928ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      LOperand* value = needs_temp ? UseTempRegister(val) : UseRegister(val);
1929c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      LOperand* temp = needs_temp ? TempRegister() : NULL;
1930b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      LInstruction* result =
1931b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org          DefineAsRegister(new(zone()) LDoubleToI(value, temp));
1932b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      if (!truncating) result = AssignEnvironment(result);
1933b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      return result;
1934a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1935a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (from.IsInteger32()) {
1936a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    info()->MarkAsDeferredCalling();
1937a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (to.IsTagged()) {
19387e6132b924829c353864933f29124419916db550machenbach@chromium.org      LOperand* value = UseRegister(val);
1939381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      if (!instr->CheckFlag(HValue::kCanOverflow)) {
1940c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        return DefineSameAsFirst(new(zone()) LSmiTag(value));
194146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      } else if (val->CheckFlag(HInstruction::kUint32)) {
19427e6132b924829c353864933f29124419916db550machenbach@chromium.org        LOperand* temp = TempRegister();
19437e6132b924829c353864933f29124419916db550machenbach@chromium.org        LNumberTagU* result = new(zone()) LNumberTagU(value, temp);
1944b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org        return AssignPointerMap(DefineSameAsFirst(result));
1945a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      } else {
1946bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LOperand* temp = TempRegister();
1947bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org        LNumberTagI* result = new(zone()) LNumberTagI(value, temp);
1948b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org        return AssignPointerMap(DefineSameAsFirst(result));
1949a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
1950a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    } else if (to.IsSmi()) {
1951a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      LOperand* value = UseRegister(val);
1952381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      LInstruction* result = DefineSameAsFirst(new(zone()) LSmiTag(value));
1953381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      if (instr->CheckFlag(HValue::kCanOverflow)) {
1954381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        result = AssignEnvironment(result);
1955a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      }
1956381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      return result;
1957a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1958a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ASSERT(to.IsDouble());
1959ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
19607e6132b924829c353864933f29124419916db550machenbach@chromium.org        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
196146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      } else {
1962ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org        return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val)));
196346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      }
1964a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1965a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1966a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  UNREACHABLE();
1967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
1968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1970a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
19711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
19724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  LOperand* value = UseAtStart(instr->value());
19738f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  LInstruction* result = new(zone()) LCheckNonSmi(value);
1974eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  if (!instr->value()->type().IsHeapObject()) {
1975eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    result = AssignEnvironment(result);
1976eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  }
19778f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  return result;
1978a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1979a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1980a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1981e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
1982e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1983e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  return AssignEnvironment(new(zone()) LCheckSmi(value));
1984e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
1985e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1986e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1987a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
1988a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
1989a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* temp = TempRegister();
1990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCheckInstanceType* result = new(zone()) LCheckInstanceType(value, temp);
1991a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return AssignEnvironment(result);
1992a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1993a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1994a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
19951f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
19961f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  // If the object is in new space, we'll emit a global cell compare and so
19971f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  // want the value in a register.  If the object gets promoted before we
1998c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // emit code, we will still get the register but will do an immediate
1999c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // compare instead of the cell compare.  This is safe.
20001f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  LOperand* value = instr->object_in_new_space()
2001003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      ? UseRegisterAtStart(instr->value()) : UseAtStart(instr->value());
20021f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  return AssignEnvironment(new(zone()) LCheckValue(value));
2003a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2004a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2005a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
20061456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
2007af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
2008af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2009af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
2010af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (instr->HasMigrationTarget()) {
2011af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    info()->MarkAsDeferredCalling();
2012af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    result = AssignPointerMap(result);
2013594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
2014594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return result;
2015a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2016a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2017a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2018c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
2019c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  HValue* value = instr->value();
2020c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  Representation input_rep = value->representation();
2021c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  if (input_rep.IsDouble()) {
2022c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    LOperand* reg = UseRegister(value);
202389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    return DefineFixed(new(zone()) LClampDToUint8(reg), eax);
2024c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  } else if (input_rep.IsInteger32()) {
2025c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    LOperand* reg = UseFixed(value, eax);
2026c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DefineFixed(new(zone()) LClampIToUint8(reg), eax);
2027c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  } else {
202853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    ASSERT(input_rep.IsSmiOrTagged());
20293c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    LOperand* reg = UseFixed(value, eax);
20303c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // Register allocator doesn't (yet) support allocation of double
20313c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    // temps. Reserve xmm1 explicitly.
20323c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    LOperand* temp = FixedTemp(xmm1);
20333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    LClampTToUint8* result = new(zone()) LClampTToUint8(reg, temp);
20343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    return AssignEnvironment(DefineFixed(result, eax));
2035c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
2036c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org}
2037c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2038c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2039ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) {
2040ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  HValue* value = instr->value();
2041ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  ASSERT(value->representation().IsDouble());
2042ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value)));
2043ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2044ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2045ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2046ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) {
2047ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* lo = UseRegister(instr->lo());
2048ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* hi = UseRegister(instr->hi());
2049ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return DefineAsRegister(new(zone()) LConstructDouble(hi, lo));
2050ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
2051ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2052ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2053a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
2054935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context = info()->IsStub() ? UseFixed(instr->context(), esi) : NULL;
20556e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
2056935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  return new(zone()) LReturn(
2057935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      UseFixed(instr->value(), eax), context, parameter_count);
2058a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2059a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2060a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2061a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
2062a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Representation r = instr->representation();
2063b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  if (r.IsSmi()) {
2064b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    return DefineAsRegister(new(zone()) LConstantS);
2065b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else if (r.IsInteger32()) {
2066c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DefineAsRegister(new(zone()) LConstantI);
2067a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else if (r.IsDouble()) {
2068a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    double value = instr->DoubleValue();
2069e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    bool value_is_zero = BitCast<uint64_t, double>(value) == 0;
2070169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    LOperand* temp = value_is_zero ? NULL : TempRegister();
2071169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    return DefineAsRegister(new(zone()) LConstantD(temp));
2072d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  } else if (r.IsExternal()) {
2073d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return DefineAsRegister(new(zone()) LConstantE);
2074b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  } else if (r.IsTagged()) {
2075c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return DefineAsRegister(new(zone()) LConstantT);
2076a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
2077c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    UNREACHABLE();
2078a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return NULL;
2079a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2080a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2081a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2082a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2083c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
2084c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell;
2085c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return instr->RequiresHoleCheck()
2086a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ? AssignEnvironment(DefineAsRegister(result))
2087a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      : DefineAsRegister(result);
2088a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2089a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2090a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2091c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
2092c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
20931044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LOperand* global_object = UseFixed(instr->global_object(), edx);
2094c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLoadGlobalGeneric* result =
2095c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LLoadGlobalGeneric(context, global_object);
2096c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
2097c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
2098c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
2099c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
210074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
210174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  LStoreGlobalCell* result =
2102e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org      new(zone()) LStoreGlobalCell(UseRegister(instr->value()));
2103c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
2104a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2107c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
210883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* context = UseRegisterAtStart(instr->value());
210964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  LInstruction* result =
211064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      DefineAsRegister(new(zone()) LLoadContextSlot(context));
2111b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2112b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    result = AssignEnvironment(result);
2113b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  }
2114b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return result;
211583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
211683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
211783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
211883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
211983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* value;
212083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* temp;
2121c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  LOperand* context = UseRegister(instr->context());
212283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  if (instr->NeedsWriteBarrier()) {
212383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    value = UseTempRegister(instr->value());
212483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    temp = TempRegister();
212583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  } else {
212683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    value = UseRegister(instr->value());
212783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    temp = NULL;
212883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
212964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp);
2130b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2131b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    result = AssignEnvironment(result);
2132b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  }
2133b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return result;
2134c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
2135c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2136c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
2138d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  LOperand* obj = (instr->access().IsExternalMemory() &&
2139d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                   instr->access().offset() == 0)
2140d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      ? UseRegisterOrConstantAtStart(instr->object())
2141d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      : UseRegisterAtStart(instr->object());
214257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
2143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
2147496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
21481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LOperand* object = UseFixed(instr->object(), edx);
2149c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(context, object);
2150c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
2151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
21549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
21559e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org    HLoadFunctionPrototype* instr) {
21569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  return AssignEnvironment(DefineAsRegister(
2157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()),
2158c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                         TempRegister())));
21599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org}
21609e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
21619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org
2162528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
2163528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return DefineAsRegister(new(zone()) LLoadRoot);
2164528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org}
2165528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
2166528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
2167e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
2168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ASSERT(instr->key()->representation().IsSmiOrInteger32());
216983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  ElementsKind elements_kind = instr->elements_kind();
2170eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  bool clobbers_key = ExternalArrayOpRequiresTemp(
2171eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      instr->key()->representation(), elements_kind);
2172eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  LOperand* key = clobbers_key
2173304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org      ? UseTempRegister(instr->key())
2174e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org      : UseRegisterOrConstantAtStart(instr->key());
2175b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  LInstruction* result = NULL;
2176304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
21775c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!instr->is_typed_elements()) {
2178eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    LOperand* obj = UseRegisterAtStart(instr->elements());
2179b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key));
2180eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  } else {
2181e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    ASSERT(
2182e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org        (instr->representation().IsInteger32() &&
21835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         !(IsDoubleOrFloatElementsKind(instr->elements_kind()))) ||
2184e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org        (instr->representation().IsDouble() &&
21855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         (IsDoubleOrFloatElementsKind(instr->elements_kind()))));
21865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    LOperand* backing_store = UseRegister(instr->elements());
2187b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key));
2188e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
2189e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
2190b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  if ((instr->is_external() || instr->is_fixed_typed_array()) ?
2191b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      // see LCodeGen::DoLoadKeyedExternalArray
2192b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      ((instr->elements_kind() == EXTERNAL_UINT32_ELEMENTS ||
2193b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org        instr->elements_kind() == UINT32_ELEMENTS) &&
2194b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org       !instr->CheckFlag(HInstruction::kUint32)) :
2195b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      // see LCodeGen::DoLoadKeyedFixedDoubleArray and
2196b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      // LCodeGen::DoLoadKeyedFixedArray
2197b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      instr->RequiresHoleCheck()) {
2198b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    result = AssignEnvironment(result);
2199b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  }
2200b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return result;
2201496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org}
2202496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
2203496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
2204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
2205496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* object = UseFixed(instr->object(), edx);
22071044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LOperand* key = UseFixed(instr->key(), ecx);
2208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2209c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLoadKeyedGeneric* result =
2210c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LLoadKeyedGeneric(context, object, key);
2211c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
2212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgLOperand* LChunkBuilder::GetStoreKeyedValueOperand(HStoreKeyed* instr) {
2216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ElementsKind elements_kind = instr->elements_kind();
2217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  // Determine if we need a byte register in this case for the value.
2219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  bool val_is_fixed_register =
2220af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      elements_kind == EXTERNAL_INT8_ELEMENTS ||
2221af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      elements_kind == EXTERNAL_UINT8_ELEMENTS ||
2222af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      elements_kind == EXTERNAL_UINT8_CLAMPED_ELEMENTS ||
22235c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      elements_kind == UINT8_ELEMENTS ||
22245c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      elements_kind == INT8_ELEMENTS ||
22255c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      elements_kind == UINT8_CLAMPED_ELEMENTS;
2226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (val_is_fixed_register) {
2227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    return UseFixed(instr->value(), eax);
2228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
2229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return UseRegister(instr->value());
2231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
2232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2234e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
22355c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!instr->is_typed_elements()) {
2236e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    ASSERT(instr->elements()->representation().IsTagged());
2237e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    ASSERT(instr->key()->representation().IsInteger32() ||
2238a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org           instr->key()->representation().IsSmi());
2239717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2240eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    if (instr->value()->representation().IsDouble()) {
2241eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      LOperand* object = UseRegisterAtStart(instr->elements());
2242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      LOperand* val = NULL;
2243169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org      val = UseRegisterAtStart(instr->value());
2244eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      LOperand* key = UseRegisterOrConstantAtStart(instr->key());
22458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      return new(zone()) LStoreKeyed(object, key, val);
2246e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    } else {
2247a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      ASSERT(instr->value()->representation().IsSmiOrTagged());
2248eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      bool needs_write_barrier = instr->NeedsWriteBarrier();
2249eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
2250eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      LOperand* obj = UseRegister(instr->elements());
225177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      LOperand* val;
225277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      LOperand* key;
225377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      if (needs_write_barrier) {
225477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        val = UseTempRegister(instr->value());
225577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        key = UseTempRegister(instr->key());
225677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      } else {
2257f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org        val = UseRegisterOrConstantAtStart(instr->value());
2258f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org        key = UseRegisterOrConstantAtStart(instr->key());
225977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      }
22608e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      return new(zone()) LStoreKeyed(obj, key, val);
2261e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    }
22627516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
2263e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
22648e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  ElementsKind elements_kind = instr->elements_kind();
22658e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  ASSERT(
22668e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      (instr->value()->representation().IsInteger32() &&
22675c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org       !IsDoubleOrFloatElementsKind(elements_kind)) ||
22688e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      (instr->value()->representation().IsDouble() &&
22695c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org       IsDoubleOrFloatElementsKind(elements_kind)));
22705c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ASSERT((instr->is_fixed_typed_array() &&
22715c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instr->elements()->representation().IsTagged()) ||
22725c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         (instr->is_external() &&
22735c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instr->elements()->representation().IsExternal()));
22748e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
22755c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  LOperand* backing_store = UseRegister(instr->elements());
2276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* val = GetStoreKeyedValueOperand(instr);
22778e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  bool clobbers_key = ExternalArrayOpRequiresTemp(
22788e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      instr->key()->representation(), elements_kind);
22798e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  LOperand* key = clobbers_key
22808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      ? UseTempRegister(instr->key())
22818e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      : UseRegisterOrConstantAtStart(instr->key());
22825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return new(zone()) LStoreKeyed(backing_store, key, val);
22833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
22843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
22853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2286a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2287496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2288496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* object = UseFixed(instr->object(), edx);
2289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LOperand* key = UseFixed(instr->key(), ecx);
2290496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* value = UseFixed(instr->value(), eax);
2291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2292a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->object()->representation().IsTagged());
2293a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->key()->representation().IsTagged());
2294a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(instr->value()->representation().IsTagged());
2295a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2296496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LStoreKeyedGeneric* result =
2297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LStoreKeyedGeneric(context, object, key, value);
2298496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  return MarkAsCall(result, instr);
2299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2301a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2302394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comLInstruction* LChunkBuilder::DoTransitionElementsKind(
2303394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    HTransitionElementsKind* instr) {
2304003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
2305394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* object = UseRegister(instr->object());
2306394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* new_map_reg = TempRegister();
2307394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LOperand* temp_reg = TempRegister();
2308394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    LTransitionElementsKind* result =
230994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org        new(zone()) LTransitionElementsKind(object, NULL,
231094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org                                            new_map_reg, temp_reg);
231194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    return result;
2312d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  } else {
23132f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    LOperand* object = UseFixed(instr->object(), eax);
2314cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org    LOperand* context = UseFixed(instr->context(), esi);
231594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    LTransitionElementsKind* result =
231694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org        new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
23172f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    return MarkAsCall(result, instr);
2318394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
2319394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
2320394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2321394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
232294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento(
232394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    HTrapAllocationMemento* instr) {
232494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* object = UseRegister(instr->object());
232594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp = TempRegister();
232694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LTrapAllocationMemento* result =
232794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org      new(zone()) LTrapAllocationMemento(object, temp);
232894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  return AssignEnvironment(result);
232994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org}
233094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
233194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2332a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
233353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  bool is_in_object = instr->access().IsInobject();
2334d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  bool is_external_location = instr->access().IsExternalMemory() &&
2335d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      instr->access().offset() == 0;
23369e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org  bool needs_write_barrier = instr->NeedsWriteBarrier();
2337594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool needs_write_barrier_for_map = instr->has_transition() &&
233837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org      instr->NeedsWriteBarrierForMap();
2339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2340c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  LOperand* obj;
2341c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (needs_write_barrier) {
234253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    obj = is_in_object
2343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        ? UseRegister(instr->object())
2344c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        : UseTempRegister(instr->object());
2345d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  } else if (is_external_location) {
2346d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    ASSERT(!is_in_object);
2347d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    ASSERT(!needs_write_barrier);
2348d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    ASSERT(!needs_write_barrier_for_map);
2349d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    obj = UseRegisterOrConstant(instr->object());
2350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  } else {
235137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org    obj = needs_write_barrier_for_map
235237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        ? UseRegister(instr->object())
235337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org        : UseRegisterAtStart(instr->object());
2354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2356f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool can_be_constant = instr->value()->IsConstant() &&
2357f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org      HConstant::cast(instr->value())->NotInNewSpace() &&
2358bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org      !instr->field_representation().IsDouble();
2359f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
236077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  LOperand* val;
2361935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  if (instr->field_representation().IsInteger8() ||
2362935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      instr->field_representation().IsUInteger8()) {
236325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    // mov_b requires a byte register (i.e. any of eax, ebx, ecx, edx).
236425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    // Just force the value to be in eax and we're safe here.
236525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org    val = UseFixed(instr->value(), eax);
236625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  } else if (needs_write_barrier) {
236777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    val = UseTempRegister(instr->value());
2368f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  } else if (can_be_constant) {
236977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    val = UseRegisterOrConstant(instr->value());
2370bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  } else if (instr->field_representation().IsSmi()) {
2371f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    val = UseTempRegister(instr->value());
2372bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  } else if (instr->field_representation().IsDouble()) {
2373169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    val = UseRegisterAtStart(instr->value());
237477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  } else {
237577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    val = UseRegister(instr->value());
237677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  }
2377a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2378a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // We only need a scratch register if we have a write barrier or we
2379a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // have a store into the properties array (not in-object-property).
238053ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  LOperand* temp = (!is_in_object || needs_write_barrier ||
238157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                    needs_write_barrier_for_map) ? TempRegister() : NULL;
238237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
238337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  // We need a temporary register for write barrier of the map field.
238437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  LOperand* temp_map = needs_write_barrier_for_map ? TempRegister() : NULL;
2385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2386d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return new(zone()) LStoreNamedField(obj, val, temp, temp_map);
2387a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2388a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2391496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2392496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* object = UseFixed(instr->object(), edx);
2393496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* value = UseFixed(instr->value(), eax);
2394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LStoreNamedGeneric* result =
2396c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LStoreNamedGeneric(context, object, value);
2397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(result, instr);
2398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2400a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2401160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2402ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2403bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  LOperand* left = UseFixed(instr->left(), edx);
2404bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  LOperand* right = UseFixed(instr->right(), eax);
2405c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LStringAdd* string_add = new(zone()) LStringAdd(context, left, right);
2406ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  return MarkAsCall(DefineFixed(string_add, eax), instr);
2407160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org}
2408160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
2409160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
24100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
24114668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  LOperand* string = UseTempRegister(instr->string());
24124668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  LOperand* index = UseTempRegister(instr->index());
2413ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2414c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LStringCharCodeAt* result =
2415c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LStringCharCodeAt(context, string, index);
2416b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
24170a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
24180a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
24190a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
2420b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
2421b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  LOperand* char_code = UseRegister(instr->value());
2422ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseAny(instr->context());
2423c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LStringCharFromCode* result =
2424c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      new(zone()) LStringCharFromCode(context, char_code);
2425b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  return AssignPointerMap(DefineAsRegister(result));
2426b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org}
2427b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
2428b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
242994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
243094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  info()->MarkAsDeferredCalling();
243194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* context = UseAny(instr->context());
2432f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  LOperand* size = instr->size()->IsConstant()
2433f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org      ? UseConstant(instr->size())
2434f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org      : UseTempRegister(instr->size());
243594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp = TempRegister();
243694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LAllocate* result = new(zone()) LAllocate(context, size, temp);
243794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  return AssignPointerMap(DefineAsRegister(result));
243894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org}
243994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
244094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
2442ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(
2444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      DefineFixed(new(zone()) LRegExpLiteral(context), eax), instr);
2445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
2449ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2450c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return MarkAsCall(
2451c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      DefineFixed(new(zone()) LFunctionLiteral(context), eax), instr);
2452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
245633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  ASSERT(argument_count_ == 0);
2457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  allocator_->MarkAsOsrEntry();
2458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_->last_environment()->set_ast_id(instr->ast_id());
2459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return AssignEnvironment(new(zone()) LOsrEntry);
2460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2464a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  LParameter* result = new(zone()) LParameter;
24652f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org  if (instr->kind() == HParameter::STACK_PARAMETER) {
2466a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    int spill_index = chunk()->GetParameterStackSlot(instr->index());
2467a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return DefineAsSpilled(result, spill_index);
2468a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  } else {
2469a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    ASSERT(info()->IsStub());
2470a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    CodeStubInterfaceDescriptor* descriptor =
2471f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org        info()->code_stub()->GetInterfaceDescriptor();
2472ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    int index = static_cast<int>(instr->index());
24730cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    Register reg = descriptor->GetParameterRegister(index);
2474a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return DefineFixed(result, reg);
2475a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
2476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2480c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // Use an index that corresponds to the location in the unoptimized frame,
2481c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  // which the optimized frame will subsume.
2482c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  int env_index = instr->index();
2483c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  int spill_index = 0;
2484c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (instr->environment()->is_parameter_index(env_index)) {
2485c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    spill_index = chunk()->GetParameterStackSlot(env_index);
2486c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  } else {
2487c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    spill_index = env_index - instr->environment()->first_local_index();
2488c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2489c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      Abort(kNotEnoughSpillSlotsForOsr);
2490c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      spill_index = 0;
2491c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
2492c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    if (spill_index == 0) {
2493c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      // The dynamic frame alignment state overwrites the first local.
2494c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      // The first local is saved at the end of the unoptimized frame.
2495c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      spill_index = graph()->osr()->UnoptimizedFrameSlots();
2496c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org    }
249704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
2498c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
2503496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCallStub* result = new(zone()) LCallStub(context);
2505496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
2506a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2507a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2508a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
25103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // There are no real uses of the arguments object.
25113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // arguments.length and element access are supported directly on
25123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // stack arguments, and any real arguments object use causes a bailout.
25133a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // So this value is never used.
2514a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
2515a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2516a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2517a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2518594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
2519662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
25201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2521594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // There are no real uses of a captured object.
2522594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return NULL;
2523594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
2524594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
2525594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
2526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
252777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  info()->MarkAsRequiresFrame();
2528c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* args = UseRegister(instr->arguments());
252977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  LOperand* length;
253077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  LOperand* index;
253177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  if (instr->length()->IsConstant() && instr->index()->IsConstant()) {
253277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    length = UseRegisterOrConstant(instr->length());
253377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    index = UseOrConstant(instr->index());
253477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  } else {
253577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    length = UseTempRegister(instr->length());
253677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    index = Use(instr->index());
253777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  }
2538c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
2539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2542ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2543ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  LOperand* object = UseFixed(instr->value(), eax);
2544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LToFastProperties* result = new(zone()) LToFastProperties(object);
2545ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
2546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
2547ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2548ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2550ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2551ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  LOperand* value = UseAtStart(instr->value());
2552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LTypeof* result = new(zone()) LTypeof(context, value);
2553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr);
2554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
25574f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
2559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2561d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
25624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
25634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    HIsConstructCallAndBranch* instr) {
2564c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return new(zone()) LIsConstructCallAndBranch(TempRegister());
2565d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com}
2566d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2567d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2568a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2569662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
2570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
2571a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2575a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  info()->MarkAsDeferredCalling();
257604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  if (instr->is_function_entry()) {
2577ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    LOperand* context = UseFixed(instr->context(), esi);
2578c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return MarkAsCall(new(zone()) LStackCheck(context), instr);
257904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  } else {
258004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    ASSERT(instr->is_backwards_branch());
2581ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    LOperand* context = UseAny(instr->context());
2582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return AssignEnvironment(
2583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        AssignPointerMap(new(zone()) LStackCheck(context)));
258404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
2585a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
2589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HEnvironment* outer = current_block_->last_environment();
2590f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  outer->set_ast_id(instr->ReturnId());
2591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HConstant* undefined = graph()->GetConstantUndefined();
2592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
2593659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org                                               instr->arguments_count(),
2594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                               instr->function(),
259540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org                                               undefined,
2596e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org                                               instr->inlining_kind());
2597b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  // Only replay binding of arguments object if it wasn't removed from graph.
2598b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
2599b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    inner->Bind(instr->arguments_var(), instr->arguments_object());
26008c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org  }
260156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  inner->set_entry(instr);
2602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_->UpdateEnvironment(inner);
2603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  chunk_->AddInlinedClosure(instr->closure());
2604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return NULL;
2605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
260928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  LInstruction* pop = NULL;
261028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
261128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  HEnvironment* env = current_block_->last_environment();
261228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
261333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (env->entry()->arguments_pushed()) {
261428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    int argument_count = env->arguments_environment()->parameter_count();
261528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    pop = new(zone()) LDrop(argument_count);
2616d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    ASSERT(instr->argument_delta() == -argument_count);
261728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  }
261828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
2619659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  HEnvironment* outer = current_block_->last_environment()->
2620659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org      DiscardInlined(false);
2621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  current_block_->UpdateEnvironment(outer);
262228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  return pop;
2623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2626be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2627be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
2628be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* object = UseFixed(instr->enumerable(), eax);
2629be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
2630be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  return MarkAsCall(DefineFixed(result, eax), instr, CAN_DEOPTIMIZE_EAGERLY);
2631be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2632be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2633be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2634be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
2635be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* map = UseRegister(instr->map());
2636be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  return AssignEnvironment(DefineAsRegister(
2637be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org      new(zone()) LForInCacheArray(map)));
2638be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2639be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2640be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2641be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
2642be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
2643be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* map = UseRegisterAtStart(instr->map());
2644be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
2645be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2646be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2647be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2648be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
2649be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* object = UseRegister(instr->object());
2650be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* index = UseTempRegister(instr->index());
265163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
265263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  LInstruction* result = DefineSameAsFirst(load);
265363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  return AssignPointerMap(result);
2654be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
2655be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2656be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
26571e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
26581e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseRegisterAtStart(instr->context());
26591e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return new(zone()) LStoreFrameContext(context);
26601e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
26611e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26621e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26631e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext(
26641e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    HAllocateBlockContext* instr) {
26651e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context = UseFixed(instr->context(), esi);
26661e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
26671e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LAllocateBlockContext* result =
26681e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      new(zone()) LAllocateBlockContext(context, function);
26691e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return MarkAsCall(DefineFixed(result, esi), instr);
26701e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
26711e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26721e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
2673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} }  // namespace v8::internal
2674c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2675c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#endif  // V8_TARGET_ARCH_IA32
2676