13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
29fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// Redistribution and use in source and binary forms, with or without
39fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// modification, are permitted provided that the following conditions are
49fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// met:
59fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//
69fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//     * Redistributions of source code must retain the above copyright
79fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//       notice, this list of conditions and the following disclaimer.
89fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//     * Redistributions in binary form must reproduce the above
99fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//       copyright notice, this list of conditions and the following
109fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//       disclaimer in the documentation and/or other materials provided
119fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//       with the distribution.
129fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//     * Neither the name of Google Inc. nor the names of its
139fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//       contributors may be used to endorse or promote products derived
149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//       from this software without specific prior written permission.
159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block//
169fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
179fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
199fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
239fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
269fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
28b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#include "v8.h"
29b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
30b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#if defined(V8_TARGET_ARCH_X64)
31b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#include "lithium-allocator-inl.h"
33086aeeaae12517475c22695a200be45495516549Ben Murdoch#include "x64/lithium-x64.h"
34086aeeaae12517475c22695a200be45495516549Ben Murdoch#include "x64/lithium-codegen-x64.h"
359fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
36086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace v8 {
37086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace internal {
389fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
39b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DEFINE_COMPILE(type)                            \
40b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void L##type::CompileToNative(LCodeGen* generator) {  \
41b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    generator->Do##type(this);                          \
42b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
43b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
44b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DEFINE_COMPILE
45b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
46b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOsrEntry::LOsrEntry() {
47b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < Register::kNumAllocatableRegisters; ++i) {
48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    register_spills_[i] = NULL;
49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; ++i) {
51b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    double_register_spills_[i] = NULL;
52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LOsrEntry::MarkSpilledRegister(int allocation_index,
57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                    LOperand* spill_operand) {
58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(spill_operand->IsStackSlot());
59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(register_spills_[allocation_index] == NULL);
60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  register_spills_[allocation_index] = spill_operand;
61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LOsrEntry::MarkSpilledDoubleRegister(int allocation_index,
65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                          LOperand* spill_operand) {
66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(spill_operand->IsDoubleStackSlot());
67b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(double_register_spills_[allocation_index] == NULL);
68b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  double_register_spills_[allocation_index] = spill_operand;
69b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
70b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
71b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LInstruction::VerifyCall() {
74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Call instructions can use only fixed registers as temporaries and
75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // outputs because all registers are blocked by the calling convention.
76257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Inputs operands must use a fixed register or use-at-start policy or
77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // a non-register policy.
781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(Output() == NULL ||
791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         LUnallocated::cast(Output())->HasFixedPolicy() ||
801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         !LUnallocated::cast(Output())->HasRegisterPolicy());
813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (UseIterator it(this); !it.Done(); it.Advance()) {
823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(operand->HasFixedPolicy() ||
84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch           operand->IsUsedAtStart());
851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (TempIterator it(this); !it.Done(); it.Advance()) {
873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
88257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LInstruction::PrintTo(StringStream* stream) {
95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("%s ", this->Mnemonic());
961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  PrintOutputOperandTo(stream);
98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  PrintDataTo(stream);
100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (HasEnvironment()) {
102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" ");
103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    environment()->PrintTo(stream);
104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (HasPointerMap()) {
107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" ");
108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    pointer_map()->PrintTo(stream);
109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int R, int I, int T>
114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) {
115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("= ");
1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (int i = 0; i < inputs_.length(); i++) {
1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (i > 0) stream->Add(" ");
1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[i]->PrintTo(stream);
1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int R, int I, int T>
124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) {
1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (int i = 0; i < results_.length(); i++) {
126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (i > 0) stream->Add(" ");
1273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    results_[i]->PrintTo(stream);
128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLabel::PrintDataTo(StringStream* stream) {
133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LGap::PrintDataTo(stream);
134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLabel* rep = replacement();
135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (rep != NULL) {
136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" Dead block replaced with B%d", rep->block_id());
137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
138b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
139b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LGap::IsRedundant() const {
142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < 4; i++) {
143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return false;
145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return true;
149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
152b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGap::PrintDataTo(StringStream* stream) {
153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < 4; i++) {
154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add("(");
155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[i] != NULL) {
156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      parallel_moves_[i]->PrintDataTo(stream);
157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(") ");
159b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticD::Mnemonic() const {
164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  switch (op()) {
165b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::ADD: return "add-d";
166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::SUB: return "sub-d";
167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MUL: return "mul-d";
168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::DIV: return "div-d";
169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MOD: return "mod-d";
170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    default:
171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      UNREACHABLE();
172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return NULL;
173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticT::Mnemonic() const {
178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  switch (op()) {
179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::ADD: return "add-t";
180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::SUB: return "sub-t";
181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MUL: return "mul-t";
182b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MOD: return "mod-t";
183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::DIV: return "div-t";
1841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_AND: return "bit-and-t";
1851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_OR: return "bit-or-t";
1861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_XOR: return "bit-xor-t";
1871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SHL: return "sal-t";
1881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SAR: return "sar-t";
1891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SHR: return "shr-t";
190b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    default:
191b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      UNREACHABLE();
192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return NULL;
193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGoto::PrintDataTo(StringStream* stream) {
198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("B%d", block_id());
199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
201b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
202b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LBranch::PrintDataTo(StringStream* stream) {
203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
205b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCmpIDAndBranch::PrintDataTo(StringStream* stream) {
209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if ");
210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" %s ", Token::String(op()));
212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(1)->PrintTo(stream);
213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsNilAndBranch::PrintDataTo(StringStream* stream) {
218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if ");
219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(kind() == kStrictEquality ? " === " : " == ");
2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(nil() == kNullValue ? "null" : "undefined");
222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if is_object(");
228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_string(");
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if is_smi(");
242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
247257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
248257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("if is_undetectable(");
249257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  InputAt(0)->PrintTo(stream);
250257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
252257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if string_compare(");
2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(1)->PrintTo(stream);
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if has_instance_type(");
264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
265b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
268b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
269b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if has_cached_array_index(");
271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
273b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
274b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
275b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
276b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if class_of_test(");
278b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
279b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(", \"%o\") then B%d else B%d",
280b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              *hydrogen()->class_name(),
281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              true_block_id(),
282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              false_block_id());
283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
287b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if typeof ");
288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
289b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" == \"%s\" then B%d else B%d",
290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              *hydrogen()->type_literal()->ToCString(),
291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              true_block_id(), false_block_id());
292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
295b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallConstantFunction::PrintDataTo(StringStream* stream) {
296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("#%d / ", arity());
297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
300b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LUnaryMathOperation::PrintDataTo(StringStream* stream) {
301b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("/%s ", hydrogen()->OpName());
302b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
3071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  InputAt(0)->PrintTo(stream);
3081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d]", slot_index());
309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
311b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  InputAt(0)->PrintTo(stream);
314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[%d] <- ", slot_index());
315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  InputAt(1)->PrintTo(stream);
316e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("= ");
321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  InputAt(0)->PrintTo(stream);
322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" #%d / ", arity());
323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallKeyed::PrintDataTo(StringStream* stream) {
327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[rcx] #%d / ", arity());
328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
330b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
331b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallNamed::PrintDataTo(StringStream* stream) {
332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  SmartArrayPointer<char> name_string = name()->ToCString();
333b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("%s #%d / ", *name_string, arity());
334b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
335b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
336b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
337b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallGlobal::PrintDataTo(StringStream* stream) {
338589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  SmartArrayPointer<char> name_string = name()->ToCString();
339b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("%s #%d / ", *name_string, arity());
340b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
341b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
342b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
343b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallKnownGlobal::PrintDataTo(StringStream* stream) {
344b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("#%d / ", arity());
345b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LCallNew::PrintDataTo(StringStream* stream) {
349b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("= ");
350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  InputAt(0)->PrintTo(stream);
351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" #%d / ", arity());
352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
355b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  arguments()->PrintTo(stream);
357b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
358b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" length ");
359b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  length()->PrintTo(stream);
360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
361b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" index ");
362b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  index()->PrintTo(stream);
363b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
364b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
365b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
366b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::GetNextSpillIndex(bool is_double) {
367b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return spill_slot_count_++;
368b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
369b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
370b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3711e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLOperand* LChunk::GetNextSpillSlot(bool is_double) {
372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // All stack slots are Double stack slots on x64.
373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Alternatively, at some point, start using half-size
374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // stack slots for int32 values.
375b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int index = GetNextSpillIndex(is_double);
376b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (is_double) {
377b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return LDoubleStackSlot::Create(index);
378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return LStackSlot::Create(index);
380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
381b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
382b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
383b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
384b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunk::MarkEmptyBlocks() {
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhase phase("L_Mark empty blocks", this);
386b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < graph()->blocks()->length(); ++i) {
387b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* block = graph()->blocks()->at(i);
388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    int first = block->first_instruction_index();
389b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    int last = block->last_instruction_index();
390b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LInstruction* first_instr = instructions()->at(first);
391b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LInstruction* last_instr = instructions()->at(last);
392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
393b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LLabel* label = LLabel::cast(first_instr);
394b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (last_instr->IsGoto()) {
395b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LGoto* goto_instr = LGoto::cast(last_instr);
3963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      if (label->IsRedundant() &&
397b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          !label->is_loop_header()) {
398b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        bool can_eliminate = true;
399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        for (int i = first + 1; i < last && can_eliminate; ++i) {
400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          LInstruction* cur = instructions()->at(i);
401b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          if (cur->IsGap()) {
402b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch            LGap* gap = LGap::cast(cur);
403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch            if (!gap->IsRedundant()) {
404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              can_eliminate = false;
405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch            }
406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          } else {
407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch            can_eliminate = false;
408b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          }
409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        }
410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        if (can_eliminate) {
412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          label->set_replacement(GetLabel(goto_instr->block_id()));
413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        }
414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      }
415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintTo(stream);
422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(".");
423e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(" <- ");
425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintTo(stream);
426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
430b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  object()->PrintTo(stream);
431b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(".");
432b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(*String::cast(*name())->ToCString());
433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" <- ");
434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  value()->PrintTo(stream);
435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
437b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintTo(stream);
440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintTo(stream);
442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("] <- ");
443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintTo(stream);
444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
445e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
4483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elements()->PrintTo(stream);
4493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("[");
4503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  key()->PrintTo(stream);
4513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("] <- ");
4523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  value()->PrintTo(stream);
4533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
4543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  object()->PrintTo(stream);
458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("[");
459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  key()->PrintTo(stream);
460b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("] <- ");
461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  value()->PrintTo(stream);
462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) {
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstructionGap* gap = new(graph_->zone()) LInstructionGap(block);
473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int index = -1;
474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (instr->IsControl()) {
475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instructions_.Add(gap);
476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    index = instructions_.length();
477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instructions_.Add(instr);
478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    index = instructions_.length();
480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instructions_.Add(instr);
481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instructions_.Add(gap);
482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (instr->HasPointerMap()) {
484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    pointer_maps_.Add(instr->pointer_map());
485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instr->pointer_map()->set_lithium_position(index);
486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLConstantOperand* LChunk::DefineConstantOperand(HConstant* constant) {
491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return LConstantOperand::Create(constant->id());
492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::GetParameterStackSlot(int index) const {
496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // The receiver is at index 0, the first parameter at index 1, so we
497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // shift all parameter indexes down by the number of parameters, and
498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // make sure they end up negative so they are distinguishable from
499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // spill slots.
500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int result = index - info()->scope()->num_parameters() - 1;
501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(result < 0);
502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return result;
503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// A parameter relative to ebp in the arguments stub.
506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::ParameterAt(int index) {
507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(-1 <= index);  // -1 is the receiver.
508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return (1 + info()->scope()->num_parameters() - index) *
509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      kPointerSize;
510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLGap* LChunk::GetGapAt(int index) const {
514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return LGap::cast(instructions_[index]);
515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LChunk::IsGapAt(int index) const {
519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instructions_[index]->IsGap();
520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint LChunk::NearestGapPos(int index) const {
524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  while (!IsGapAt(index)) index--;
525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return index;
526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunk::AddGapMove(int index, LOperand* from, LOperand* to) {
530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  GetGapAt(index)->GetOrCreateParallelMove(LGap::START)->AddMove(from, to);
531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochHandle<Object> LChunk::LookupLiteral(LConstantOperand* operand) const {
535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return HConstant::cast(graph_->LookupValue(operand->index()))->handle();
536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
538b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
539b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochRepresentation LChunk::LookupLiteralRepresentation(
540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LConstantOperand* operand) const {
541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return graph_->LookupValue(operand->index())->representation();
542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
545086aeeaae12517475c22695a200be45495516549Ben MurdochLChunk* LChunkBuilder::Build() {
546086aeeaae12517475c22695a200be45495516549Ben Murdoch  ASSERT(is_unused());
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  chunk_ = new(zone()) LChunk(info(), graph());
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhase phase("L_Building chunk", chunk_);
549086aeeaae12517475c22695a200be45495516549Ben Murdoch  status_ = BUILDING;
550086aeeaae12517475c22695a200be45495516549Ben Murdoch  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
551086aeeaae12517475c22695a200be45495516549Ben Murdoch  for (int i = 0; i < blocks->length(); i++) {
552086aeeaae12517475c22695a200be45495516549Ben Murdoch    HBasicBlock* next = NULL;
553086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (i < blocks->length() - 1) next = blocks->at(i + 1);
554086aeeaae12517475c22695a200be45495516549Ben Murdoch    DoBasicBlock(blocks->at(i), next);
555086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (is_aborted()) return NULL;
556086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
557086aeeaae12517475c22695a200be45495516549Ben Murdoch  status_ = DONE;
558086aeeaae12517475c22695a200be45495516549Ben Murdoch  return chunk_;
5599fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
5609fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
5619fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
562086aeeaae12517475c22695a200be45495516549Ben Murdochvoid LChunkBuilder::Abort(const char* format, ...) {
563086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (FLAG_trace_bailout) {
564589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    SmartArrayPointer<char> name(
565589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch        info()->shared_info()->DebugName()->ToCString());
566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    PrintF("Aborting LChunk building in @\"%s\": ", *name);
567086aeeaae12517475c22695a200be45495516549Ben Murdoch    va_list arguments;
568086aeeaae12517475c22695a200be45495516549Ben Murdoch    va_start(arguments, format);
569086aeeaae12517475c22695a200be45495516549Ben Murdoch    OS::VPrint(format, arguments);
570086aeeaae12517475c22695a200be45495516549Ben Murdoch    va_end(arguments);
571086aeeaae12517475c22695a200be45495516549Ben Murdoch    PrintF("\n");
5729fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
573086aeeaae12517475c22695a200be45495516549Ben Murdoch  status_ = ABORTED;
5749fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
5759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
576086aeeaae12517475c22695a200be45495516549Ben Murdoch
577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  Register::ToAllocationIndex(reg));
580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) {
5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  XMMRegister::ToAllocationIndex(reg));
586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value, ToUnallocated(fixed_register));
591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
593b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
594b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) {
595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value, ToUnallocated(reg));
596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) {
6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value,
6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
607b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                              LUnallocated::USED_AT_START));
608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value) {
6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
621b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) {
6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                     LUnallocated::USED_AT_START));
624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : Use(value);
631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
634b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseAtStart(value);
638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
641b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
642b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
643b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseRegister(value);
645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
649b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
650b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
651b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseRegisterAtStart(value);
652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
653b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
654b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
655b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAny(HValue* value) {
656b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
660b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
661b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
663b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (value->EmitAtUses()) {
664b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HInstruction* instr = HInstruction::cast(value);
665b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    VisitInstruction(instr);
666b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(value->id());
668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
669b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
670b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
671b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
672b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T>
673b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr,
674b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                    LUnallocated* result) {
6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result->set_virtual_register(current_instruction_->id());
676b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  instr->set_result(result);
677b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
678b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
679b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
680b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
681b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T>
682b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsRegister(
683b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LTemplateInstruction<1, I, T>* instr) {
6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T>
690b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsSpilled(
691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LTemplateInstruction<1, I, T>* instr,
692b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    int index) {
6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
696b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
697b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
698b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T>
699b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineSameAsFirst(
700b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LTemplateInstruction<1, I, T>* instr) {
7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
7023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
703b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
704b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
705b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
706b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T>
707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixed(LTemplateInstruction<1, I, T>* instr,
708b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                         Register reg) {
709b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Define(instr, ToUnallocated(reg));
710b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
711b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
712b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
713b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochtemplate<int I, int T>
714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixedDouble(
715b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LTemplateInstruction<1, I, T>* instr,
716b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    XMMRegister reg) {
717b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Define(instr, ToUnallocated(reg));
718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
719b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
720b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
721b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
722b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HEnvironment* hydrogen_env = current_block_->last_environment();
7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int argument_index_accumulator = 0;
7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->set_environment(CreateEnvironment(hydrogen_env,
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           &argument_index_accumulator));
726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
730b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment(
731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LInstruction* instr, int ast_id) {
7321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instruction_pending_deoptimization_environment_ == NULL);
733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber);
7341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instruction_pending_deoptimization_environment_ = instr;
735b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  pending_deoptimization_ast_id_ = ast_id;
736b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
738b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() {
7411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instruction_pending_deoptimization_environment_ = NULL;
742b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  pending_deoptimization_ast_id_ = AstNode::kNoNumber;
743b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
745b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
746b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
747b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                        HInstruction* hinstr,
748b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                        CanDeoptimize can_deoptimize) {
7491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
7501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->VerifyCall();
7511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
7521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->MarkAsCall();
753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  instr = AssignPointerMap(instr);
754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hinstr->HasObservableSideEffects()) {
756b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(hinstr->next()->IsSimulate());
757b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HSimulate* sim = HSimulate::cast(hinstr->next());
758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instr = SetInstructionPendingDeoptimizationEnvironment(
759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        instr, sim->ast_id());
760b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
761b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
762b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // If instruction does not have side-effects lazy deoptimization
763b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // after the call will try to deoptimize to the point before the call.
764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Thus we still need to attach environment to this call even if
765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // call sequence can not deoptimize eagerly.
766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool needs_environment =
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !hinstr->HasObservableSideEffects();
769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (needs_environment && !instr->HasEnvironment()) {
770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instr = AssignEnvironment(instr);
771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
772b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) {
7781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->MarkAsSaveDoubles();
779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(!instr->HasPointerMap());
7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->set_pointer_map(new(zone()) LPointerMap(position_));
786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::TempRegister() {
7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand =
7923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
7933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(allocator_->GetVirtualRegister());
7943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!allocator_->AllocationOk()) Abort("Not enough virtual registers.");
795b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
797b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
798b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
799b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) {
800b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* operand = ToUnallocated(reg);
8013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(operand->HasFixedPolicy());
802b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
803b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
804b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
805b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
806b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) {
807b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* operand = ToUnallocated(reg);
8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(operand->HasFixedPolicy());
809b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
810b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
811b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
812b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LLabel(instr->block());
815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
817b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoSoftDeoptimize(HSoftDeoptimize* instr) {
8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
8203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
8213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
826b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8281e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoShift(Token::Value op,
8291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                     HBitwiseBinaryOperation* instr) {
8301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (instr->representation().IsTagged()) {
8311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->left()->representation().IsTagged());
8321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->right()->representation().IsTagged());
8331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
8341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* left = UseFixed(instr->left(), rdx);
8351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* right = UseFixed(instr->right(), rax);
8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LArithmeticT* result = new(zone()) LArithmeticT(op, left, right);
8371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return MarkAsCall(DefineFixed(result, rax), instr);
8381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
8391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
8401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->representation().IsInteger32());
8413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->left()->representation().IsInteger32());
8423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->right()->representation().IsInteger32());
8433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
8441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
8453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right_value = instr->right();
8461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* right = NULL;
8471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int constant_value = 0;
8481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (right_value->IsConstant()) {
8491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    HConstant* constant = HConstant::cast(right_value);
8501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    right = chunk_->DefineConstantOperand(constant);
8511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    constant_value = constant->Integer32Value() & 0x1f;
8521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
8531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    right = UseFixed(right_value, rcx);
8541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
8551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
856257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Shift operations can only deoptimize if we do a logical shift by 0 and
857257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // the result cannot be truncated to int32.
858257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool may_deopt = (op == Token::SHR && constant_value == 0);
859257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool does_deopt = false;
860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (may_deopt) {
861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
862257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) {
863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        does_deopt = true;
8641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        break;
8651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
8661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
8671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
8681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LInstruction* result =
8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt));
871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return does_deopt ? AssignEnvironment(result) : result;
872b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
875b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                           HArithmeticBinaryOperation* instr) {
877e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->representation().IsDouble());
878e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->left()->representation().IsDouble());
879e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->right()->representation().IsDouble());
880e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(op != Token::MOD);
881e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* right = UseRegisterAtStart(instr->right());
8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return DefineSameAsFirst(result);
885b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
886b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
887b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
888b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
889b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                           HArithmeticBinaryOperation* instr) {
890b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(op == Token::ADD ||
891b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch         op == Token::DIV ||
892b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch         op == Token::MOD ||
893b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch         op == Token::MUL ||
894b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch         op == Token::SUB);
895b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* left = instr->left();
896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* right = instr->right();
897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(left->representation().IsTagged());
898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(right->representation().IsTagged());
899b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* left_operand = UseFixed(left, rdx);
900b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* right_operand = UseFixed(right, rax);
9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticT* result =
9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LArithmeticT(op, left_operand, right_operand);
903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
904b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
905b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
906b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
908b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(is_building());
909b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_block_ = block;
910b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  next_block_ = next_block;
911b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (block->IsStartBlock()) {
912b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(graph_->start_environment());
913b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = 0;
914b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (block->predecessors()->length() == 1) {
915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // We have a single predecessor => copy environment and outgoing
916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // argument count from the predecessor.
917b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(block->phis()->length() == 0);
918b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
919b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HEnvironment* last_environment = pred->last_environment();
920b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(last_environment != NULL);
921b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Only copy the environment, if it is later used again.
922b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (pred->end()->SecondSuccessor() == NULL) {
923b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ASSERT(pred->end()->FirstSuccessor() == block);
924b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    } else {
925b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
926b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
927b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        last_environment = last_environment->Copy();
928b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      }
929b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
930b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(last_environment);
931b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(pred->argument_count() >= 0);
932b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = pred->argument_count();
933b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
934b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // We are at a state join => process phis.
935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // No need to copy the environment, it cannot be used later.
937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HEnvironment* last_environment = pred->last_environment();
938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    for (int i = 0; i < block->phis()->length(); ++i) {
939b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      HPhi* phi = block->phis()->at(i);
940b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      last_environment->SetValueAt(phi->merged_index(), phi);
941b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
942b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      last_environment->SetValueAt(block->deleted_phis()->at(i),
944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                   graph_->GetConstantUndefined());
945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
946b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(last_environment);
947b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Pick up the outgoing argument count of one of the predecessors.
948b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = pred->argument_count();
949b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HInstruction* current = block->first();
951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int start = chunk_->instructions()->length();
952b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  while (current != NULL && !is_aborted()) {
953b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Code for constants in registers is generated lazily.
954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (!current->EmitAtUses()) {
955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      VisitInstruction(current);
956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    current = current->next();
958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int end = chunk_->instructions()->length() - 1;
960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (end >= start) {
961b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->set_first_instruction_index(start);
962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->set_last_instruction_index(end);
963b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
964b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  block->set_argument_count(argument_count_);
965b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  next_block_ = NULL;
966b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_block_ = NULL;
967b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
968b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
969b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HInstruction* old_current = current_instruction_;
972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_instruction_ = current;
973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (current->has_position()) position_ = current->position();
974b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* instr = current->CompileToLithium(this);
975b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (instr != NULL) {
977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      instr = AssignPointerMap(instr);
979b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
980b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (FLAG_stress_environments && !instr->HasEnvironment()) {
981b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      instr = AssignEnvironment(instr);
982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
9833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    instr->set_hydrogen_value(current);
9841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    chunk_->AddInstruction(instr, current_block_);
985b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
986b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_instruction_ = old_current;
987b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLEnvironment* LChunkBuilder::CreateEnvironment(
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HEnvironment* hydrogen_env,
9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int* argument_index_accumulator) {
993b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (hydrogen_env == NULL) return NULL;
994b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* outer =
9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
997b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int ast_id = hydrogen_env->ast_id();
9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(ast_id != AstNode::kNoNumber ||
9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         hydrogen_env->frame_type() != JS_FUNCTION);
1000b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int value_count = hydrogen_env->length();
10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* result = new(zone()) LEnvironment(
10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hydrogen_env->closure(),
10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hydrogen_env->frame_type(),
10043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ast_id,
10053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hydrogen_env->parameter_count(),
10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      argument_count_,
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      value_count,
10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      outer);
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int argument_index = *argument_index_accumulator;
1010b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < value_count; ++i) {
1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (hydrogen_env->is_special_index(i)) continue;
1012257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1013b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HValue* value = hydrogen_env->values()->at(i);
1014b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LOperand* op = NULL;
1015b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (value->IsArgumentsObject()) {
1016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      op = NULL;
1017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    } else if (value->IsPushArgument()) {
10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      op = new(zone()) LArgument(argument_index++);
1019b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    } else {
1020b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      op = UseAny(value);
1021b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
1022b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    result->AddValue(op, value->representation());
1023b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1024b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hydrogen_env->frame_type() == JS_FUNCTION) {
10263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    *argument_index_accumulator = argument_index;
10273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return result;
1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1032b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1033b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LGoto(instr->FirstSuccessor()->block_id());
1035b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1036b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1037b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10383fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
10393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
10403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value->EmitAtUses()) {
10413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(value->IsConstant());
10423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(!value->representation().IsDouble());
10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* successor = HConstant::cast(value)->ToBoolean()
1044257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        ? instr->FirstSuccessor()
1045257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        : instr->SecondSuccessor();
10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone()) LGoto(successor->block_id());
1047c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  }
10483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LBranch* result = new(zone()) LBranch(UseRegister(value));
10503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Tagged values that are not known smis or booleans require a
10513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // deoptimization environment.
10523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation rep = value->representation();
10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HType type = value->type();
10543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) {
10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(result);
10563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return result;
1058b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1059b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1060b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10611e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
10621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->value()->representation().IsTagged());
10631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
10643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpMapAndBranch(value);
1065b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1066b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1067b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1068b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value())));
1070b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1071b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1072b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1073b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsElements);
1075b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1076b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1077b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1078b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
1079e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* left = UseFixed(instr->left(), rax);
1080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* right = UseFixed(instr->right(), rdx);
10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstanceOf* result = new(zone()) LInstanceOf(left, right);
1082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1083b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1084b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1085b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1086b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1087b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HInstanceOfKnownGlobal* instr) {
1088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LInstanceOfKnownGlobal* result =
10893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(), rax),
10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         FixedTemp(rdi));
1091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1092b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1093b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
10963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseRegister(instr->receiver());
10973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseRegisterAtStart(instr->function());
10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineSameAsFirst(result));
11003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* receiver = UseFixed(instr->receiver(), rax);
1106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* length = UseFixed(instr->length(), rbx);
1107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* elements = UseFixed(instr->elements(), rcx);
11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LApplyArguments* result = new(zone()) LApplyArguments(function,
1109e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                receiver,
1110e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                length,
1111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                elements);
1112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
1113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
11171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ++argument_count_;
11181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* argument = UseOrConstant(instr->argument());
11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LPushArgument(argument);
11201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
11211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses()
11253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? NULL
11263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : DefineAsRegister(new(zone()) LThisFunction);
11273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
11283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11301e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoContext(HContext* instr) {
11313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses() ? NULL : DefineAsRegister(new(zone()) LContext);
11321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
11331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11351e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) {
1136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
11373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LOuterContext(context));
11383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(new(zone()) LDeclareGlobals, instr);
1143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) {
11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGlobalObject);
1148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) {
115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* global_object = UseRegisterAtStart(instr->value());
11533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGlobalReceiver(global_object));
1154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallConstantFunction(
1158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HCallConstantFunction* instr) {
11591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
11603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, rax), instr);
1161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  argument_count_ -= instr->argument_count();
11673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInvokeFunction* result = new(zone()) LInvokeFunction(function);
1168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  BuiltinFunctionId op = instr->op();
11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (op == kMathLog || op == kMathSin || op == kMathCos || op == kMathTan) {
1175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    LOperand* input = UseFixedDouble(instr->value(), xmm1);
11763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input);
1177e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
1178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1179e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    LOperand* input = UseRegisterAtStart(instr->value());
11803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input);
1181e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    switch (op) {
1182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case kMathAbs:
1183e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
1184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case kMathFloor:
1185e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        return AssignEnvironment(DefineAsRegister(result));
1186e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case kMathRound:
1187e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        return AssignEnvironment(DefineAsRegister(result));
1188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case kMathSqrt:
1189e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        return DefineSameAsFirst(result);
1190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      case kMathPowHalf:
1191e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        return DefineSameAsFirst(result);
1192e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      default:
1193e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        UNREACHABLE();
1194e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        return NULL;
1195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
1196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) {
1201e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->key()->representation().IsTagged());
1202e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* key = UseFixed(instr->key(), rcx);
1203e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  argument_count_ -= instr->argument_count();
12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCallKeyed* result = new(zone()) LCallKeyed(key);
1205e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) {
12101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallNamed, rax), instr);
1212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) {
12161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, rax), instr);
1218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) {
12221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, rax), instr);
1224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
12281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* constructor = UseFixed(instr->constructor(), rdi);
12291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
12303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCallNew* result = new(zone()) LCallNew(constructor);
12311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return MarkAsCall(DefineFixed(result, rax), instr);
1232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  argument_count_ -= instr->argument_count();
12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCallFunction* result = new(zone()) LCallFunction(function);
1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
12441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, rax), instr);
1246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) {
12501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return DoShift(Token::SHR, instr);
1251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) {
12551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return DoShift(Token::SAR, instr);
1256b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1257b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1258b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1259b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) {
12601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return DoShift(Token::SHL, instr);
1261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsInteger32()) {
12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(new(zone()) LBitI(left, right));
12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->representation().IsTagged());
12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsTagged());
12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsTagged());
12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseFixed(instr->left(), rdx);
12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseFixed(instr->right(), rax);
12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LArithmeticT* result = new(zone()) LArithmeticT(instr->op(), left, right);
12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixed(result, rax), instr);
12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
12861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->value()->representation().IsInteger32());
12871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->representation().IsInteger32());
12881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* input = UseRegisterAtStart(instr->value());
12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LBitNotI* result = new(zone()) LBitNotI(input);
12901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return DefineSameAsFirst(result);
1291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
12951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (instr->representation().IsDouble()) {
12961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::DIV, instr);
12971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsInteger32()) {
12981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The temporary operand is necessary to ensure that right is not allocated
12991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // into rdx.
13001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* temp = FixedTemp(rdx);
13011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* dividend = UseFixed(instr->left(), rax);
13021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* divisor = UseRegister(instr->right());
13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LDivI* result = new(zone()) LDivI(dividend, divisor, temp);
13041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return AssignEnvironment(DefineFixed(result, rax));
13051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
13061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->representation().IsTagged());
13071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::DIV, instr);
13081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1311b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1312b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (instr->representation().IsInteger32()) {
1314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
1315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    LInstruction* result;
131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (instr->HasPowerOf2Divisor()) {
131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      ASSERT(!instr->CheckFlag(HValue::kCanBeDivByZero));
132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      LOperand* value = UseRegisterAtStart(instr->left());
13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LModI* mod =
13223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          new(zone()) LModI(value, UseOrConstant(instr->right()), NULL);
132344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      result = DefineSameAsFirst(mod);
132444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
132544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      // The temporary operand is necessary to ensure that right is not
132644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      // allocated into edx.
132744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      LOperand* temp = FixedTemp(rdx);
132844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      LOperand* value = UseFixed(instr->left(), rax);
132944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      LOperand* divisor = UseRegister(instr->right());
13303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LModI* mod = new(zone()) LModI(value, divisor, temp);
133144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      result = DefineFixed(mod, rdx);
133244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1334e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return (instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch            instr->CheckFlag(HValue::kCanBeDivByZero))
1336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        ? AssignEnvironment(result)
1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        : result;
1338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else if (instr->representation().IsTagged()) {
1339e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return DoArithmeticT(Token::MOD, instr);
1340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(instr->representation().IsDouble());
1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // We call a C function for double modulo. It can't trigger a GC.
1343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // We need to use fixed result register for the call.
1344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // TODO(fschneider): Allow any register as input registers.
1345e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    LOperand* left = UseFixedDouble(instr->left(), xmm2);
1346e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    LOperand* right = UseFixedDouble(instr->right(), xmm1);
13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(Token::MOD, left, right);
1348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
1349e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) {
13541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (instr->representation().IsInteger32()) {
13551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->left()->representation().IsInteger32());
13561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->right()->representation().IsInteger32());
13571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
13581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* right = UseOrConstant(instr->MostConstantOperand());
13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LMulI* mul = new(zone()) LMulI(left, right);
13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kCanOverflow) ||
13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AssignEnvironment(mul);
13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(mul);
13651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsDouble()) {
13661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::MUL, instr);
13671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->representation().IsTagged());
13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::MUL, instr);
13701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1371b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) {
13751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (instr->representation().IsInteger32()) {
13761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->left()->representation().IsInteger32());
13771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->right()->representation().IsInteger32());
13781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* left = UseRegisterAtStart(instr->left());
13791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* right = UseOrConstantAtStart(instr->right());
13803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LSubI* sub = new(zone()) LSubI(left, right);
13811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LInstruction* result = DefineSameAsFirst(sub);
13821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (instr->CheckFlag(HValue::kCanOverflow)) {
13831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      result = AssignEnvironment(result);
13841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
13851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return result;
13861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsDouble()) {
13871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::SUB, instr);
13881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
13891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->representation().IsTagged());
13901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::SUB, instr);
13911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1393b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1394b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1395b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1396b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (instr->representation().IsInteger32()) {
1397b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(instr->left()->representation().IsInteger32());
1398b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(instr->right()->representation().IsInteger32());
1399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
1400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
1402b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LInstruction* result = DefineSameAsFirst(add);
1403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (instr->CheckFlag(HValue::kCanOverflow)) {
1404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      result = AssignEnvironment(result);
1405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
1406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return result;
1407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (instr->representation().IsDouble()) {
1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return DoArithmeticD(Token::ADD, instr);
1409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
1410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(instr->representation().IsTagged());
1411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return DoArithmeticT(Token::ADD, instr);
1412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->representation().IsDouble());
1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // We call a C function for double power. It can't trigger a GC.
1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // We need to use fixed result register for the call.
1421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Representation exponent_type = instr->right()->representation();
1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->left()->representation().IsDouble());
1423e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* left = UseFixedDouble(instr->left(), xmm2);
1424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* right = exponent_type.IsDouble() ?
1425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      UseFixedDouble(instr->right(), xmm1) :
1426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#ifdef _WIN64
1427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      UseFixed(instr->right(), rdx);
1428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#else
1429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      UseFixed(instr->right(), rdi);
1430e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif
14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LPower* result = new(zone()) LPower(left, right);
14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, xmm3), instr,
1433e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                    CAN_DEOPTIMIZE_EAGERLY);
1434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRandom(HRandom* instr) {
14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsDouble());
14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->global_object()->representation().IsTagged());
14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef _WIN64
14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* global_object = UseFixed(instr->global_object(), rcx);
14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#else
14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* global_object = UseFixed(instr->global_object(), rdi);
14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LRandom* result = new(zone()) LRandom(global_object);
14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
14473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14503fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
14513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->left()->representation().IsTagged());
14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->right()->representation().IsTagged());
14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
14553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCmpT* result = new(zone()) LCmpT(left, right);
14563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
14573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
14583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareIDAndBranch(
14613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HCompareIDAndBranch* instr) {
14621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation r = instr->GetInputRepresentation();
14631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (r.IsInteger32()) {
14641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->left()->representation().IsInteger32());
14651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->right()->representation().IsInteger32());
14663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
14671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* right = UseOrConstantAtStart(instr->right());
14683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone()) LCmpIDAndBranch(left, right);
14693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } else {
14703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(r.IsDouble());
14711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->left()->representation().IsDouble());
14721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(instr->right()->representation().IsDouble());
14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left;
14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right;
14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->left()->IsConstant() && instr->right()->IsConstant()) {
14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterOrConstantAtStart(instr->left());
14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      right = UseRegisterOrConstantAtStart(instr->right());
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterAtStart(instr->left());
14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      right = UseRegisterAtStart(instr->right());
14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone()) LCmpIDAndBranch(left, right);
14831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
14873fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
14883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HCompareObjectEqAndBranch* instr) {
14891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* left = UseRegisterAtStart(instr->left());
14901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* right = UseRegisterAtStart(instr->right());
14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpObjectEqAndBranch(left, right);
1492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
14953fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareConstantEqAndBranch(
14963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HCompareConstantEqAndBranch* instr) {
14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpConstantEqAndBranch(value);
1499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsNilAndBranch(HIsNilAndBranch* instr) {
15031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->value()->representation().IsTagged());
15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = instr->kind() == kStrictEquality ? NULL : TempRegister();
15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsNilAndBranch(UseRegisterAtStart(instr->value()), temp);
1506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15093fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->value()->representation().IsTagged());
15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()));
15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsStringAndBranch(value, temp);
1520592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1521592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1522592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
15233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
15241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->value()->representation().IsTagged());
15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
15303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HIsUndetectableAndBranch* instr) {
1531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(instr->value()->representation().IsTagged());
15323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
15333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsUndetectableAndBranch(value, temp);
15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch(
15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStringCompareAndBranch* instr) {
15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->left()->representation().IsTagged());
15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->right()->representation().IsTagged());
15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
15443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
15453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCompareAndBranch* result =
15463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LStringCompareAndBranch(left, right);
15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
1549592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1550592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1551592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
15523fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
15533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HHasInstanceTypeAndBranch* instr) {
1554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasInstanceTypeAndBranch(value);
1557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1560e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1561e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    HGetCachedArrayIndex* instr)  {
1562e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
1563e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
1566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15693fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
15703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HHasCachedArrayIndexAndBranch* instr) {
1571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasCachedArrayIndexAndBranch(value);
1574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15773fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
15783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HClassOfTestAndBranch* instr) {
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegister(instr->value());
15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LClassOfTestAndBranch(value,
15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister(),
15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister());
1583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1584b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1585b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) {
15871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* array = UseRegisterAtStart(instr->value());
15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LJSArrayLength(array));
1589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
159269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochLInstruction* LChunkBuilder::DoFixedArrayBaseLength(
159369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    HFixedArrayBaseLength* instr) {
15941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* array = UseRegisterAtStart(instr->value());
15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array));
1596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15993fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoElementsKind(HElementsKind* instr) {
16003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* object = UseRegisterAtStart(instr->value());
16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LElementsKind(object));
16023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) {
1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* object = UseRegister(instr->value());
16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LValueOf* result = new(zone()) LValueOf(object);
16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineSameAsFirst(result);
16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->value(), rax);
16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LDateField* result = new LDateField(object, instr->index());
16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
16165d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}
16175d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
16185d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
1619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterOrConstantAtStart(instr->index());
16213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length = Use(instr->length());
16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LBoundsCheck(value, length));
16231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
16241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16261e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
16271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The control instruction marking the end of a block that completed
16281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // abruptly (e.g., threw an exception).  There is nothing specific to do.
1629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
16341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseFixed(instr->value(), rax);
16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(new(zone()) LThrow(value), instr);
1636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16393fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
16403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return NULL;
16413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1644257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1645257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // All HForceRepresentation instructions should be eliminated in the
1646257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // representation change phase of Hydrogen.
1647257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UNREACHABLE();
1648257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return NULL;
1649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1650257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) {
16531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation from = instr->from();
16541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation to = instr->to();
16551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (from.IsTagged()) {
16561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsDouble()) {
16571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* value = UseRegister(instr->value());
16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberUntagD* res = new(zone()) LNumberUntagD(value);
16591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      return AssignEnvironment(DefineAsRegister(res));
16601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
16611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ASSERT(to.IsInteger32());
16621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* value = UseRegister(instr->value());
16631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      bool needs_check = !instr->value()->type().IsSmi();
16641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      if (needs_check) {
16653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        bool truncating = instr->CanTruncateToInt32();
16663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1);
16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LTaggedToI* res = new(zone()) LTaggedToI(value, xmm_temp);
16681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        return AssignEnvironment(DefineSameAsFirst(res));
16691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      } else {
16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return DefineSameAsFirst(new(zone()) LSmiUntag(value, needs_check));
16711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
16721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
16731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (from.IsDouble()) {
16741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsTagged()) {
16751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* value = UseRegister(instr->value());
16761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* temp = TempRegister();
16771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      // Make sure that temp and result_temp are different registers.
16791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LUnallocated* result_temp = TempRegister();
16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberTagD* result = new(zone()) LNumberTagD(value, temp);
16811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      return AssignPointerMap(Define(result, result_temp));
16821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
16831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ASSERT(to.IsInteger32());
1684e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      LOperand* value = UseRegister(instr->value());
16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return AssignEnvironment(DefineAsRegister(new(zone()) LDoubleToI(value)));
16861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
16871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (from.IsInteger32()) {
16881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsTagged()) {
16891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      HValue* val = instr->value();
16901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* value = UseRegister(val);
16911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      if (val->HasRange() && val->range()->IsInSmiRange()) {
16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return DefineSameAsFirst(new(zone()) LSmiTag(value));
16931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      } else {
16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LNumberTagI* result = new(zone()) LNumberTagI(value);
16951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        return AssignEnvironment(AssignPointerMap(DefineSameAsFirst(result)));
16961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
16971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
16981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ASSERT(to.IsDouble());
16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = Use(instr->value());
17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return DefineAsRegister(new(zone()) LInteger32ToDouble(value));
17011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
17021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
17031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  UNREACHABLE();
1704b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1705b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1706b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1708b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) {
17091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckNonSmi(value));
1711b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1712b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1713b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
17151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCheckInstanceType* result = new(zone()) LCheckInstanceType(value);
17171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return AssignEnvironment(result);
1718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1719b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1720b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1721b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
17221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* temp = TempRegister();
17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp);
17241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return AssignEnvironment(result);
1725b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
17291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckSmi(value));
1731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1732b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
17351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckFunction(value));
1737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1738b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCheckMap(HCheckMap* instr) {
17411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCheckMap* result = new(zone()) LCheckMap(value);
17431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return AssignEnvironment(result);
1744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1745b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1746b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1748257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value = instr->value();
1749257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Representation input_rep = value->representation();
1750257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* reg = UseRegister(value);
1751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (input_rep.IsDouble()) {
17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LClampDToUint8(reg,
1753257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                               TempRegister()));
1754257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (input_rep.IsInteger32()) {
17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(new(zone()) LClampIToUint8(reg));
1756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
1757257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(input_rep.IsTagged());
1758257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Register allocator doesn't (yet) support allocation of double
1759257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // temps. Reserve xmm1 explicitly.
17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LClampTToUint8* result = new(zone()) LClampTToUint8(reg,
17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        TempRegister(),
17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        FixedTemp(xmm1));
1763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return AssignEnvironment(DefineSameAsFirst(result));
1764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1766257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LReturn(UseFixed(instr->value(), rax));
1770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1772b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Representation r = instr->representation();
1775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (r.IsInteger32()) {
17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantI);
1777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (r.IsDouble()) {
1778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LOperand* temp = TempRegister();
17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantD(temp));
1780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (r.IsTagged()) {
17813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantT);
1782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
1783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    UNREACHABLE();
1784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return NULL;
1785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
17898b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell;
17913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck()
17921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ? AssignEnvironment(DefineAsRegister(result))
17931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : DefineAsRegister(result);
1794b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1795b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
17978b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
17988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  LOperand* global_object = UseFixed(instr->global_object(), rax);
17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadGlobalGeneric* result = new(zone()) LLoadGlobalGeneric(global_object);
18008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
18018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
18028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
18038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
18048b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
18053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegister(instr->value());
18063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Use a temp to avoid reloading the cell value address in the case where
18073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // we perform a hole check.
18083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck()
18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister()))
18103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : new(zone()) LStoreGlobalCell(value, NULL);
1811b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1812b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18148b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) {
18158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  LOperand* global_object = UseFixed(instr->global_object(), rdx);
18168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  LOperand* value = UseFixed(instr->value(), rax);
18173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStoreGlobalGeneric* result =  new(zone()) LStoreGlobalGeneric(global_object,
18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                                 value);
18198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return MarkAsCall(result, instr);
18208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
18218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
18228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
1824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
18253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
18263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineAsRegister(new(zone()) LLoadContextSlot(context));
18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
1828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18311e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context;
1833e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value;
1834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* temp;
1835e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (instr->NeedsWriteBarrier()) {
1836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    context = UseTempRegister(instr->context());
1837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value = UseTempRegister(instr->value());
1838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temp = TempRegister();
1839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    context = UseRegister(instr->context());
1841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value = UseRegister(instr->value());
1842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temp = NULL;
1843e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp);
18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
1846b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1847b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1848b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18491e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
18501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->representation().IsTagged());
18511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* obj = UseRegisterAtStart(instr->object());
18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
18531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
18541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
185644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
185744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HLoadNamedFieldPolymorphic* instr) {
185844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(instr->representation().IsTagged());
185944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (instr->need_generic()) {
186044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    LOperand* obj = UseFixed(instr->object(), rax);
18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LLoadNamedFieldPolymorphic* result =
18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LLoadNamedFieldPolymorphic(obj);
186344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return MarkAsCall(DefineFixed(result, rax), instr);
186444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else {
186544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    LOperand* obj = UseRegisterAtStart(instr->object());
18663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LLoadNamedFieldPolymorphic* result =
18673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LLoadNamedFieldPolymorphic(obj);
186844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return AssignEnvironment(DefineAsRegister(result));
186944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
187044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
187144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
187244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
18741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* object = UseFixed(instr->object(), rax);
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(object);
18761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return MarkAsCall(DefineFixed(result, rax), instr);
1877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
1881b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadFunctionPrototype* instr) {
18821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return AssignEnvironment(DefineAsRegister(
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
1884b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1885b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1886b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1887b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) {
18881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* input = UseRegisterAtStart(instr->value());
18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadElements(input));
18901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
18911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
189344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
189444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HLoadExternalArrayPointer* instr) {
18951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* input = UseRegisterAtStart(instr->value());
18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input));
1897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1899b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1900b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastElement(
1901b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadKeyedFastElement* instr) {
19021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->representation().IsTagged());
19031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->key()->representation().IsInteger32());
19041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* obj = UseRegisterAtStart(instr->object());
190569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
19063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadKeyedFastElement* result = new(zone()) LLoadKeyedFastElement(obj, key);
19073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->RequiresHoleCheck()) AssignEnvironment(result);
19083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(result);
19091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
19101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19123fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement(
19133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HLoadKeyedFastDoubleElement* instr) {
19143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->representation().IsDouble());
19153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* elements = UseRegisterAtStart(instr->elements());
19173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
19183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LLoadKeyedFastDoubleElement* result =
19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadKeyedFastDoubleElement(elements, key);
19203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return AssignEnvironment(DefineAsRegister(result));
19213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
19223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
192444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
192544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HLoadKeyedSpecializedArrayElement* instr) {
1926589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind = instr->elements_kind();
1927257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(
19283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (instr->representation().IsInteger32() &&
1929589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1930589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (instr->representation().IsDouble() &&
1932589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1933589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
19341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->key()->representation().IsInteger32());
193544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* external_pointer = UseRegister(instr->external_pointer());
1936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
193744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LLoadKeyedSpecializedArrayElement* result =
19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key);
193944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LInstruction* load_instr = DefineAsRegister(result);
194044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // An unsigned int array load might overflow and cause a deopt, make sure it
194144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // has an environment.
1942589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ?
194344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      AssignEnvironment(load_instr) : load_instr;
1944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1946b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1947b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
1948e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* object = UseFixed(instr->object(), rdx);
1949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* key = UseFixed(instr->key(), rax);
1950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadKeyedGeneric* result = new(zone()) LLoadKeyedGeneric(object, key);
1952e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1953b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastElement(
1957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HStoreKeyedFastElement* instr) {
19581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool needs_write_barrier = instr->NeedsWriteBarrier();
19591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->value()->representation().IsTagged());
19601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->object()->representation().IsTagged());
19611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(instr->key()->representation().IsInteger32());
19621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* obj = UseTempRegister(instr->object());
19641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* val = needs_write_barrier
19651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ? UseTempRegister(instr->value())
19661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : UseRegisterAtStart(instr->value());
19671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* key = needs_write_barrier
19681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ? UseTempRegister(instr->key())
19691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : UseRegisterOrConstantAtStart(instr->key());
19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreKeyedFastElement(obj, key, val);
1971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
19743fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement(
19753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HStoreKeyedFastDoubleElement* instr) {
19763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->value()->representation().IsDouble());
19773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->elements()->representation().IsTagged());
19783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* elements = UseRegisterAtStart(instr->elements());
19813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* val = UseTempRegister(instr->value());
19823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
19833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val);
19853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
19863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
198844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
198944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HStoreKeyedSpecializedArrayElement* instr) {
1990589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind = instr->elements_kind();
1991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(
19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (instr->value()->representation().IsInteger32() &&
1993589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
1994589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (instr->value()->representation().IsDouble() &&
1996589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
1997589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch       (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
1998e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->external_pointer()->representation().IsExternal());
1999e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
2000e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2001e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* external_pointer = UseRegister(instr->external_pointer());
20023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool val_is_temp_register =
2003589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      elements_kind == EXTERNAL_PIXEL_ELEMENTS ||
2004589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      elements_kind == EXTERNAL_FLOAT_ELEMENTS;
200544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* val = val_is_temp_register
200644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      ? UseTempRegister(instr->value())
20078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : UseRegister(instr->value());
2008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
2009e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer,
20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        key,
20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        val);
2013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
2014e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2015e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2017e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* object = UseFixed(instr->object(), rdx);
2018e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* key = UseFixed(instr->key(), rcx);
2019e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value = UseFixed(instr->value(), rax);
2020e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2021e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->object()->representation().IsTagged());
2022e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->key()->representation().IsTagged());
2023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
2024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStoreKeyedGeneric* result =
20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LStoreKeyedGeneric(object, key, value);
2027e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(result, instr);
2028b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind(
20323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HTransitionElementsKind* instr) {
20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->original_map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS &&
20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      instr->transitioned_map()->elements_kind() == FAST_ELEMENTS) {
20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseRegister(instr->object());
20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = TempRegister();
20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* temp_reg = TempRegister();
20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LTransitionElementsKind(object, new_map_reg, temp_reg);
20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(result);
20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseFixed(instr->object(), rax);
20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* fixed_object_reg = FixedTemp(rdx);
20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = FixedTemp(rbx);
20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LTransitionElementsKind(object,
20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                            new_map_reg,
20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                            fixed_object_reg);
20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixed(result, rax), instr);
20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2054b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
20551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool needs_write_barrier = instr->NeedsWriteBarrier();
20561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* obj = needs_write_barrier
20581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ? UseTempRegister(instr->object())
20591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : UseRegisterAtStart(instr->object());
20601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* val = needs_write_barrier
20621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ? UseTempRegister(instr->value())
20631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : UseRegister(instr->value());
20641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // We only need a scratch register if we have a write barrier or we
20661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // have a store into the properties array (not in-object-property).
20671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* temp = (!instr->is_in_object() || needs_write_barrier)
20681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ? TempRegister() : NULL;
20691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreNamedField(obj, val, temp);
2071b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2072b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2073b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2074b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2075e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* object = UseFixed(instr->object(), rdx);
2076e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value = UseFixed(instr->value(), rax);
2077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
20783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStoreNamedGeneric* result = new(zone()) LStoreNamedGeneric(object, value);
2079e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(result, instr);
2080b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2081b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2082b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2084257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* left = UseOrConstantAtStart(instr->left());
2085257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* right = UseOrConstantAtStart(instr->right());
20863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LStringAdd(left, right), rax),
20873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    instr);
2088257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2089257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2090257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
20911e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
209269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* string = UseTempRegister(instr->string());
209369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* index = UseTempRegister(instr->index());
20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCharCodeAt* result = new(zone()) LStringCharCodeAt(string, index);
2095e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
2096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2097b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2098b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
209944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
210044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* char_code = UseRegister(instr->value());
21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCharFromCode* result = new(zone()) LStringCharFromCode(char_code);
210244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return AssignPointerMap(DefineAsRegister(result));
210344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
210444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
210544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
21061e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
2107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* string = UseRegisterAtStart(instr->value());
21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LStringLength(string));
21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) {
21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAllocateObject* result = new LAllocateObject(TempRegister());
21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFastLiteral(HFastLiteral* instr) {
21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LFastLiteral, rax), instr);
21201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
21211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21235d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen MurdochLInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) {
21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LArrayLiteral, rax), instr);
2125592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2126592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2127592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
21285d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen MurdochLInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) {
21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LObjectLiteral, rax), instr);
21301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
21311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, rax), instr);
2135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2138b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LFunctionLiteral, rax), instr);
2140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseAtStart(instr->object());
21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseOrConstantAtStart(instr->key());
21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LDeleteProperty* result = new(zone()) LDeleteProperty(object, key);
2147e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
2148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  allocator_->MarkAsOsrEntry();
2153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  current_block_->last_environment()->set_ast_id(instr->ast_id());
21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LOsrEntry);
2155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2159b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int spill_index = chunk()->GetParameterStackSlot(instr->index());
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LParameter, spill_index);
2161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int spill_index = chunk()->GetNextSpillIndex(false);  // Not double-width.
21667d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  if (spill_index > LUnallocated::kMaxFixedIndex) {
21677d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    Abort("Too many spill slots needed for OSR");
21687d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    spill_index = 0;
21697d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  }
21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
21751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  argument_count_ -= instr->argument_count();
21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallStub, rax), instr);
2177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
2181e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // There are no real uses of the arguments object.
2182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // arguments.length and element access are supported directly on
2183e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // stack arguments, and any real arguments object use causes a bailout.
2184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // So this value is never used.
2185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2188b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2189b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
2190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* arguments = UseRegister(instr->arguments());
2191e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* length = UseTempRegister(instr->length());
2192e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* index = Use(instr->index());
21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAccessArgumentsAt* result =
21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LAccessArgumentsAt(arguments, length, index);
2195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
2196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
219944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
220044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* object = UseFixed(instr->value(), rax);
22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LToFastProperties* result = new(zone()) LToFastProperties(object);
220244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return MarkAsCall(DefineFixed(result, rax), instr);
220344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
220444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
220544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
22073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LTypeof* result = new(zone()) LTypeof(UseAtStart(instr->value()));
2208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
2209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22123fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
22133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
2214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22173fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
22183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HIsConstructCallAndBranch* instr) {
22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsConstructCallAndBranch(TempRegister());
22201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
22211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HEnvironment* env = current_block_->last_environment();
2225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(env != NULL);
2226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  env->set_ast_id(instr->ast_id());
2228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  env->Drop(instr->pop_count());
2230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < instr->values()->length(); ++i) {
2231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HValue* value = instr->values()->at(i);
2232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (instr->HasAssignedIndexAt(i)) {
2233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      env->Bind(instr->GetAssignedIndexAt(i), value);
2234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    } else {
2235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      env->Push(value);
2236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
2237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // If there is an instruction pending deoptimization environment create a
2240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // lazy bailout instruction to capture the environment.
2241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (pending_deoptimization_ast_id_ == instr->ast_id()) {
22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LLazyBailout* lazy_bailout = new(zone()) LLazyBailout;
2243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LInstruction* result = AssignEnvironment(lazy_bailout);
22441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    instruction_pending_deoptimization_environment_->
2245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        set_deoptimization_environment(result->environment());
2246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ClearInstructionPendingDeoptimizationEnvironment();
2247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return result;
2248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
22553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (instr->is_function_entry()) {
22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(new(zone()) LStackCheck, instr);
22573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } else {
22583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(instr->is_backwards_branch());
22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(AssignPointerMap(new(zone()) LStackCheck));
22603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
22651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HEnvironment* outer = current_block_->last_environment();
22661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HConstant* undefined = graph()->GetConstantUndefined();
22671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->arguments_count(),
22691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                               instr->function(),
2270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                               undefined,
22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->call_kind(),
22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->is_construct());
22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->arguments() != NULL) {
22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inner->Bind(instr->arguments(), graph()->GetArgumentsObject());
22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  current_block_->UpdateEnvironment(inner);
22771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  chunk_->AddInlinedClosure(instr->closure());
2278b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2279b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2280b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment()->
22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DiscardInlined(false);
22851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  current_block_->UpdateEnvironment(outer);
2286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2287b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2290257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoIn(HIn* instr) {
2291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* key = UseOrConstantAtStart(instr->key());
2292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* object = UseOrConstantAtStart(instr->object());
22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LIn* result = new(zone()) LIn(key, object);
2294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
2295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->enumerable(), rax);
23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LForInPrepareMap* result = new(zone()) LForInPrepareMap(object);
23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegister(instr->map());
23073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(
23083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LForInCacheArray(map)));
23093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
23133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegisterAtStart(instr->map());
23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegister(instr->object());
23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseTempRegister(instr->index());
23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineSameAsFirst(new(zone()) LLoadFieldByIndex(object, index));
23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} }  // namespace v8::internal
2327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif  // V8_TARGET_ARCH_X64
2329