lithium-x64.cc revision 109988c7ccb6f3fd1a58574fa3dfb88beaef6632
13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x64/lithium-x64.h"
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <sstream>
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_X64
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen-osr.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-inl.h"
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x64/lithium-codegen-x64.h"
149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
15086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace v8 {
16086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace internal {
179fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
18b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DEFINE_COMPILE(type)                            \
19b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void L##type::CompileToNative(LCodeGen* generator) {  \
20b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    generator->Do##type(this);                          \
21b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
22b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
23b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DEFINE_COMPILE
24b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
25b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LInstruction::VerifyCall() {
28257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Call instructions can use only fixed registers as temporaries and
29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // outputs because all registers are blocked by the calling convention.
30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Inputs operands must use a fixed register or use-at-start policy or
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // a non-register policy.
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(Output() == NULL ||
331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         LUnallocated::cast(Output())->HasFixedPolicy() ||
341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         !LUnallocated::cast(Output())->HasRegisterPolicy());
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (UseIterator it(this); !it.Done(); it.Advance()) {
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operand->HasFixedPolicy() ||
38257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch           operand->IsUsedAtStart());
391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (TempIterator it(this); !it.Done(); it.Advance()) {
413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LInstruction::PrintTo(StringStream* stream) {
49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("%s ", this->Mnemonic());
501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  PrintOutputOperandTo(stream);
52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  PrintDataTo(stream);
54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (HasEnvironment()) {
56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" ");
57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    environment()->PrintTo(stream);
58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (HasPointerMap()) {
61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" ");
62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    pointer_map()->PrintTo(stream);
63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) {
68b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("= ");
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < InputCount(); i++) {
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (i > 0) stream->Add(" ");
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (InputAt(i) == NULL) {
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      stream->Add("NULL");
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      InputAt(i)->PrintTo(stream);
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
77b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
79b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (HasResult()) result()->PrintTo(stream);
82b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
84b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLabel::PrintDataTo(StringStream* stream) {
86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LGap::PrintDataTo(stream);
87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLabel* rep = replacement();
88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (rep != NULL) {
89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" Dead block replaced with B%d", rep->block_id());
90b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
91b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LGap::IsRedundant() const {
95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < 4; i++) {
96b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
97b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return false;
98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return true;
102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGap::PrintDataTo(StringStream* stream) {
106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < 4; i++) {
107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add("(");
108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[i] != NULL) {
109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      parallel_moves_[i]->PrintDataTo(stream);
110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(") ");
112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticD::Mnemonic() const {
117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  switch (op()) {
118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::ADD: return "add-d";
119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::SUB: return "sub-d";
120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MUL: return "mul-d";
121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::DIV: return "div-d";
122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MOD: return "mod-d";
123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    default:
124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      UNREACHABLE();
125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return NULL;
126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticT::Mnemonic() const {
131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  switch (op()) {
132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::ADD: return "add-t";
133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::SUB: return "sub-t";
134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MUL: return "mul-t";
135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MOD: return "mod-t";
136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::DIV: return "div-t";
1371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_AND: return "bit-and-t";
1381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_OR: return "bit-or-t";
1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_XOR: return "bit-xor-t";
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case Token::ROR: return "ror-t";
1411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SHL: return "sal-t";
1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SAR: return "sar-t";
1431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SHR: return "shr-t";
144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    default:
145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      UNREACHABLE();
146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return NULL;
147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const {
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !gen->IsNextEmittedBlock(block_id());
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int R>
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LTemplateResultInstruction<R>::MustSignExtendResult(
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LPlatformChunk* chunk) const {
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* hvalue = this->hydrogen_value();
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return hvalue != NULL &&
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      hvalue->representation().IsInteger32() &&
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk->GetDehoistedKeyIds()->Contains(hvalue->id());
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGoto::PrintDataTo(StringStream* stream) {
167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("B%d", block_id());
168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LBranch::PrintDataTo(StringStream* stream) {
172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if ");
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  left()->PrintTo(stream);
180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" %s ", Token::String(op()));
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  right()->PrintTo(stream);
182b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_string(");
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if is_smi(");
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("if is_undetectable(");
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
204257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if string_compare(");
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  left()->PrintTo(stream);
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  right()->PrintTo(stream);
2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if has_instance_type(");
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if has_cached_array_index(");
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if class_of_test(");
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(", \"%o\") then B%d else B%d",
233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              *hydrogen()->class_name(),
234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              true_block_id(),
235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              false_block_id());
236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if typeof ");
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" == \"%s\" then B%d else B%d",
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              hydrogen()->type_literal()->ToCString().get(),
244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              true_block_id(), false_block_id());
245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" = ");
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(".code_entry = ");
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code_object()->PrintTo(stream);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" = ");
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base_object()->PrintTo(stream);
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" + ");
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  offset()->PrintTo(stream);
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCallFunction::PrintDataTo(StringStream* stream) {
265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  context()->PrintTo(stream);
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  stream->Add(" ");
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  function()->PrintTo(stream);
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (hydrogen()->HasVectorAndSlot()) {
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    stream->Add(" (type-feedback-vector ");
270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temp_vector()->PrintTo(stream);
271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    stream->Add(" ");
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temp_slot()->PrintTo(stream);
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    stream->Add(")");
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallJSFunction::PrintDataTo(StringStream* stream) {
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add("= ");
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("#%d / ", arity());
282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
283b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < InputCount(); i++) {
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InputAt(i)->PrintTo(stream);
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" ");
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add("#%d / ", arity());
291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context()->PrintTo(stream);
2961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d]", slot_index());
297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context()->PrintTo(stream);
302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[%d] <- ", slot_index());
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("= ");
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" #%d / ", arity());
311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) {
315b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("= ");
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  constructor()->PrintTo(stream);
317b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" #%d / ", arity());
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind kind = hydrogen()->elements_kind();
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" (%s) ", ElementsKindToString(kind));
320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
322b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  arguments()->PrintTo(stream);
325b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" length ");
327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  length()->PrintTo(stream);
328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" index ");
330b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  index()->PrintTo(stream);
331b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
332b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
333b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kind == DOUBLE_REGISTERS && kDoubleSize == 2 * kPointerSize) {
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Skip a slot if for a double-width slot for x32 port.
337109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    current_frame_slots_++;
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The spill slot's address is at rbp - (index + 1) * kPointerSize -
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // StandardFrameConstants::kFixedFrameSizeFromFp. kFixedFrameSizeFromFp is
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // 2 * kPointerSize, if rbp is aligned at 8-byte boundary, the below "|= 1"
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // will make sure the spilled doubles are aligned at 8-byte boundary.
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(haitao): make sure rbp is aligned at 8-byte boundary for x32 port.
343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    current_frame_slots_ |= 1;
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
345109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return current_frame_slots_++;
346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) {
350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // All stack slots are Double stack slots on x64.
351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Alternatively, at some point, start using half-size
352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // stack slots for int32 values.
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index = GetNextSpillIndex(kind);
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kind == DOUBLE_REGISTERS) {
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LDoubleStackSlot::Create(index, zone());
356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(kind == GENERAL_REGISTERS);
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LStackSlot::Create(index, zone());
359b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
361b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
362b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintTo(stream);
365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::ostringstream os;
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os << hydrogen()->access() << " <- ";
367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  stream->Add(os.str().c_str());
368e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintTo(stream);
369e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
371e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  object()->PrintTo(stream);
374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(".");
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(String::cast(*name())->ToCString().get());
376b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" <- ");
377b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  value()->PrintTo(stream);
378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  elements()->PrintTo(stream);
383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintTo(stream);
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hydrogen()->IsDehoisted()) {
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" + %d]", base_offset());
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("]");
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
390e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
391e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
392e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
3943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elements()->PrintTo(stream);
3953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("[");
3963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  key()->PrintTo(stream);
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hydrogen()->IsDehoisted()) {
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" + %d] <-", base_offset());
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("] <- ");
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value() == NULL) {
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(hydrogen()->IsConstantHoleStore() &&
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           hydrogen()->value()->representation().IsDouble());
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("<the hole(nan)>");
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value()->PrintTo(stream);
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
4113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
413e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  object()->PrintTo(stream);
415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("[");
416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  key()->PrintTo(stream);
417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("] <- ");
418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  value()->PrintTo(stream);
419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() {
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_unused());
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  chunk_ = new(zone()) LPlatformChunk(info(), graph());
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LPhase phase("L_Building chunk", chunk_);
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  status_ = BUILDING;
433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If compiling for OSR, reserve space for the unoptimized frame,
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // which will be subsumed into this frame.
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (graph()->has_osr()) {
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
441b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
442086aeeaae12517475c22695a200be45495516549Ben Murdoch  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
443086aeeaae12517475c22695a200be45495516549Ben Murdoch  for (int i = 0; i < blocks->length(); i++) {
444086aeeaae12517475c22695a200be45495516549Ben Murdoch    HBasicBlock* next = NULL;
445086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (i < blocks->length() - 1) next = blocks->at(i + 1);
446086aeeaae12517475c22695a200be45495516549Ben Murdoch    DoBasicBlock(blocks->at(i), next);
447086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (is_aborted()) return NULL;
448086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
449086aeeaae12517475c22695a200be45495516549Ben Murdoch  status_ = DONE;
450086aeeaae12517475c22695a200be45495516549Ben Murdoch  return chunk_;
4519fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
4529fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
4539fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
454b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LUnallocated(LUnallocated::FIXED_REGISTER, reg.code());
456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) {
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone())
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, reg.code());
462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value, ToUnallocated(fixed_register));
467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) {
471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value, ToUnallocated(reg));
472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) {
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value,
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                              LUnallocated::USED_AT_START));
484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseTempRegisterOrConstant(HValue* value) {
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return value->IsConstant()
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseTempRegister(value);
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value) {
5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) {
5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                     LUnallocated::USED_AT_START));
507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : Use(value);
514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseAtStart(value);
521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseRegister(value);
528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseRegisterAtStart(value);
535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) {
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return chunk_->DefineConstantOperand(HConstant::cast(value));
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAny(HValue* value) {
544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
545b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
547b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
548b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
549b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
551b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (value->EmitAtUses()) {
552b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HInstruction* instr = HInstruction::cast(value);
553b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    VisitInstruction(instr);
554b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(value->id());
556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                    LUnallocated* result) {
5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result->set_virtual_register(current_instruction_->id());
563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  instr->set_result(result);
564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsRegister(
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr) {
5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
572b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
573b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsSpilled(
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr,
577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    int index) {
5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineSameAsFirst(
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr) {
5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr,
591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                         Register reg) {
592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Define(instr, ToUnallocated(reg));
593b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
594b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixedDouble(
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr,
598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    XMMRegister reg) {
599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Define(instr, ToUnallocated(reg));
600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HEnvironment* hydrogen_env = current_block_->last_environment();
6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int argument_index_accumulator = 0;
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<HValue*> objects_to_materialize(0, zone());
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_environment(CreateEnvironment(
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      hydrogen_env, &argument_index_accumulator, &objects_to_materialize));
609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                        HInstruction* hinstr,
615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                        CanDeoptimize can_deoptimize) {
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsNonDeferredCalling();
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
6191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->VerifyCall();
6201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
6211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->MarkAsCall();
622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  instr = AssignPointerMap(instr);
623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // If instruction does not have side-effects lazy deoptimization
625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // after the call will try to deoptimize to the point before the call.
626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Thus we still need to attach environment to this call even if
627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // call sequence can not deoptimize eagerly.
628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool needs_environment =
6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !hinstr->HasObservableSideEffects();
631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (needs_environment && !instr->HasEnvironment()) {
632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instr = AssignEnvironment(instr);
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We can't really figure out if the environment is needed or not.
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->environment()->set_has_been_used();
635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
641b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!instr->HasPointerMap());
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::TempRegister() {
6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand =
6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int vreg = allocator_->GetVirtualRegister();
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!allocator_->AllocationOk()) {
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    vreg = 0;
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  operand->set_virtual_register(vreg);
657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
658b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
660b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
661b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) {
662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* operand = ToUnallocated(reg);
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(operand->HasFixedPolicy());
664b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
665b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
666b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
667b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) {
669b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* operand = ToUnallocated(reg);
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(operand->HasFixedPolicy());
671b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
672b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
673b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
674b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
675b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LLabel(instr->block());
677b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
678b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
679b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNREACHABLE();
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
6883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
6893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
693b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
694b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6961e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoShift(Token::Value op,
6971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                     HBitwiseBinaryOperation* instr) {
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
7021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_value = instr->right();
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = NULL;
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int constant_value = 0;
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool does_deopt = false;
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right_value->IsConstant()) {
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant* constant = HConstant::cast(right_value);
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = chunk_->DefineConstantOperand(constant);
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      constant_value = constant->Integer32Value() & 0x1f;
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (SmiValuesAre31Bits() && instr->representation().IsSmi() &&
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          constant_value > 0) {
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // Left shift can deoptimize if we shift by > 0 and the result
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // cannot be truncated to smi.
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = UseFixed(right_value, rcx);
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Shift operations can only deoptimize if we do a logical shift by 0 and
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // the result cannot be truncated to int32.
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (op == Token::SHR && constant_value == 0) {
724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      does_deopt = !instr->CheckFlag(HInstruction::kUint32);
7251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
7261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result =
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt));
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return does_deopt ? AssignEnvironment(result) : result;
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(op, instr);
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
735b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
736b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                           HArithmeticBinaryOperation* instr) {
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsDouble());
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsDouble());
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op == Token::MOD) {
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseFixedDouble(instr->BetterRightOperand(), xmm1);
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(DefineSameAsFirst(result), instr);
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseRegisterAtStart(instr->BetterRightOperand());
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return CpuFeatures::IsSupported(AVX) ? DefineAsRegister(result)
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         : DefineSameAsFirst(result);
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
755b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
756b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           HBinaryOperation* instr) {
758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* left = instr->left();
759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* right = instr->right();
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(left->representation().IsTagged());
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(right->representation().IsTagged());
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
763b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* left_operand = UseFixed(left, rdx);
764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* right_operand = UseFixed(right, rax);
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticT* result =
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
767b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_building());
773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_block_ = block;
774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  next_block_ = next_block;
775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (block->IsStartBlock()) {
776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(graph_->start_environment());
777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = 0;
778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (block->predecessors()->length() == 1) {
779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // We have a single predecessor => copy environment and outgoing
780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // argument count from the predecessor.
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(block->phis()->length() == 0);
782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HEnvironment* last_environment = pred->last_environment();
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(last_environment != NULL);
785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Only copy the environment, if it is later used again.
786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (pred->end()->SecondSuccessor() == NULL) {
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(pred->end()->FirstSuccessor() == block);
788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    } else {
789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
791b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        last_environment = last_environment->Copy();
792b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      }
793b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
794b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(last_environment);
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(pred->argument_count() >= 0);
796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = pred->argument_count();
797b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
798b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // We are at a state join => process phis.
799b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
800b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // No need to copy the environment, it cannot be used later.
801b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HEnvironment* last_environment = pred->last_environment();
802b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    for (int i = 0; i < block->phis()->length(); ++i) {
803b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      HPhi* phi = block->phis()->at(i);
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (phi->HasMergedIndex()) {
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        last_environment->SetValueAt(phi->merged_index(), phi);
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
807b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
808b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (block->deleted_phis()->at(i) < last_environment->length()) {
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        last_environment->SetValueAt(block->deleted_phis()->at(i),
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     graph_->GetConstantUndefined());
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
814b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(last_environment);
815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Pick up the outgoing argument count of one of the predecessors.
816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = pred->argument_count();
817b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
818b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HInstruction* current = block->first();
819b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int start = chunk_->instructions()->length();
820b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  while (current != NULL && !is_aborted()) {
821b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Code for constants in registers is generated lazily.
822b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (!current->EmitAtUses()) {
823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      VisitInstruction(current);
824b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    current = current->next();
826b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int end = chunk_->instructions()->length() - 1;
828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (end >= start) {
829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->set_first_instruction_index(start);
830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->set_last_instruction_index(end);
831b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
832b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  block->set_argument_count(argument_count_);
833b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  next_block_ = NULL;
834b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_block_ = NULL;
835b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
836b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
837b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
838b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
839b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HInstruction* old_current = current_instruction_;
840b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_instruction_ = current;
841b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* instr = NULL;
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (current->CanReplaceWithDummyUses()) {
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current->OperandCount() == 0) {
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = DefineAsRegister(new(zone()) LDummy());
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(!current->OperandAt(0)->IsControlInstruction());
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = DefineAsRegister(new(zone())
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          LDummyUse(UseAny(current->OperandAt(0))));
850b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 1; i < current->OperandCount(); ++i) {
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (current->OperandAt(i)->IsControlInstruction()) continue;
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* dummy =
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      dummy->set_hydrogen_value(current);
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk_->AddInstruction(dummy, current_block_);
857b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBasicBlock* successor;
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current->IsControlInstruction() &&
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        successor != NULL) {
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = new(zone()) LGoto(successor);
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = current->CompileToLithium(this);
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  argument_count_ += current->argument_delta();
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(argument_count_ >= 0);
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr != NULL) {
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddInstruction(instr, current);
874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_instruction_ = old_current;
877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr,
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   HInstruction* hydrogen_val) {
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Associate the hydrogen instruction first, since we may need it for
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_hydrogen_value(hydrogen_val);
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure that the lithium instruction has either no fixed register
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // constraints in temps or the result OR no uses that are only used at
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // start. If this invariant doesn't hold, the register allocator can decide
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // to insert a split of a range immediately before the instruction due to an
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // already allocated register needing to be used for the instruction's fixed
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // register constraint. In this case, The register allocator won't see an
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // interference between the split child and the use-at-start (it would if
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the it was just a plain use), so it is free to move the split child into
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the same register that is used for the use-at-start.
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // See https://code.google.com/p/chromium/issues/detail?id=201590
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(instr->ClobbersRegisters() &&
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->ClobbersDoubleRegisters(isolate()))) {
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int fixed = 0;
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int used_at_start = 0;
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (UseIterator it(instr); !it.Done(); it.Advance()) {
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LUnallocated* operand = LUnallocated::cast(it.Current());
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (operand->IsUsedAtStart()) ++used_at_start;
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->Output() != NULL) {
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (TempIterator it(instr); !it.Done(); it.Advance()) {
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LUnallocated* operand = LUnallocated::cast(it.Current());
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (operand->HasFixedPolicy()) ++fixed;
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(fixed == 0 || used_at_start == 0);
913b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr = AssignPointerMap(instr);
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_stress_environments && !instr->HasEnvironment()) {
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr = AssignEnvironment(instr);
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  chunk_->AddInstruction(instr, current_block_);
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->IsCall() || instr->IsPrologue()) {
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* hydrogen_value_for_lazy_bailout = hydrogen_val;
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (hydrogen_val->HasObservableSideEffects()) {
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HSimulate* sim = HSimulate::cast(hydrogen_val->next());
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      sim->ReplayEnvironment(current_block_->last_environment());
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      hydrogen_value_for_lazy_bailout = sim;
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    chunk_->AddInstruction(bailout, current_block_);
9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LGoto(instr->FirstSuccessor());
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) {
944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LPrologue();
945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LDebugBreak();
950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
952b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9533fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = value->representation();
9563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HType type = value->type();
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ToBooleanStub::Types expected = instr->expected_input_types();
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic();
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* branch = new(zone()) LBranch(UseRegister(value));
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!easy_case &&
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) ||
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       !expected.IsGeneric())) {
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    branch = AssignEnvironment(branch);
9673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return branch;
969b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9721e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
9741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpMapAndBranch(value);
976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
979b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value())));
982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
983b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
984b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
985b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsElements);
988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
990b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
991b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* left =
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UseFixed(instr->left(), InstanceOfDescriptor::LeftRegister());
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* right =
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UseFixed(instr->right(), InstanceOfDescriptor::RightRegister());
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LInstanceOf* result = new (zone()) LInstanceOf(context, left, right);
998e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
999b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1000b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1001b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch(
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HHasInPrototypeChainAndBranch* instr) {
1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object = UseRegister(instr->object());
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* prototype = UseRegister(instr->prototype());
1006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LHasInPrototypeChainAndBranch* result =
1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LHasInPrototypeChainAndBranch(object, prototype);
1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignEnvironment(result);
1009b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1010b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1011b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseRegister(instr->receiver());
10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseRegisterAtStart(instr->function());
10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineSameAsFirst(result));
10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1020b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1021e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1022e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* receiver = UseFixed(instr->receiver(), rax);
1023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* length = UseFixed(instr->length(), rbx);
1024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* elements = UseFixed(instr->elements(), rcx);
10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LApplyArguments* result = new(zone()) LApplyArguments(function,
1026e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                receiver,
1027e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                length,
1028e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                elements);
1029e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1032b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int argc = instr->OperandCount();
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < argc; ++i) {
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* argument = UseOrConstant(instr->argument(i));
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddInstruction(new(zone()) LPushArgument(argument), instr);
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry(
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HStoreCodeEntry* store_code_entry) {
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function = UseRegister(store_code_entry->function());
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LStoreCodeEntry(function, code_object);
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject(
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HInnerAllocatedObject* instr) {
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* base_object = UseRegisterAtStart(instr->base_object());
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LInnerAllocatedObject(base_object, offset));
10571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
10581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
10591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
10603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
10613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses()
10623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? NULL
10633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : DefineAsRegister(new(zone()) LThisFunction);
10643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
10653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10671e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoContext(HContext* instr) {
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->HasNoUses()) return NULL;
10691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (info()->IsStub()) {
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(new(zone()) LContext, rsi);
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
10731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LContext);
10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
1081b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1082b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1083b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallJSFunction(
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCallJSFunction* instr) {
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallJSFunction* result = new(zone()) LCallJSFunction(function);
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1091b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1092b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1093b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor(
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCallWithDescriptor* instr) {
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptor descriptor = instr->descriptor();
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Target
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ops.Add(target, zone());
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Context
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* op = UseFixed(instr->OperandAt(1), rsi);
1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ops.Add(op, zone());
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Other register parameters
1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = LCallWithDescriptor::kImplicitRegisterParameterCount;
1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch       i < instr->OperandCount(); i++) {
1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    op =
1109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        UseFixed(instr->OperandAt(i),
1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 descriptor.GetRegisterParameter(
1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     i - LCallWithDescriptor::kImplicitRegisterParameterCount));
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ops.Add(op, zone());
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      descriptor, ops, zone());
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
1125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (instr->op()) {
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathFloor:
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathFloor(instr);
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathRound:
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathRound(instr);
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathFround:
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathFround(instr);
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathAbs:
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathAbs(instr);
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathLog:
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathLog(instr);
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathExp:
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathExp(instr);
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathSqrt:
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathSqrt(instr);
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathPowHalf:
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathPowHalf(instr);
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathClz32:
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathClz32(instr);
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return NULL;
1152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathFloor* result = new(zone()) LMathFloor(input);
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
1160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(xmm4);
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathRound* result = new(zone()) LMathRound(input, temp);
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
1168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) {
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathFround* result = new (zone()) LMathFround(input);
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
1175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result =
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineSameAsFirst(new(zone()) LMathAbs(context, input));
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = instr->value()->representation();
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsDouble()) result = AssignEnvironment(result);
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1188b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1189b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineSameAsFirst(new(zone()) LMathLog(input)), instr);
1195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathClz32* result = new(zone()) LMathClz32(input);
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
1202b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = UseTempRegister(instr->value());
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = TempRegister();
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = TempRegister();
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathExp* result = new(zone()) LMathExp(value, temp1, temp2);
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
1213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseAtStart(instr->value());
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LMathSqrt(input));
1219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathPowHalf* result = new(zone()) LMathPowHalf(input);
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineSameAsFirst(result);
1226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* constructor = UseFixed(instr->constructor(), rdi);
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* slot = NULL;
1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* vector = NULL;
1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->HasVectorAndSlot()) {
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    slot = FixedTemp(rdx);
1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    vector = FixedTemp(rbx);
1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LCallFunction* call =
1247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LCallFunction(context, function, slot, vector);
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(call, rax), instr);
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallRuntime* result = new(zone()) LCallRuntime(context);
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) {
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::ROR, instr);
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) {
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SHR, instr);
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) {
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SAR, instr);
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) {
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SHL, instr);
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* right;
1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (SmiValuesAre32Bits() && instr->representation().IsSmi()) {
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // We don't support tagged immediates, so we request it in a register.
1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseRegisterAtStart(instr->BetterRightOperand());
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseOrConstantAtStart(instr->BetterRightOperand());
1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineSameAsFirst(new(zone()) LBitI(left, right));
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(instr->op(), instr);
12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       divisor != 1 && divisor != -1)) {
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsInteger32());
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = FixedTemp(rax);
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = FixedTemp(rdx);
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LDivByConstI(
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp1, temp2), rdx);
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 ||
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(HDiv* instr) {
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseFixed(instr->left(), rax);
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(rdx);
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LDivI(
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp), rax);
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kCanOverflow) ||
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) {
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1355b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->RightIsPowerOf2()) {
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivByPowerOf2I(instr);
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (instr->right()->IsConstant()) {
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivByConstI(instr);
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivI(instr);
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsDouble()) {
13661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::DIV, instr);
13671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::DIV, instr);
13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1370b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1371b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegisterAtStart(instr->left());
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I(
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsInteger32());
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = FixedTemp(rax);
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = FixedTemp(rdx);
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp3 =
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NULL : TempRegister();
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result =
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineFixed(new(zone()) LFlooringDivByConstI(dividend,
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   divisor,
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   temp1,
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   temp2,
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   temp3),
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  rdx);
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 ||
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseFixed(instr->left(), rax);
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(rdx);
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LFlooringDivI(
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp), rax);
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kCanOverflow)) {
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RightIsPowerOf2()) {
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivByPowerOf2I(instr);
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->right()->IsConstant()) {
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivByConstI(instr);
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivI(instr);
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegisterAtStart(instr->left());
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = FixedTemp(rax);
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = FixedTemp(rdx);
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LModByConstI(
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp1, temp2), rax);
1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseFixed(instr->left(), rax);
1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(rdx);
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LModI(
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp), rdx);
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->RightIsPowerOf2()) {
1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoModByPowerOf2I(instr);
1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (instr->right()->IsConstant()) {
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoModByConstI(instr);
149844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoModI(instr);
150044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsDouble()) {
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticD(Token::MOD, instr);
1503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(Token::MOD, instr);
1505e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1514109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    HValue* h_right = instr->BetterRightOperand();
1515109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    LOperand* right = UseOrConstant(h_right);
15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LMulI* mul = new(zone()) LMulI(left, right);
1517109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    int constant_value =
1518109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        h_right->IsConstant() ? HConstant::cast(h_right)->Integer32Value() : 0;
1519109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // |needs_environment| must mirror the cases where LCodeGen::DoMulI calls
1520109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // |DeoptimizeIf|.
1521109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    bool needs_environment =
1522109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        instr->CheckFlag(HValue::kCanOverflow) ||
1523109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        (instr->CheckFlag(HValue::kBailoutOnMinusZero) &&
1524109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch         (!right->IsConstantOperand() || constant_value <= 0));
1525109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (needs_environment) {
15263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AssignEnvironment(mul);
15273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
15283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(mul);
15291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsDouble()) {
15301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::MUL, instr);
15311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
15321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::MUL, instr);
15331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) {
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
15411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* left = UseRegisterAtStart(instr->left());
1542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* right;
1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (SmiValuesAre32Bits() && instr->representation().IsSmi()) {
1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // We don't support tagged immediates, so we request it in a register.
1545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseRegisterAtStart(instr->right());
1546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseOrConstantAtStart(instr->right());
1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LSubI* sub = new(zone()) LSubI(left, right);
15501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LInstruction* result = DefineSameAsFirst(sub);
15511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (instr->CheckFlag(HValue::kCanOverflow)) {
15521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      result = AssignEnvironment(result);
15531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
15541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return result;
15551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsDouble()) {
15561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::SUB, instr);
15571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
15581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::SUB, instr);
15591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Check to see if it would be advantageous to use an lea instruction rather
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // than an add. This is the case when no overflow check is needed and there
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // are multiple uses of the add's inputs, so using a 3-register add will
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // preserve all input values for later uses.
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool use_lea = LAddI::UseLea(instr);
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_candidate = instr->BetterRightOperand();
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right;
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (SmiValuesAre32Bits() && instr->representation().IsSmi()) {
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // We cannot add a tagged immediate to a tagged value,
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // so we request it in a register.
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = UseRegisterAtStart(right_candidate);
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = use_lea ? UseRegisterOrConstantAtStart(right_candidate)
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      : UseOrConstantAtStart(right_candidate);
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result = use_lea ? DefineAsRegister(add)
1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   : DefineSameAsFirst(add);
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (can_overflow) {
1588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      result = AssignEnvironment(result);
1589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
1590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return result;
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsExternal()) {
1592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(instr->IsConsistentExternalRepresentation());
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool use_lea = LAddI::UseLea(instr);
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_candidate = instr->right();
1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = use_lea
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegisterOrConstantAtStart(right_candidate)
1599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseOrConstantAtStart(right_candidate);
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result = use_lea
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? DefineAsRegister(add)
1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : DefineSameAsFirst(add);
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
1605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (instr->representation().IsDouble()) {
1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return DoArithmeticD(Token::ADD, instr);
1607b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
1608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return DoArithmeticT(Token::ADD, instr);
1609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left = NULL;
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = NULL;
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmi()) {
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->BetterLeftOperand());
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseAtStart(instr->BetterRightOperand());
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsInteger32()) {
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->BetterLeftOperand());
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseOrConstantAtStart(instr->BetterRightOperand());
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->representation().IsDouble());
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->left());
1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseRegisterAtStart(instr->right());
1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathMinMax* minmax = new(zone()) LMathMinMax(left, right);
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineSameAsFirst(minmax);
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1635b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // We call a C function for double power. It can't trigger a GC.
1638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // We need to use fixed result register for the call.
1639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Representation exponent_type = instr->right()->representation();
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsDouble());
1641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* left = UseFixedDouble(instr->left(), xmm2);
1642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right =
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      exponent_type.IsDouble()
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ? UseFixedDouble(instr->right(), xmm1)
1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LPower* result = new(zone()) LPower(left, right);
16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, xmm3), instr,
1648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                    CAN_DEOPTIMIZE_EAGERLY);
1649b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1650b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1651b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16523fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsTagged());
1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsTagged());
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCmpT* result = new(zone()) LCmpT(context, left, right);
16593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
16603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCompareNumericAndBranch* instr) {
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = instr->representation();
1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsSmiOrInteger32()) {
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(r));
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(r));
16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
16701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* right = UseOrConstantAtStart(instr->right());
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone()) LCompareNumericAndBranch(left, right);
16723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } else {
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(r.IsDouble());
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().IsDouble());
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().IsDouble());
16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left;
16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right;
16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->left()->IsConstant() && instr->right()->IsConstant()) {
16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterOrConstantAtStart(instr->left());
16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      right = UseRegisterOrConstantAtStart(instr->right());
16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterAtStart(instr->left());
16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      right = UseRegisterAtStart(instr->right());
16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone()) LCompareNumericAndBranch(left, right);
16861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16903fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HCompareObjectEqAndBranch* instr) {
16921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* left = UseRegisterAtStart(instr->left());
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = UseRegisterOrConstantAtStart(instr->right());
16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpObjectEqAndBranch(left, right);
1695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1696b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1697b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCompareHoleAndBranch* instr) {
17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LCmpHoleAndBranch(value);
1702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsStringAndBranch(value, temp);
1710592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1711592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1712592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
17133fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1716b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1717b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
17193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
17203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HIsUndetectableAndBranch* instr) {
1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsUndetectableAndBranch(value, temp);
17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch(
17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStringCompareAndBranch* instr) {
17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsTagged());
1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsTagged());
1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
17353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCompareAndBranch* result =
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCompareAndBranch(context, left, right);
17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
1740592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1741592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1742592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
17433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
17443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HHasInstanceTypeAndBranch* instr) {
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasInstanceTypeAndBranch(value);
1748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    HGetCachedArrayIndex* instr)  {
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
1754e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1755e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
1757b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
17613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HHasCachedArrayIndexAndBranch* instr) {
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasCachedArrayIndexAndBranch(value);
1765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1767b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
17693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HClassOfTestAndBranch* instr) {
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegister(instr->value());
17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LClassOfTestAndBranch(value,
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister(),
17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister());
1774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string = UseRegisterAtStart(instr->string());
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
17813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string = UseRegisterAtStart(instr->string());
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = FLAG_debug_code
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseRegisterAtStart(instr->index())
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseRegisterOrConstantAtStart(instr->index());
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = FLAG_debug_code
1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseRegisterAtStart(instr->value())
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseRegisterOrConstantAtStart(instr->value());
1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), rsi) : NULL;
1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LSeqStringSetChar(context, string,
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                       index, value);
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_debug_code) {
1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = MarkAsCall(result, instr);
1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_debug_code && instr->skip_check()) return NULL;
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length = !index->IsConstantOperand()
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseOrConstantAtStart(instr->length())
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseAtStart(instr->length());
1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LBoundsCheck(index, length);
1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_debug_code || !instr->skip_check()) {
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
18135d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}
18145d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
18155d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBoundsCheckBaseIndexInformation* instr) {
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNREACHABLE();
1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
18201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
18211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18231e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
18241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The control instruction marking the end of a block that completed
18251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // abruptly (e.g., threw an exception).  There is nothing specific to do.
1826b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18303fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
18313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return NULL;
18323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
18333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1835257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // All HForceRepresentation instructions should be eliminated in the
1837257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // representation change phase of Hydrogen.
1838257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UNREACHABLE();
1839257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return NULL;
1840257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1841257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1842257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1843b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) {
18441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation from = instr->from();
18451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation to = instr->to();
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* val = instr->value();
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (from.IsSmi()) {
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged()) {
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    from = Representation::Tagged();
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
18541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (from.IsTagged()) {
18551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsDouble()) {
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value));
1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->type().IsSmi()) {
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineSameAsFirst(new(zone()) LDummyUse(value));
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
18661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsInteger32());
1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->type().IsSmi() || val->representation().IsSmi()) {
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
18733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        bool truncating = instr->CanTruncateToInt32();
18743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1);
1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LInstruction* result =
1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp));
1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return result;
18791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
18801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
18811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (from.IsDouble()) {
18821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsTagged()) {
1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      info()->MarkAsDeferredCalling();
1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
18851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* temp = TempRegister();
18861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LUnallocated* result_temp = TempRegister();
18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberTagD* result = new(zone()) LNumberTagD(value, temp);
18881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      return AssignPointerMap(Define(result, result_temp));
1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignEnvironment(
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
18931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsInteger32());
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value));
1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result);
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
18991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
19001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (from.IsInteger32()) {
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info()->MarkAsDeferredCalling();
19021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsTagged()) {
1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!instr->CheckFlag(HValue::kCanOverflow)) {
1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LSmiTag(value));
1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (val->CheckFlag(HInstruction::kUint32)) {
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp1 = TempRegister();
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = FixedTemp(xmm1);
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return AssignPointerMap(DefineSameAsFirst(result));
19121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      } else {
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp1 = SmiValuesAre32Bits() ? NULL : TempRegister();
1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = SmiValuesAre32Bits() ? NULL : FixedTemp(xmm1);
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2);
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return AssignPointerMap(DefineSameAsFirst(result));
19181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->CheckFlag(HValue::kCanOverflow)) {
1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        result = AssignEnvironment(result);
1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
19261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsDouble());
1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->CheckFlag(HInstruction::kUint32)) {
1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = Use(val);
1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LInteger32ToDouble(value));
1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
19341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
19351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
19361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  UNREACHABLE();
1937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1939b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1940b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
19421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LCheckNonSmi(value);
1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!instr->value()->type().IsHeapObject()) {
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1948b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1949b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
19521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(new(zone()) LCheckSmi(value));
1954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoCheckArrayBufferNotNeutered(
1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HCheckArrayBufferNotNeutered* instr) {
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* view = UseRegisterAtStart(instr->value());
1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LCheckArrayBufferNotNeutered* result =
1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LCheckArrayBufferNotNeutered(view);
1962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignEnvironment(result);
1963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
19671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCheckInstanceType* result = new(zone()) LCheckInstanceType(value);
1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(result);
1970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
19741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(new(zone()) LCheckValue(value));
1976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
19811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->HasMigrationTarget()) {
1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info()->MarkAsDeferredCalling();
1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignPointerMap(result);
1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1990b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1992257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value = instr->value();
1993257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Representation input_rep = value->representation();
1994257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* reg = UseRegister(value);
1995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (input_rep.IsDouble()) {
1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LClampDToUint8(reg));
1997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (input_rep.IsInteger32()) {
19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(new(zone()) LClampIToUint8(reg));
1999257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(input_rep.IsSmiOrTagged());
2001257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Register allocator doesn't (yet) support allocation of double
2002257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // temps. Reserve xmm1 explicitly.
20033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LClampTToUint8* result = new(zone()) LClampTToUint8(reg,
20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        FixedTemp(xmm1));
2005257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return AssignEnvironment(DefineSameAsFirst(result));
2006257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2007257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) {
2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value = instr->value();
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(value->representation().IsDouble());
2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value)));
2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) {
2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* lo = UseRegister(instr->lo());
2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* hi = UseRegister(instr->hi());
2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LConstructDouble(hi, lo));
2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2024b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = info()->IsStub() ? UseFixed(instr->context(), rsi) : NULL;
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LReturn(
2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->value(), rax), context, parameter_count);
2029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2032b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
2033b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Representation r = instr->representation();
2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsSmi()) {
2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LConstantS);
2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (r.IsInteger32()) {
20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantI);
2038b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (r.IsDouble()) {
2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return DefineAsRegister(new (zone()) LConstantD);
2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (r.IsExternal()) {
2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LConstantE);
2042b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (r.IsTagged()) {
20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantT);
2044b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
2045b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    UNREACHABLE();
2046b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return NULL;
2047b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2048b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2049b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2050b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
20518b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* global_object =
2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister());
2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* vector = NULL;
2056958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (instr->HasVectorAndSlot()) {
2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister());
2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadGlobalGeneric* result =
2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LLoadGlobalGeneric(context, global_object, vector);
20628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
20638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
20648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
20658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2066b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
2067e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
20693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineAsRegister(new(zone()) LLoadContextSlot(context));
2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2074b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2075b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2076b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
20771e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
2078e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context;
2079e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value;
2080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* temp;
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context = UseRegister(instr->context());
2082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (instr->NeedsWriteBarrier()) {
2083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value = UseTempRegister(instr->value());
2084e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temp = TempRegister();
2085e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
2086e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value = UseRegister(instr->value());
2087e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temp = NULL;
2088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
20893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp);
2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
20971e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use the special mov rax, moffs64 encoding for external
2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // memory accesses with 64-bit word-sized values.
2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->access().IsExternalMemory() &&
2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->access().offset() == 0 &&
2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->access().representation().IsSmi() ||
2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       instr->access().representation().IsTagged() ||
2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       instr->access().representation().IsHeapObject() ||
2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       instr->access().representation().IsExternal())) {
2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* obj = UseRegisterOrConstantAtStart(instr->object());
2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(new(zone()) LLoadNamedField(obj), rax);
2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* obj = UseRegisterAtStart(instr->object());
21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
21111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
21121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object =
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* vector = NULL;
2119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (instr->HasVectorAndSlot()) {
2120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister());
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(
2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      context, object, vector);
21241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return MarkAsCall(DefineFixed(result, rax), instr);
2125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
2129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadFunctionPrototype* instr) {
21301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return AssignEnvironment(DefineAsRegister(
21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
2132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LLoadRoot);
21371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
21381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) {
2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We sign extend the dehoisted key at the definition point when the pointer
2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use
2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // points and should not invoke this function. We can't use STATIC_ASSERT
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // here as the pointer size is 32-bit for x32.
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(kPointerSize == kInt64Size);
2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BitVector* dehoisted_key_ids = chunk_->GetDehoistedKeyIds();
2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (dehoisted_key_ids->Contains(candidate->id())) return;
2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  dehoisted_key_ids->Add(candidate->id());
2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!candidate->IsPhi()) return;
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < candidate->OperandCount(); ++i) {
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FindDehoistedKeyDefinitions(candidate->OperandAt(i));
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((kPointerSize == kInt64Size &&
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          instr->key()->representation().IsInteger32()) ||
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (kPointerSize == kInt32Size &&
2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          instr->key()->representation().IsSmiOrInteger32()));
2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key = NULL;
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = NULL;
21641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize == kInt64Size) {
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = UseRegisterOrConstantAtStart(instr->key());
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool clobbers_key = ExternalArrayOpRequiresTemp(
2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->key()->representation(), elements_kind);
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = clobbers_key
2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseTempRegister(instr->key())
2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterOrConstantAtStart(instr->key());
2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) {
2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FindDehoistedKeyDefinitions(instr->key());
2177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!instr->is_fixed_typed_array()) {
2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* obj = UseRegisterAtStart(instr->elements());
2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = DefineAsRegister(new (zone()) LLoadKeyed(obj, key, nullptr));
2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(
2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (instr->representation().IsInteger32() &&
2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         !(IsDoubleOrFloatElementsKind(elements_kind))) ||
2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (instr->representation().IsDouble() &&
2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (IsDoubleOrFloatElementsKind(elements_kind))));
2188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* backing_store = UseRegister(instr->elements());
2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* backing_store_owner = UseAny(instr->backing_store_owner());
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = DefineAsRegister(
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new (zone()) LLoadKeyed(backing_store, key, backing_store_owner));
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool needs_environment;
2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->is_fixed_typed_array()) {
2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // see LCodeGen::DoLoadKeyedExternalArray
2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    needs_environment = elements_kind == UINT32_ELEMENTS &&
2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        !instr->CheckFlag(HInstruction::kUint32);
2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // see LCodeGen::DoLoadKeyedFixedDoubleArray and
2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // LCodeGen::DoLoadKeyedFixedArray
2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    needs_environment =
2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instr->RequiresHoleCheck() ||
2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        (instr->hole_mode() == CONVERT_HOLE_TO_UNDEFINED && info()->IsStub());
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (needs_environment) {
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object =
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister());
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* vector = NULL;
2220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (instr->HasVectorAndSlot()) {
2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister());
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2223e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadKeyedGeneric* result =
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LLoadKeyedGeneric(context, object, key, vector);
2226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
2227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
22323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) {
2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FindDehoistedKeyDefinitions(instr->key());
2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!instr->is_fixed_typed_array()) {
2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->elements()->representation().IsTagged());
2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool needs_write_barrier = instr->NeedsWriteBarrier();
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* object = NULL;
2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* key = NULL;
2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* val = NULL;
2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation value_representation = instr->value()->representation();
2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value_representation.IsDouble()) {
2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      object = UseRegisterAtStart(instr->elements());
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      val = UseRegisterAtStart(instr->value());
2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      key = UseRegisterOrConstantAtStart(instr->key());
2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
2250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(value_representation.IsSmiOrTagged() ||
2251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             value_representation.IsInteger32());
2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (needs_write_barrier) {
2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object = UseTempRegister(instr->elements());
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val = UseTempRegister(instr->value());
2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key = UseTempRegister(instr->key());
2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object = UseRegisterAtStart(instr->elements());
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val = UseRegisterOrConstantAtStart(instr->value());
2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key = UseRegisterOrConstantAtStart(instr->key());
2260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
22623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new (zone()) LStoreKeyed(object, key, val, nullptr);
2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(
2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (instr->value()->representation().IsInteger32() &&
2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       !IsDoubleOrFloatElementsKind(elements_kind)) ||
2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (instr->value()->representation().IsDouble() &&
2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       IsDoubleOrFloatElementsKind(elements_kind)));
2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(instr->elements()->representation().IsExternal());
2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool val_is_temp_register = elements_kind == UINT8_CLAMPED_ELEMENTS ||
2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              elements_kind == FLOAT32_ELEMENTS;
2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* val = val_is_temp_register ? UseTempRegister(instr->value())
22758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : UseRegister(instr->value());
2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key = NULL;
2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize == kInt64Size) {
2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = UseRegisterOrConstantAtStart(instr->key());
2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool clobbers_key = ExternalArrayOpRequiresTemp(
2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->key()->representation(), elements_kind);
2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = clobbers_key
2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseTempRegister(instr->key())
2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterOrConstantAtStart(instr->key());
2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* backing_store = UseRegister(instr->elements());
2287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner = UseAny(instr->backing_store_owner());
2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LStoreKeyed(backing_store, key, val, backing_store_owner);
2289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
2290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object =
2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister());
2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->object()->representation().IsTagged());
2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->key()->representation().IsTagged());
2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
2302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* slot = NULL;
2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* vector = NULL;
2305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->HasVectorAndSlot()) {
2306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    slot = FixedTemp(VectorStoreICDescriptor::SlotRegister());
2307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    vector = FixedTemp(VectorStoreICDescriptor::VectorRegister());
2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LStoreKeyedGeneric* result = new (zone())
2311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LStoreKeyedGeneric(context, object, key, value, slot, vector);
2312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(result, instr);
2313b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2314b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2315b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind(
23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HTransitionElementsKind* instr) {
2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseRegister(instr->object());
23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = TempRegister();
23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* temp_reg = TempRegister();
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTransitionElementsKind* result = new(zone()) LTransitionElementsKind(
2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object, NULL, new_map_reg, temp_reg);
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
23263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseFixed(instr->object(), rax);
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseFixed(instr->context(), rsi);
23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(result, instr);
23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento(
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HTrapAllocationMemento* instr) {
2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object = UseRegister(instr->object());
2338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempRegister();
2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTrapAllocationMemento* result =
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LTrapAllocationMemento(object, temp);
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(result);
2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoMaybeGrowElements(HMaybeGrowElements* instr) {
2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  info()->MarkAsDeferredCalling();
2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object = Use(instr->object());
2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* elements = Use(instr->elements());
2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* current_capacity = UseRegisterOrConstant(instr->current_capacity());
2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LMaybeGrowElements* result = new (zone())
2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LMaybeGrowElements(context, object, elements, key, current_capacity);
2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DefineFixed(result, rax);
2356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignPointerMap(AssignEnvironment(result));
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_in_object = instr->access().IsInobject();
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_external_location = instr->access().IsExternalMemory() &&
2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->access().offset() == 0;
23641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool needs_write_barrier = instr->NeedsWriteBarrier();
2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool needs_write_barrier_for_map = instr->has_transition() &&
2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->NeedsWriteBarrierForMap();
2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* obj;
2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (needs_write_barrier) {
2370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = is_in_object
2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegister(instr->object())
2372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseTempRegister(instr->object());
2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_external_location) {
2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!is_in_object);
2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!needs_write_barrier);
2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!needs_write_barrier_for_map);
2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = UseRegisterOrConstant(instr->object());
2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = needs_write_barrier_for_map
2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegister(instr->object())
2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterAtStart(instr->object());
2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
23831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool can_be_constant = instr->value()->IsConstant() &&
2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant::cast(instr->value())->NotInNewSpace() &&
2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->field_representation().IsDouble();
2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* val;
2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (needs_write_barrier) {
2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseTempRegister(instr->value());
2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_external_location) {
2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseFixed(instr->value(), rax);
2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (can_be_constant) {
2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegisterOrConstant(instr->value());
2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->field_representation().IsDouble()) {
2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegisterAtStart(instr->value());
2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegister(instr->value());
2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
24001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
24011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // We only need a scratch register if we have a write barrier or we
24021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // have a store into the properties array (not in-object-property).
2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = (!is_in_object || needs_write_barrier ||
2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      needs_write_barrier_for_map) ? TempRegister() : NULL;
24051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreNamedField(obj, val, temp);
2407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2408b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object =
2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
2415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* slot = NULL;
2416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* vector = NULL;
2417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->HasVectorAndSlot()) {
2418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    slot = FixedTemp(VectorStoreICDescriptor::SlotRegister());
2419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    vector = FixedTemp(VectorStoreICDescriptor::VectorRegister());
2420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStoreNamedGeneric* result =
2423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LStoreNamedGeneric(context, object, value, slot, vector);
2424e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(result, instr);
2425b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2426b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2427b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(
2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineFixed(new(zone()) LStringAdd(context, left, right), rax), instr);
2434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
24371e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
243869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* string = UseTempRegister(instr->string());
243969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* index = UseTempRegister(instr->index());
2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharCodeAt* result =
2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCharCodeAt(context, string, index);
2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
2444b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2446b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
244744f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
244844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* char_code = UseRegister(instr->value());
2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharFromCode* result =
2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCharFromCode(context, char_code);
245244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return AssignPointerMap(DefineAsRegister(result));
245344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
245444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
245544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsDeferredCalling();
2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* size = instr->size()->IsConstant()
2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseConstant(instr->size())
2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseTempRegister(instr->size());
2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempRegister();
2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LAllocate* result = new(zone()) LAllocate(context, size, temp);
24643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(argument_count_ == 0);
2470e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  allocator_->MarkAsOsrEntry();
2471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  current_block_->last_environment()->set_ast_id(instr->ast_id());
24723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LOsrEntry);
2473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LParameter* result = new(zone()) LParameter;
2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->kind() == HParameter::STACK_PARAMETER) {
2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int spill_index = chunk()->GetParameterStackSlot(instr->index());
2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsSpilled(result, spill_index);
2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(info()->IsStub());
2483109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    CallInterfaceDescriptor descriptor = graph()->descriptor();
2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index = static_cast<int>(instr->index());
2485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Register reg = descriptor.GetRegisterParameter(index);
2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(result, reg);
2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use an index that corresponds to the location in the unoptimized frame,
2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // which the optimized frame will subsume.
2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int env_index = instr->index();
2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int spill_index = 0;
2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->environment()->is_parameter_index(env_index)) {
2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    spill_index = chunk()->GetParameterStackSlot(env_index);
2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    spill_index = env_index - instr->environment()->first_local_index();
2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Retry(kTooManySpillSlotsNeededForOSR);
2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      spill_index = 0;
2503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2504109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    spill_index += StandardFrameConstants::kFixedSlotCount;
25057d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  }
25063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
2511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // There are no real uses of the arguments object.
2512e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // arguments.length and element access are supported directly on
2513e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // stack arguments, and any real arguments object use causes a bailout.
2514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // So this value is never used.
2515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->ReplayEnvironment(current_block_->last_environment());
2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // There are no real uses of a captured object.
2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* args = UseRegister(instr->arguments());
2530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length;
2531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index;
2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->length()->IsConstant() && instr->index()->IsConstant()) {
2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    length = UseRegisterOrConstant(instr->length());
2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    index = UseOrConstant(instr->index());
2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    length = UseTempRegister(instr->length());
2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    index = Use(instr->index());
2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
2540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
254344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
254444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* object = UseFixed(instr->value(), rax);
25453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LToFastProperties* result = new(zone()) LToFastProperties(object);
254644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return MarkAsCall(DefineFixed(result, rax), instr);
254744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
254844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
254944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* value = UseFixed(instr->value(), rbx);
2553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTypeof* result = new(zone()) LTypeof(context, value);
2554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
2555b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
25583fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
25593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
2560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
25621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->ReplayEnvironment(current_block_->last_environment());
2565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2569b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsDeferredCalling();
25713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (instr->is_function_entry()) {
2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseFixed(instr->context(), rsi);
2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(new(zone()) LStackCheck(context), instr);
25743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } else {
2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->is_backwards_branch());
2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseAny(instr->context());
2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return AssignEnvironment(
2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        AssignPointerMap(new(zone()) LStackCheck(context)));
25793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
25841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HEnvironment* outer = current_block_->last_environment();
2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  outer->set_ast_id(instr->ReturnId());
25861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HConstant* undefined = graph()->GetConstantUndefined();
25871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
25883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->arguments_count(),
25891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                               instr->function(),
2590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                               undefined,
2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               instr->inlining_kind());
2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only replay binding of arguments object if it wasn't removed from graph.
2593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inner->Bind(instr->arguments_var(), instr->arguments_object());
25953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inner->BindContext(instr->closure_context());
2597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inner->set_entry(instr);
25981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  current_block_->UpdateEnvironment(inner);
2599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  chunk_->AddInlinedFunction(instr->shared());
2600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* pop = NULL;
2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnvironment* env = current_block_->last_environment();
2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (env->entry()->arguments_pushed()) {
2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int argument_count = env->arguments_environment()->parameter_count();
2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    pop = new(zone()) LDrop(argument_count);
2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->argument_delta() == -argument_count);
2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment()->
26163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DiscardInlined(false);
26171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  current_block_->UpdateEnvironment(outer);
2618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return pop;
2620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2622257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
26233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
26253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->enumerable(), rax);
2626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
26273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
26283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
26293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
26303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
26313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
26323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegister(instr->map());
26333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(
26343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LForInCacheArray(map)));
26353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
26363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
26373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
26383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
26393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
26403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegisterAtStart(instr->map());
26413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
26423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
26433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
26443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
26453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
26463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegister(instr->object());
26473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseTempRegister(instr->index());
2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
2649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(load);
2650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignPointerMap(result);
2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseRegisterAtStart(instr->context());
2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LStoreFrameContext(context);
2657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2663b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif  // V8_TARGET_ARCH_X64
2664