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"
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h"
159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
16086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace v8 {
17086aeeaae12517475c22695a200be45495516549Ben Murdochnamespace internal {
189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
19b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DEFINE_COMPILE(type)                            \
20b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void L##type::CompileToNative(LCodeGen* generator) {  \
21b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    generator->Do##type(this);                          \
22b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
23b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
24b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DEFINE_COMPILE
25b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
26b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid LInstruction::VerifyCall() {
29257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Call instructions can use only fixed registers as temporaries and
30257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // outputs because all registers are blocked by the calling convention.
31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Inputs operands must use a fixed register or use-at-start policy or
32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // a non-register policy.
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(Output() == NULL ||
341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         LUnallocated::cast(Output())->HasFixedPolicy() ||
351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         !LUnallocated::cast(Output())->HasRegisterPolicy());
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (UseIterator it(this); !it.Done(); it.Advance()) {
373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operand->HasFixedPolicy() ||
39257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch           operand->IsUsedAtStart());
401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (TempIterator it(this); !it.Done(); it.Advance()) {
423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LInstruction::PrintTo(StringStream* stream) {
50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("%s ", this->Mnemonic());
511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  PrintOutputOperandTo(stream);
53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  PrintDataTo(stream);
55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (HasEnvironment()) {
57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" ");
58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    environment()->PrintTo(stream);
59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (HasPointerMap()) {
62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" ");
63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    pointer_map()->PrintTo(stream);
64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
67b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) {
69b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("= ");
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < InputCount(); i++) {
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (i > 0) stream->Add(" ");
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (InputAt(i) == NULL) {
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      stream->Add("NULL");
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      InputAt(i)->PrintTo(stream);
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
79b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (HasResult()) result()->PrintTo(stream);
83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
84b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLabel::PrintDataTo(StringStream* stream) {
87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LGap::PrintDataTo(stream);
88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLabel* rep = replacement();
89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (rep != NULL) {
90b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(" Dead block replaced with B%d", rep->block_id());
91b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochbool LGap::IsRedundant() const {
96b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < 4; i++) {
97b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return false;
99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return true;
103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGap::PrintDataTo(StringStream* stream) {
107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  for (int i = 0; i < 4; i++) {
108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add("(");
109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[i] != NULL) {
110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      parallel_moves_[i]->PrintDataTo(stream);
111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    stream->Add(") ");
113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticD::Mnemonic() const {
118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  switch (op()) {
119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::ADD: return "add-d";
120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::SUB: return "sub-d";
121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MUL: return "mul-d";
122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::DIV: return "div-d";
123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MOD: return "mod-d";
124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    default:
125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      UNREACHABLE();
126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return NULL;
127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst char* LArithmeticT::Mnemonic() const {
132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  switch (op()) {
133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::ADD: return "add-t";
134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::SUB: return "sub-t";
135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MUL: return "mul-t";
136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::MOD: return "mod-t";
137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    case Token::DIV: return "div-t";
1381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_AND: return "bit-and-t";
1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_OR: return "bit-or-t";
1401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::BIT_XOR: return "bit-xor-t";
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case Token::ROR: return "ror-t";
1421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SHL: return "sal-t";
1431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SAR: return "sar-t";
1441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case Token::SHR: return "shr-t";
145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    default:
146b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      UNREACHABLE();
147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      return NULL;
148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const {
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !gen->IsNextEmittedBlock(block_id());
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int R>
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LTemplateResultInstruction<R>::MustSignExtendResult(
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LPlatformChunk* chunk) const {
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* hvalue = this->hydrogen_value();
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return hvalue != NULL &&
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      hvalue->representation().IsInteger32() &&
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk->GetDehoistedKeyIds()->Contains(hvalue->id());
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LGoto::PrintDataTo(StringStream* stream) {
168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("B%d", block_id());
169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LBranch::PrintDataTo(StringStream* stream) {
173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if ");
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  left()->PrintTo(stream);
181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" %s ", Token::String(op()));
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  right()->PrintTo(stream);
183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_string(");
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if is_smi(");
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("if is_undetectable(");
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
204257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if string_compare(");
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  left()->PrintTo(stream);
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  right()->PrintTo(stream);
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
217b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if has_instance_type(");
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
222b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if class_of_test(");
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
226b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(", \"%o\") then B%d else B%d",
227b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              *hydrogen()->class_name(),
228b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              true_block_id(),
229b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              false_block_id());
230b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
231b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("if typeof ");
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" == \"%s\" then B%d else B%d",
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              hydrogen()->type_literal()->ToCString().get(),
238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch              true_block_id(), false_block_id());
239b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
240b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
241b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" = ");
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(".code_entry = ");
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code_object()->PrintTo(stream);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" = ");
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base_object()->PrintTo(stream);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" + ");
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  offset()->PrintTo(stream);
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < InputCount(); i++) {
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InputAt(i)->PrintTo(stream);
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" ");
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add("#%d / ", arity());
264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
265b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context()->PrintTo(stream);
2691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d]", slot_index());
270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
273e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context()->PrintTo(stream);
275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[%d] <- ", slot_index());
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
279e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("= ");
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" #%d / ", arity());
284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) {
288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add("= ");
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  constructor()->PrintTo(stream);
290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" #%d / ", arity());
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind kind = hydrogen()->elements_kind();
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" (%s) ", ElementsKindToString(kind));
293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
295b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  arguments()->PrintTo(stream);
298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" length ");
300b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  length()->PrintTo(stream);
301b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
302b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  stream->Add(" index ");
303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  index()->PrintTo(stream);
304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kind == DOUBLE_REGISTERS && kDoubleSize == 2 * kPointerSize) {
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Skip a slot if for a double-width slot for x32 port.
310109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    current_frame_slots_++;
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The spill slot's address is at rbp - (index + 1) * kPointerSize -
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // StandardFrameConstants::kFixedFrameSizeFromFp. kFixedFrameSizeFromFp is
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // 2 * kPointerSize, if rbp is aligned at 8-byte boundary, the below "|= 1"
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // will make sure the spilled doubles are aligned at 8-byte boundary.
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(haitao): make sure rbp is aligned at 8-byte boundary for x32 port.
316109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    current_frame_slots_ |= 1;
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
318109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return current_frame_slots_++;
319b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) {
323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // All stack slots are Double stack slots on x64.
324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Alternatively, at some point, start using half-size
325b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // stack slots for int32 values.
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index = GetNextSpillIndex(kind);
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kind == DOUBLE_REGISTERS) {
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LDoubleStackSlot::Create(index, zone());
329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(kind == GENERAL_REGISTERS);
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LStackSlot::Create(index, zone());
332b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
333b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
334b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
335b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintTo(stream);
338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::ostringstream os;
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os << hydrogen()->access() << " <- ";
340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  stream->Add(os.str().c_str());
341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintTo(stream);
342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  elements()->PrintTo(stream);
347e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintTo(stream);
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hydrogen()->IsDehoisted()) {
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" + %d]", base_offset());
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("]");
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
354e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
355e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
3583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elements()->PrintTo(stream);
3593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("[");
3603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  key()->PrintTo(stream);
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hydrogen()->IsDehoisted()) {
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" + %d] <-", base_offset());
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("] <- ");
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value() == NULL) {
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(hydrogen()->IsConstantHoleStore() &&
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           hydrogen()->value()->representation().IsDouble());
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("<the hole(nan)>");
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value()->PrintTo(stream);
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
3753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() {
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_unused());
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  chunk_ = new(zone()) LPlatformChunk(info(), graph());
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LPhase phase("L_Building chunk", chunk_);
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  status_ = BUILDING;
388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If compiling for OSR, reserve space for the unoptimized frame,
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // which will be subsumed into this frame.
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (graph()->has_osr()) {
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
396b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
397086aeeaae12517475c22695a200be45495516549Ben Murdoch  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
398086aeeaae12517475c22695a200be45495516549Ben Murdoch  for (int i = 0; i < blocks->length(); i++) {
399086aeeaae12517475c22695a200be45495516549Ben Murdoch    HBasicBlock* next = NULL;
400086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (i < blocks->length() - 1) next = blocks->at(i + 1);
401086aeeaae12517475c22695a200be45495516549Ben Murdoch    DoBasicBlock(blocks->at(i), next);
402086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (is_aborted()) return NULL;
403086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
404086aeeaae12517475c22695a200be45495516549Ben Murdoch  status_ = DONE;
405086aeeaae12517475c22695a200be45495516549Ben Murdoch  return chunk_;
4069fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}
4079fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
4089fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LUnallocated(LUnallocated::FIXED_REGISTER, reg.code());
411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::ToUnallocated(XMMRegister reg) {
415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone())
416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, reg.code());
417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value, ToUnallocated(fixed_register));
422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
423b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
424b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
425b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, XMMRegister reg) {
426b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value, ToUnallocated(reg));
427b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
428b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
429b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
430b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) {
4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
432b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Use(value,
4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
438b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                              LUnallocated::USED_AT_START));
439b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
440b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
441b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
442b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
444b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
446b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseTempRegisterOrConstant(HValue* value) {
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return value->IsConstant()
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseTempRegister(value);
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
454b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value) {
4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) {
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                     LUnallocated::USED_AT_START));
462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : Use(value);
469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
474b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseAtStart(value);
476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
478b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
479b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseRegister(value);
483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : UseRegisterAtStart(value);
490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) {
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return chunk_->DefineConstantOperand(HConstant::cast(value));
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::UseAny(HValue* value) {
499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return value->IsConstant()
500b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (value->EmitAtUses()) {
507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HInstruction* instr = HInstruction::cast(value);
508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    VisitInstruction(instr);
509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(value->id());
511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                    LUnallocated* result) {
5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result->set_virtual_register(current_instruction_->id());
518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  instr->set_result(result);
519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsRegister(
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr) {
5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineAsSpilled(
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr,
532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    int index) {
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
538b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineSameAsFirst(
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr) {
5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DefineFixed(LTemplateResultInstruction<1>* instr,
546b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                         Register reg) {
547b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Define(instr, ToUnallocated(reg));
548b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
549b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
551b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DefineFixedDouble(
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr,
553b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    XMMRegister reg) {
554b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Define(instr, ToUnallocated(reg));
555b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HEnvironment* hydrogen_env = current_block_->last_environment();
5603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return LChunkBuilderBase::AssignEnvironment(instr, hydrogen_env);
561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                        HInstruction* hinstr,
566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                        CanDeoptimize can_deoptimize) {
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsNonDeferredCalling();
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
5701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->VerifyCall();
5711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
5721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  instr->MarkAsCall();
573b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  instr = AssignPointerMap(instr);
574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // If instruction does not have side-effects lazy deoptimization
576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // after the call will try to deoptimize to the point before the call.
577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Thus we still need to attach environment to this call even if
578b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // call sequence can not deoptimize eagerly.
579b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool needs_environment =
5803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !hinstr->HasObservableSideEffects();
582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (needs_environment && !instr->HasEnvironment()) {
583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    instr = AssignEnvironment(instr);
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We can't really figure out if the environment is needed or not.
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->environment()->set_has_been_used();
586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!instr->HasPointerMap());
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return instr;
596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLUnallocated* LChunkBuilder::TempRegister() {
6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand =
6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int vreg = allocator_->GetVirtualRegister();
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!allocator_->AllocationOk()) {
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    vreg = 0;
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  operand->set_virtual_register(vreg);
608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) {
613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* operand = ToUnallocated(reg);
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(operand->HasFixedPolicy());
615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
617b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLOperand* LChunkBuilder::FixedTemp(XMMRegister reg) {
620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* operand = ToUnallocated(reg);
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(operand->HasFixedPolicy());
622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return operand;
623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LLabel(instr->block());
628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNREACHABLE();
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
6393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
6403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
642b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoShift(Token::Value op,
6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                     HBitwiseBinaryOperation* instr) {
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
6531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_value = instr->right();
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = NULL;
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int constant_value = 0;
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool does_deopt = false;
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right_value->IsConstant()) {
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant* constant = HConstant::cast(right_value);
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = chunk_->DefineConstantOperand(constant);
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      constant_value = constant->Integer32Value() & 0x1f;
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (SmiValuesAre31Bits() && instr->representation().IsSmi() &&
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          constant_value > 0) {
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // Left shift can deoptimize if we shift by > 0 and the result
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // cannot be truncated to smi.
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = UseFixed(right_value, rcx);
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
6711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Shift operations can only deoptimize if we do a logical shift by 0 and
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // the result cannot be truncated to int32.
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (op == Token::SHR && constant_value == 0) {
675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      does_deopt = !instr->CheckFlag(HInstruction::kUint32);
6761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
6771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result =
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DefineSameAsFirst(new(zone()) LShiftI(op, left, right, does_deopt));
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return does_deopt ? AssignEnvironment(result) : result;
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(op, instr);
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
684b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
685b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                           HArithmeticBinaryOperation* instr) {
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsDouble());
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsDouble());
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op == Token::MOD) {
69313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    LOperand* left = UseFixedDouble(instr->BetterLeftOperand(), xmm0);
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseFixedDouble(instr->BetterRightOperand(), xmm1);
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
69613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return MarkAsCall(DefineFixedDouble(result, xmm0), instr);
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseRegisterAtStart(instr->BetterRightOperand());
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return CpuFeatures::IsSupported(AVX) ? DefineAsRegister(result)
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         : DefineSameAsFirst(result);
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
704b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
705b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
706b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           HBinaryOperation* instr) {
709b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* left = instr->left();
710b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* right = instr->right();
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(left->representation().IsTagged());
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(right->representation().IsTagged());
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* left_operand = UseFixed(left, rdx);
715b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* right_operand = UseFixed(right, rax);
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticT* result =
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
718b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
719b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
720b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
721b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
722b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_building());
724b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_block_ = block;
725b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  next_block_ = next_block;
726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (block->IsStartBlock()) {
727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(graph_->start_environment());
728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = 0;
729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (block->predecessors()->length() == 1) {
730b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // We have a single predecessor => copy environment and outgoing
731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // argument count from the predecessor.
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(block->phis()->length() == 0);
733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HEnvironment* last_environment = pred->last_environment();
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(last_environment != NULL);
736b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Only copy the environment, if it is later used again.
737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (pred->end()->SecondSuccessor() == NULL) {
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(pred->end()->FirstSuccessor() == block);
739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    } else {
740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
741b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
742b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        last_environment = last_environment->Copy();
743b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      }
744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
745b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(last_environment);
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(pred->argument_count() >= 0);
747b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = pred->argument_count();
748b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
749b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // We are at a state join => process phis.
750b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
751b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // No need to copy the environment, it cannot be used later.
752b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HEnvironment* last_environment = pred->last_environment();
753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    for (int i = 0; i < block->phis()->length(); ++i) {
754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      HPhi* phi = block->phis()->at(i);
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (phi->HasMergedIndex()) {
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        last_environment->SetValueAt(phi->merged_index(), phi);
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (block->deleted_phis()->at(i) < last_environment->length()) {
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        last_environment->SetValueAt(block->deleted_phis()->at(i),
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     graph_->GetConstantUndefined());
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->UpdateEnvironment(last_environment);
766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Pick up the outgoing argument count of one of the predecessors.
767b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    argument_count_ = pred->argument_count();
768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HInstruction* current = block->first();
770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int start = chunk_->instructions()->length();
771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  while (current != NULL && !is_aborted()) {
772b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    // Code for constants in registers is generated lazily.
773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (!current->EmitAtUses()) {
774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      VisitInstruction(current);
775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    current = current->next();
777b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int end = chunk_->instructions()->length() - 1;
779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  if (end >= start) {
780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->set_first_instruction_index(start);
781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    block->set_last_instruction_index(end);
782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
783b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  block->set_argument_count(argument_count_);
784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  next_block_ = NULL;
785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_block_ = NULL;
786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HInstruction* old_current = current_instruction_;
791b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_instruction_ = current;
792b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* instr = NULL;
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (current->CanReplaceWithDummyUses()) {
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current->OperandCount() == 0) {
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = DefineAsRegister(new(zone()) LDummy());
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(!current->OperandAt(0)->IsControlInstruction());
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = DefineAsRegister(new(zone())
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          LDummyUse(UseAny(current->OperandAt(0))));
801b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 1; i < current->OperandCount(); ++i) {
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (current->OperandAt(i)->IsControlInstruction()) continue;
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* dummy =
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      dummy->set_hydrogen_value(current);
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk_->AddInstruction(dummy, current_block_);
808b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBasicBlock* successor;
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current->IsControlInstruction() &&
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        successor != NULL) {
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = new(zone()) LGoto(successor);
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = current->CompileToLithium(this);
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  argument_count_ += current->argument_delta();
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(argument_count_ >= 0);
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr != NULL) {
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddInstruction(instr, current);
825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  current_instruction_ = old_current;
828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr,
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   HInstruction* hydrogen_val) {
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Associate the hydrogen instruction first, since we may need it for
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_hydrogen_value(hydrogen_val);
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure that the lithium instruction has either no fixed register
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // constraints in temps or the result OR no uses that are only used at
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // start. If this invariant doesn't hold, the register allocator can decide
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // to insert a split of a range immediately before the instruction due to an
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // already allocated register needing to be used for the instruction's fixed
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // register constraint. In this case, The register allocator won't see an
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // interference between the split child and the use-at-start (it would if
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the it was just a plain use), so it is free to move the split child into
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the same register that is used for the use-at-start.
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // See https://code.google.com/p/chromium/issues/detail?id=201590
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(instr->ClobbersRegisters() &&
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->ClobbersDoubleRegisters(isolate()))) {
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int fixed = 0;
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int used_at_start = 0;
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (UseIterator it(instr); !it.Done(); it.Advance()) {
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LUnallocated* operand = LUnallocated::cast(it.Current());
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (operand->IsUsedAtStart()) ++used_at_start;
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->Output() != NULL) {
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
858b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (TempIterator it(instr); !it.Done(); it.Advance()) {
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LUnallocated* operand = LUnallocated::cast(it.Current());
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (operand->HasFixedPolicy()) ++fixed;
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(fixed == 0 || used_at_start == 0);
864b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
866b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr = AssignPointerMap(instr);
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_stress_environments && !instr->HasEnvironment()) {
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr = AssignEnvironment(instr);
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  chunk_->AddInstruction(instr, current_block_);
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  CreateLazyBailoutForCall(current_block_, instr, hydrogen_val);
876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LGoto(instr->FirstSuccessor());
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) {
8853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LInstruction* result = new (zone()) LPrologue();
886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (info_->scope()->NeedsContext()) {
8873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    result = MarkAsCall(result, instr);
8883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
8893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return result;
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LDebugBreak();
895b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8983fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = value->representation();
9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HType type = value->type();
902c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ToBooleanHints expected = instr->expected_input_types();
903c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (expected == ToBooleanHint::kNone) expected = ToBooleanHint::kAny;
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* branch = new(zone()) LBranch(UseRegister(value));
908c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!easy_case && ((!(expected & ToBooleanHint::kSmallInteger) &&
909c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                      (expected & ToBooleanHint::kNeedsMap)) ||
910c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                     expected != ToBooleanHint::kAny)) {
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    branch = AssignEnvironment(branch);
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return branch;
914b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9171e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
9191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
9203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpMapAndBranch(value);
921b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
922b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
923b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
924b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value())));
927b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
928b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
929b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
930b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsElements);
933b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
934b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch(
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HHasInPrototypeChainAndBranch* instr) {
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object = UseRegister(instr->object());
939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* prototype = UseRegister(instr->prototype());
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LHasInPrototypeChainAndBranch* result =
941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LHasInPrototypeChainAndBranch(object, prototype);
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignEnvironment(result);
943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
9473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseRegister(instr->receiver());
9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseRegisterAtStart(instr->function());
9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineSameAsFirst(result));
9513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
955e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
956e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* receiver = UseFixed(instr->receiver(), rax);
957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* length = UseFixed(instr->length(), rbx);
958e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* elements = UseFixed(instr->elements(), rcx);
9593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LApplyArguments* result = new(zone()) LApplyArguments(function,
960e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                receiver,
961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                length,
962e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                                                elements);
963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
964b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
965b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
966b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int argc = instr->OperandCount();
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < argc; ++i) {
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* argument = UseOrConstant(instr->argument(i));
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddInstruction(new(zone()) LPushArgument(argument), instr);
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry(
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HStoreCodeEntry* store_code_entry) {
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function = UseRegister(store_code_entry->function());
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LStoreCodeEntry(function, code_object);
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject(
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HInnerAllocatedObject* instr) {
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* base_object = UseRegisterAtStart(instr->base_object());
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LInnerAllocatedObject(base_object, offset));
9911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
9921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
9931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
9943fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses()
9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? NULL
9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : DefineAsRegister(new(zone()) LThisFunction);
9983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
9993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10011e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoContext(HContext* instr) {
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->HasNoUses()) return NULL;
10031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (info()->IsStub()) {
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(new(zone()) LContext, rsi);
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
10071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LContext);
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
1015b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor(
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCallWithDescriptor* instr) {
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptor descriptor = instr->descriptor();
1021f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_EQ(descriptor.GetParameterCount() +
1022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                LCallWithDescriptor::kImplicitRegisterParameterCount,
1023f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            instr->OperandCount());
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Target
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ops.Add(target, zone());
1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Context
1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* op = UseFixed(instr->OperandAt(1), rsi);
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ops.Add(op, zone());
1032f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Load register parameters.
1033f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int i = 0;
1034f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (; i < descriptor.GetRegisterParameterCount(); i++) {
1035f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    op = UseFixed(instr->OperandAt(
1036f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                      i + LCallWithDescriptor::kImplicitRegisterParameterCount),
1037f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  descriptor.GetRegisterParameter(i));
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ops.Add(op, zone());
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1040f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Push stack parameters.
1041f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (; i < descriptor.GetParameterCount(); i++) {
1042f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    op = UseAny(instr->OperandAt(
1043f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        i + LCallWithDescriptor::kImplicitRegisterParameterCount));
1044f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    AddInstruction(new (zone()) LPushArgument(op), instr);
1045f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      descriptor, ops, zone());
10493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) {
10503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    result->MarkAsSyntacticTailCall();
10513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1053b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1054b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1055b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1056257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1058257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* function = UseFixed(instr->function(), rdi);
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
10603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) {
10613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    result->MarkAsSyntacticTailCall();
10623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1063257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CANNOT_DEOPTIMIZE_EAGERLY);
1064257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1065257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1066257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1067b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (instr->op()) {
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathFloor:
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathFloor(instr);
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathRound:
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathRound(instr);
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathFround:
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathFround(instr);
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathAbs:
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathAbs(instr);
107713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case kMathCos:
107813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return DoMathCos(instr);
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathLog:
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathLog(instr);
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathExp:
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathExp(instr);
108313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case kMathSin:
108413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return DoMathSin(instr);
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathSqrt:
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathSqrt(instr);
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathPowHalf:
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathPowHalf(instr);
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathClz32:
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathClz32(instr);
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return NULL;
1094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
10983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(instr->value()->representation().IsDouble());
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
11003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (instr->representation().IsInteger32()) {
11013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    LMathFloorI* result = new (zone()) LMathFloorI(input);
11023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
11033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
11043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    DCHECK(instr->representation().IsDouble());
11053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    LMathFloorD* result = new (zone()) LMathFloorD(input);
11063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return DefineAsRegister(result);
11073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
11113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(instr->value()->representation().IsDouble());
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
11133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (instr->representation().IsInteger32()) {
11143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    LOperand* temp = FixedTemp(xmm4);
11153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    LMathRoundI* result = new (zone()) LMathRoundI(input, temp);
11163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
11173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
11183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    DCHECK(instr->representation().IsDouble());
11193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    LMathRoundD* result = new (zone()) LMathRoundD(input);
11203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return DefineAsRegister(result);
11213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) {
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathFround* result = new (zone()) LMathFround(input);
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
1128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result =
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineSameAsFirst(new(zone()) LMathAbs(context, input));
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = instr->value()->representation();
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsDouble()) result = AssignEnvironment(result);
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
114613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), xmm0);
114713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathLog(input), xmm0),
114813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                    instr);
1149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathClz32* result = new(zone()) LMathClz32(input);
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
1156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
115813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathCos(HUnaryMathOperation* instr) {
115913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->representation().IsDouble());
116013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
116113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), xmm0);
116213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathCos(input), xmm0),
116313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                    instr);
116413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
1165b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
116913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), xmm0);
117013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathExp(input), xmm0),
117113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                    instr);
1172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
117413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathSin(HUnaryMathOperation* instr) {
117513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->representation().IsDouble());
117613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
117713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), xmm0);
117813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathSin(input), xmm0),
117913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                    instr);
118013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
1181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseAtStart(instr->value());
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LMathSqrt(input));
1185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathPowHalf* result = new(zone()) LMathPowHalf(input);
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineSameAsFirst(result);
1192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* constructor = UseFixed(instr->constructor(), rdi);
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallRuntime* result = new(zone()) LCallRuntime(context);
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) {
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::ROR, instr);
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) {
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SHR, instr);
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) {
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SAR, instr);
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) {
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SHL, instr);
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* right;
1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (SmiValuesAre32Bits() && instr->representation().IsSmi()) {
1239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // We don't support tagged immediates, so we request it in a register.
1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseRegisterAtStart(instr->BetterRightOperand());
1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseOrConstantAtStart(instr->BetterRightOperand());
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineSameAsFirst(new(zone()) LBitI(left, right));
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(instr->op(), instr);
12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       divisor != 1 && divisor != -1)) {
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsInteger32());
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = FixedTemp(rax);
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = FixedTemp(rdx);
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LDivByConstI(
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp1, temp2), rdx);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 ||
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(HDiv* instr) {
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseFixed(instr->left(), rax);
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(rdx);
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LDivI(
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp), rax);
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kCanOverflow) ||
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) {
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1307b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->RightIsPowerOf2()) {
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivByPowerOf2I(instr);
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (instr->right()->IsConstant()) {
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivByConstI(instr);
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivI(instr);
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsDouble()) {
13171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::DIV, instr);
13181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
13191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::DIV, instr);
13201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1322b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegisterAtStart(instr->left());
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(new(zone()) LFlooringDivByPowerOf2I(
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsInteger32());
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = FixedTemp(rax);
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = FixedTemp(rdx);
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp3 =
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NULL : TempRegister();
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result =
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineFixed(new(zone()) LFlooringDivByConstI(dividend,
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   divisor,
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   temp1,
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   temp2,
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                   temp3),
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  rdx);
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 ||
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseFixed(instr->left(), rax);
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(rdx);
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LFlooringDivI(
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp), rax);
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kCanOverflow)) {
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RightIsPowerOf2()) {
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivByPowerOf2I(instr);
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->right()->IsConstant()) {
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivByConstI(instr);
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivI(instr);
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegisterAtStart(instr->left());
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = FixedTemp(rax);
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = FixedTemp(rdx);
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LModByConstI(
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp1, temp2), rax);
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseFixed(instr->left(), rax);
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = FixedTemp(rdx);
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LModI(
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor, temp), rdx);
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1443b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->RightIsPowerOf2()) {
1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoModByPowerOf2I(instr);
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (instr->right()->IsConstant()) {
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoModByConstI(instr);
144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoModI(instr);
145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsDouble()) {
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticD(Token::MOD, instr);
1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(Token::MOD, instr);
1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1460b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1465109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    HValue* h_right = instr->BetterRightOperand();
1466109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    LOperand* right = UseOrConstant(h_right);
14673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LMulI* mul = new(zone()) LMulI(left, right);
1468109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    int constant_value =
1469109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        h_right->IsConstant() ? HConstant::cast(h_right)->Integer32Value() : 0;
1470109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // |needs_environment| must mirror the cases where LCodeGen::DoMulI calls
1471109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // |DeoptimizeIf|.
1472109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    bool needs_environment =
1473109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        instr->CheckFlag(HValue::kCanOverflow) ||
1474109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        (instr->CheckFlag(HValue::kBailoutOnMinusZero) &&
1475109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch         (!right->IsConstantOperand() || constant_value <= 0));
1476109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (needs_environment) {
14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AssignEnvironment(mul);
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(mul);
14801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsDouble()) {
14811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::MUL, instr);
14821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
14831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::MUL, instr);
14841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) {
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
14921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* left = UseRegisterAtStart(instr->left());
1493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* right;
1494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (SmiValuesAre32Bits() && instr->representation().IsSmi()) {
1495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // We don't support tagged immediates, so we request it in a register.
1496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseRegisterAtStart(instr->right());
1497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
1498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      right = UseOrConstantAtStart(instr->right());
1499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LSubI* sub = new(zone()) LSubI(left, right);
15011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LInstruction* result = DefineSameAsFirst(sub);
15021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (instr->CheckFlag(HValue::kCanOverflow)) {
15031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      result = AssignEnvironment(result);
15041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
15051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return result;
15061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (instr->representation().IsDouble()) {
15071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticD(Token::SUB, instr);
15081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
15091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return DoArithmeticT(Token::SUB, instr);
15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Check to see if it would be advantageous to use an lea instruction rather
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // than an add. This is the case when no overflow check is needed and there
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // are multiple uses of the add's inputs, so using a 3-register add will
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // preserve all input values for later uses.
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool use_lea = LAddI::UseLea(instr);
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_candidate = instr->BetterRightOperand();
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right;
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (SmiValuesAre32Bits() && instr->representation().IsSmi()) {
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // We cannot add a tagged immediate to a tagged value,
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // so we request it in a register.
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = UseRegisterAtStart(right_candidate);
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = use_lea ? UseRegisterOrConstantAtStart(right_candidate)
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      : UseOrConstantAtStart(right_candidate);
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result = use_lea ? DefineAsRegister(add)
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   : DefineSameAsFirst(add);
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (can_overflow) {
1539b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      result = AssignEnvironment(result);
1540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
1541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return result;
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsExternal()) {
1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(instr->IsConsistentExternalRepresentation());
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool use_lea = LAddI::UseLea(instr);
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_candidate = instr->right();
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = use_lea
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegisterOrConstantAtStart(right_candidate)
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseOrConstantAtStart(right_candidate);
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result = use_lea
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? DefineAsRegister(add)
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : DefineSameAsFirst(add);
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
1556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (instr->representation().IsDouble()) {
1557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return DoArithmeticD(Token::ADD, instr);
1558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
1559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return DoArithmeticT(Token::ADD, instr);
1560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left = NULL;
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = NULL;
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmi()) {
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->BetterLeftOperand());
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseAtStart(instr->BetterRightOperand());
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsInteger32()) {
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->BetterLeftOperand());
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseOrConstantAtStart(instr->BetterRightOperand());
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->representation().IsDouble());
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->left());
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseRegisterAtStart(instr->right());
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathMinMax* minmax = new(zone()) LMathMinMax(left, right);
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineSameAsFirst(minmax);
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // We call a C function for double power. It can't trigger a GC.
1589e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // We need to use fixed result register for the call.
1590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Representation exponent_type = instr->right()->representation();
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsDouble());
1592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* left = UseFixedDouble(instr->left(), xmm2);
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right =
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      exponent_type.IsDouble()
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ? UseFixedDouble(instr->right(), xmm1)
1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LPower* result = new(zone()) LPower(left, right);
15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, xmm3), instr,
1599e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                    CAN_DEOPTIMIZE_EAGERLY);
1600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16033fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsTagged());
1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsTagged());
1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCmpT* result = new(zone()) LCmpT(context, left, right);
16103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
16113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCompareNumericAndBranch* instr) {
1616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = instr->representation();
1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsSmiOrInteger32()) {
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(r));
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(r));
16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    LOperand* right = UseOrConstantAtStart(instr->right());
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone()) LCompareNumericAndBranch(left, right);
16233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } else {
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(r.IsDouble());
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().IsDouble());
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().IsDouble());
16273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left;
16283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right;
16293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->left()->IsConstant() && instr->right()->IsConstant()) {
16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterOrConstantAtStart(instr->left());
16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      right = UseRegisterOrConstantAtStart(instr->right());
16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterAtStart(instr->left());
16343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      right = UseRegisterAtStart(instr->right());
16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone()) LCompareNumericAndBranch(left, right);
16371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16413fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HCompareObjectEqAndBranch* instr) {
16431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* left = UseRegisterAtStart(instr->left());
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = UseRegisterOrConstantAtStart(instr->right());
16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpObjectEqAndBranch(left, right);
1646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCompareHoleAndBranch* instr) {
16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LCmpHoleAndBranch(value);
1653257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsStringAndBranch(value, temp);
1661592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1662592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1663592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
16643fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
1667b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1669b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16703fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
16713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HIsUndetectableAndBranch* instr) {
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsUndetectableAndBranch(value, temp);
16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch(
16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStringCompareAndBranch* instr) {
16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsTagged());
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsTagged());
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
16873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCompareAndBranch* result =
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCompareAndBranch(context, left, right);
16893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
1691592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1692592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1693592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
16943fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
16953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HHasInstanceTypeAndBranch* instr) {
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
16983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasInstanceTypeAndBranch(value);
1699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
17013fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
17023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    HClassOfTestAndBranch* instr) {
17033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegister(instr->value());
17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LClassOfTestAndBranch(value,
17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister(),
17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister());
1707b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1708b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1709b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string = UseRegisterAtStart(instr->string());
1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
17143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string = UseRegisterAtStart(instr->string());
1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = FLAG_debug_code
1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseRegisterAtStart(instr->index())
1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseRegisterOrConstantAtStart(instr->index());
1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = FLAG_debug_code
1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseRegisterAtStart(instr->value())
1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseRegisterOrConstantAtStart(instr->value());
1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), rsi) : NULL;
1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LSeqStringSetChar(context, string,
1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                       index, value);
1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_debug_code) {
1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = MarkAsCall(result, instr);
1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_debug_code && instr->skip_check()) return NULL;
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length = !index->IsConstantOperand()
1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseOrConstantAtStart(instr->length())
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseAtStart(instr->length());
1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LBoundsCheck(index, length);
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_debug_code || !instr->skip_check()) {
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
17465d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}
17475d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
17485d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
17491e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
17501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The control instruction marking the end of a block that completed
17511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // abruptly (e.g., threw an exception).  There is nothing specific to do.
1752b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1753b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1755b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
17563fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
17573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return NULL;
17583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1761257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1762257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // All HForceRepresentation instructions should be eliminated in the
1763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // representation change phase of Hydrogen.
1764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  UNREACHABLE();
1765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return NULL;
1766257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1768257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1769b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) {
17701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation from = instr->from();
17711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Representation to = instr->to();
1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* val = instr->value();
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (from.IsSmi()) {
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged()) {
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    from = Representation::Tagged();
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
17801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (from.IsTagged()) {
17811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsDouble()) {
1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value));
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->type().IsSmi()) {
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineSameAsFirst(new(zone()) LDummyUse(value));
1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
17921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsInteger32());
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->type().IsSmi() || val->representation().IsSmi()) {
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
17993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        bool truncating = instr->CanTruncateToInt32();
18003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1);
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LInstruction* result =
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            DefineSameAsFirst(new(zone()) LTaggedToI(value, xmm_temp));
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return result;
18051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
18061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
18071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (from.IsDouble()) {
18081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsTagged()) {
1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      info()->MarkAsDeferredCalling();
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
18111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LOperand* temp = TempRegister();
18121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      LUnallocated* result_temp = TempRegister();
18133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberTagD* result = new(zone()) LNumberTagD(value, temp);
18141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      return AssignPointerMap(Define(result, result_temp));
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignEnvironment(
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
18191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsInteger32());
1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value));
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result);
1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
18251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
18261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else if (from.IsInteger32()) {
1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info()->MarkAsDeferredCalling();
18281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (to.IsTagged()) {
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!instr->CheckFlag(HValue::kCanOverflow)) {
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LSmiTag(value));
1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (val->CheckFlag(HInstruction::kUint32)) {
1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp1 = TempRegister();
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = FixedTemp(xmm1);
1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return AssignPointerMap(DefineSameAsFirst(result));
18381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      } else {
1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp1 = SmiValuesAre32Bits() ? NULL : TempRegister();
1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = SmiValuesAre32Bits() ? NULL : FixedTemp(xmm1);
1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2);
1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return AssignPointerMap(DefineSameAsFirst(result));
18441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      }
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->CheckFlag(HValue::kCanOverflow)) {
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        result = AssignEnvironment(result);
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
18521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsDouble());
1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->CheckFlag(HInstruction::kUint32)) {
1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = Use(val);
1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LInteger32ToDouble(value));
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
18601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
18611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
18621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  UNREACHABLE();
1863b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
1864b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1865b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1866b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
18681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LCheckNonSmi(value);
1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!instr->value()->type().IsHeapObject()) {
1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1875b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
18781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(new(zone()) LCheckSmi(value));
1880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1881b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1882b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoCheckArrayBufferNotNeutered(
1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HCheckArrayBufferNotNeutered* instr) {
1885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* view = UseRegisterAtStart(instr->value());
1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LCheckArrayBufferNotNeutered* result =
1887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LCheckArrayBufferNotNeutered(view);
1888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignEnvironment(result);
1889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
18931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCheckInstanceType* result = new(zone()) LCheckInstanceType(value);
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(result);
1896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
19001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(new(zone()) LCheckValue(value));
1902b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1904b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
19071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* value = UseRegisterAtStart(instr->value());
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->HasMigrationTarget()) {
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info()->MarkAsDeferredCalling();
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignPointerMap(result);
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1914b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1918257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value = instr->value();
1919257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Representation input_rep = value->representation();
1920257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* reg = UseRegister(value);
1921257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (input_rep.IsDouble()) {
1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LClampDToUint8(reg));
1923257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else if (input_rep.IsInteger32()) {
19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(new(zone()) LClampIToUint8(reg));
1925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(input_rep.IsSmiOrTagged());
1927257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Register allocator doesn't (yet) support allocation of double
1928257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // temps. Reserve xmm1 explicitly.
19293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LClampTToUint8* result = new(zone()) LClampTToUint8(reg,
19303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        FixedTemp(xmm1));
1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return AssignEnvironment(DefineSameAsFirst(result));
1932257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1933257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = info()->IsStub() ? UseFixed(instr->context(), rsi) : NULL;
1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LReturn(
1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UseFixed(instr->value(), rax), context, parameter_count);
1941b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1942b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Representation r = instr->representation();
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsSmi()) {
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LConstantS);
1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (r.IsInteger32()) {
19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantI);
1950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (r.IsDouble()) {
1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return DefineAsRegister(new (zone()) LConstantD);
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (r.IsExternal()) {
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LConstantE);
1954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else if (r.IsTagged()) {
19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantT);
1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  } else {
1957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    UNREACHABLE();
1958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return NULL;
1959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1961b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1963b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
1964e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
19653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineAsRegister(new(zone()) LLoadContextSlot(context));
1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
19741e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
1975e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context;
1976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value;
1977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* temp;
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context = UseRegister(instr->context());
1979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (instr->NeedsWriteBarrier()) {
1980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value = UseTempRegister(instr->value());
1981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temp = TempRegister();
1982e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
1983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    value = UseRegister(instr->value());
1984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temp = NULL;
1985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LStoreContextSlot(context, value, temp);
1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1991b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1992b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1993b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
19941e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use the special mov rax, moffs64 encoding for external
1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // memory accesses with 64-bit word-sized values.
1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->access().IsExternalMemory() &&
1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->access().offset() == 0 &&
1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->access().representation().IsSmi() ||
2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       instr->access().representation().IsTagged() ||
2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       instr->access().representation().IsHeapObject() ||
2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       instr->access().representation().IsExternal())) {
2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* obj = UseRegisterOrConstantAtStart(instr->object());
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(new(zone()) LLoadNamedField(obj), rax);
2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
20061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* obj = UseRegisterAtStart(instr->object());
20073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
20081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
20091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2011b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
2012b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadFunctionPrototype* instr) {
20131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return AssignEnvironment(DefineAsRegister(
20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
2015b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LLoadRoot);
20201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
20211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) {
2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We sign extend the dehoisted key at the definition point when the pointer
2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // size is 64-bit. For x32 port, we sign extend the dehoisted key at the use
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // points and should not invoke this function. We can't use STATIC_ASSERT
2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // here as the pointer size is 32-bit for x32.
2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(kPointerSize == kInt64Size);
2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BitVector* dehoisted_key_ids = chunk_->GetDehoistedKeyIds();
2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (dehoisted_key_ids->Contains(candidate->id())) return;
2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  dehoisted_key_ids->Add(candidate->id());
2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!candidate->IsPhi()) return;
2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < candidate->OperandCount(); ++i) {
2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FindDehoistedKeyDefinitions(candidate->OperandAt(i));
2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2036b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2037b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2038b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((kPointerSize == kInt64Size &&
2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          instr->key()->representation().IsInteger32()) ||
2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (kPointerSize == kInt32Size &&
2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          instr->key()->representation().IsSmiOrInteger32()));
2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key = NULL;
2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = NULL;
20471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize == kInt64Size) {
2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = UseRegisterOrConstantAtStart(instr->key());
2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool clobbers_key = ExternalArrayOpRequiresTemp(
2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->key()->representation(), elements_kind);
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = clobbers_key
2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseTempRegister(instr->key())
2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterOrConstantAtStart(instr->key());
2056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
20571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) {
2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FindDehoistedKeyDefinitions(instr->key());
2060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
20613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!instr->is_fixed_typed_array()) {
2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* obj = UseRegisterAtStart(instr->elements());
2064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = DefineAsRegister(new (zone()) LLoadKeyed(obj, key, nullptr));
2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(
2067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (instr->representation().IsInteger32() &&
2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         !(IsDoubleOrFloatElementsKind(elements_kind))) ||
2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (instr->representation().IsDouble() &&
2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (IsDoubleOrFloatElementsKind(elements_kind))));
2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* backing_store = UseRegister(instr->elements());
2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* backing_store_owner = UseAny(instr->backing_store_owner());
2073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = DefineAsRegister(
2074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new (zone()) LLoadKeyed(backing_store, key, backing_store_owner));
2075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool needs_environment;
2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->is_fixed_typed_array()) {
2079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // see LCodeGen::DoLoadKeyedExternalArray
2080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    needs_environment = elements_kind == UINT32_ELEMENTS &&
2081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        !instr->CheckFlag(HInstruction::kUint32);
2082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // see LCodeGen::DoLoadKeyedFixedDoubleArray and
2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // LCodeGen::DoLoadKeyedFixedArray
2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    needs_environment =
2086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instr->RequiresHoleCheck() ||
2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        (instr->hole_mode() == CONVERT_HOLE_TO_UNDEFINED && info()->IsStub());
2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
20893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (needs_environment) {
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
2094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2096b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
20993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((kPointerSize == kInt64Size) && instr->IsDehoisted()) {
2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FindDehoistedKeyDefinitions(instr->key());
2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!instr->is_fixed_typed_array()) {
2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->elements()->representation().IsTagged());
2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool needs_write_barrier = instr->NeedsWriteBarrier();
2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* object = NULL;
2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* key = NULL;
2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* val = NULL;
2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation value_representation = instr->value()->representation();
2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value_representation.IsDouble()) {
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      object = UseRegisterAtStart(instr->elements());
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      val = UseRegisterAtStart(instr->value());
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      key = UseRegisterOrConstantAtStart(instr->key());
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(value_representation.IsSmiOrTagged() ||
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             value_representation.IsInteger32());
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (needs_write_barrier) {
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object = UseTempRegister(instr->elements());
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val = UseTempRegister(instr->value());
2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key = UseTempRegister(instr->key());
2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object = UseRegisterAtStart(instr->elements());
2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val = UseRegisterOrConstantAtStart(instr->value());
2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key = UseRegisterOrConstantAtStart(instr->key());
2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
21293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new (zone()) LStoreKeyed(object, key, val, nullptr);
2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(
2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (instr->value()->representation().IsInteger32() &&
2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       !IsDoubleOrFloatElementsKind(elements_kind)) ||
2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (instr->value()->representation().IsDouble() &&
2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       IsDoubleOrFloatElementsKind(elements_kind)));
2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(instr->elements()->representation().IsExternal());
2139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool val_is_temp_register = elements_kind == UINT8_CLAMPED_ELEMENTS ||
2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              elements_kind == FLOAT32_ELEMENTS;
2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* val = val_is_temp_register ? UseTempRegister(instr->value())
21428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : UseRegister(instr->value());
2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key = NULL;
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kPointerSize == kInt64Size) {
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = UseRegisterOrConstantAtStart(instr->key());
2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool clobbers_key = ExternalArrayOpRequiresTemp(
2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->key()->representation(), elements_kind);
2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    key = clobbers_key
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseTempRegister(instr->key())
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterOrConstantAtStart(instr->key());
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* backing_store = UseRegister(instr->elements());
2154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner = UseAny(instr->backing_store_owner());
2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LStoreKeyed(backing_store, key, val, backing_store_owner);
2156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
2157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind(
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HTransitionElementsKind* instr) {
2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseRegister(instr->object());
21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = TempRegister();
21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* temp_reg = TempRegister();
2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTransitionElementsKind* result = new(zone()) LTransitionElementsKind(
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object, NULL, new_map_reg, temp_reg);
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseFixed(instr->object(), rax);
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseFixed(instr->context(), rsi);
21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(result, instr);
21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento(
2179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HTrapAllocationMemento* instr) {
2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object = UseRegister(instr->object());
2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempRegister();
2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTrapAllocationMemento* result =
2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LTrapAllocationMemento(object, temp);
2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(result);
2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoMaybeGrowElements(HMaybeGrowElements* instr) {
2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  info()->MarkAsDeferredCalling();
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object = Use(instr->object());
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* elements = Use(instr->elements());
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* current_capacity = UseRegisterOrConstant(instr->current_capacity());
2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LMaybeGrowElements* result = new (zone())
2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LMaybeGrowElements(context, object, elements, key, current_capacity);
2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DefineFixed(result, rax);
2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignPointerMap(AssignEnvironment(result));
2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_in_object = instr->access().IsInobject();
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_external_location = instr->access().IsExternalMemory() &&
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->access().offset() == 0;
22071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool needs_write_barrier = instr->NeedsWriteBarrier();
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool needs_write_barrier_for_map = instr->has_transition() &&
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->NeedsWriteBarrierForMap();
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* obj;
2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (needs_write_barrier) {
2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = is_in_object
2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegister(instr->object())
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseTempRegister(instr->object());
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_external_location) {
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!is_in_object);
2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!needs_write_barrier);
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!needs_write_barrier_for_map);
2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = UseRegisterOrConstant(instr->object());
2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = needs_write_barrier_for_map
2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegister(instr->object())
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterAtStart(instr->object());
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool can_be_constant = instr->value()->IsConstant() &&
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant::cast(instr->value())->NotInNewSpace() &&
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->field_representation().IsDouble();
2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* val;
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (needs_write_barrier) {
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseTempRegister(instr->value());
2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (is_external_location) {
2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseFixed(instr->value(), rax);
2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (can_be_constant) {
2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegisterOrConstant(instr->value());
2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->field_representation().IsDouble()) {
2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegisterAtStart(instr->value());
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegister(instr->value());
2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // We only need a scratch register if we have a write barrier or we
22451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // have a store into the properties array (not in-object-property).
2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = (!is_in_object || needs_write_barrier ||
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      needs_write_barrier_for_map) ? TempRegister() : NULL;
22481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreNamedField(obj, val, temp);
2250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left = UseFixed(instr->left(), rdx);
2256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = UseFixed(instr->right(), rax);
2257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineFixed(new(zone()) LStringAdd(context, left, right), rax), instr);
2259257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2260257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2261257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
22621e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
226369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* string = UseTempRegister(instr->string());
226469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  LOperand* index = UseTempRegister(instr->index());
2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharCodeAt* result =
2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCharCodeAt(context, string, index);
2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
2269b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
227244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
227344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* char_code = UseRegister(instr->value());
2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharFromCode* result =
2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCharFromCode(context, char_code);
227744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return AssignPointerMap(DefineAsRegister(result));
227844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
227944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
228044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
2282bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LOperand* size = instr->size()->IsConstant() ? UseConstant(instr->size())
2283bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                               : UseRegister(instr->size());
2284bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (instr->IsAllocationFolded()) {
2285bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LOperand* temp = TempRegister();
2286bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LFastAllocate* result = new (zone()) LFastAllocate(size, temp);
2287bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return DefineAsRegister(result);
2288bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } else {
2289bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    info()->MarkAsDeferredCalling();
2290bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LOperand* context = UseAny(instr->context());
2291bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LOperand* temp = TempRegister();
2292bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LAllocate* result = new (zone()) LAllocate(context, size, temp);
2293bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return AssignPointerMap(DefineAsRegister(result));
2294bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(argument_count_ == 0);
2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  allocator_->MarkAsOsrEntry();
2301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  current_block_->last_environment()->set_ast_id(instr->ast_id());
23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LOsrEntry);
2303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LParameter* result = new(zone()) LParameter;
2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->kind() == HParameter::STACK_PARAMETER) {
2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int spill_index = chunk()->GetParameterStackSlot(instr->index());
2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsSpilled(result, spill_index);
2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(info()->IsStub());
2313109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    CallInterfaceDescriptor descriptor = graph()->descriptor();
2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index = static_cast<int>(instr->index());
2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Register reg = descriptor.GetRegisterParameter(index);
2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(result, reg);
2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2318b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2319b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use an index that corresponds to the location in the unoptimized frame,
2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // which the optimized frame will subsume.
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int env_index = instr->index();
2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int spill_index = 0;
2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->environment()->is_parameter_index(env_index)) {
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    spill_index = chunk()->GetParameterStackSlot(env_index);
2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    spill_index = env_index - instr->environment()->first_local_index();
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Retry(kTooManySpillSlotsNeededForOSR);
2332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      spill_index = 0;
2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2334109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    spill_index += StandardFrameConstants::kFixedSlotCount;
23357d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  }
23363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
2337b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2338b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2339b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2340b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
2341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // There are no real uses of the arguments object.
2342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // arguments.length and element access are supported directly on
2343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // stack arguments, and any real arguments object use causes a bailout.
2344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // So this value is never used.
2345b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->ReplayEnvironment(current_block_->last_environment());
2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // There are no real uses of a captured object.
2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2357b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
2359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* args = UseRegister(instr->arguments());
2360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length;
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index;
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->length()->IsConstant() && instr->index()->IsConstant()) {
2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    length = UseRegisterOrConstant(instr->length());
2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    index = UseOrConstant(instr->index());
2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    length = UseTempRegister(instr->length());
2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    index = Use(instr->index());
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
2370b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2371b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2372b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
2375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* value = UseFixed(instr->value(), rbx);
2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTypeof* result = new(zone()) LTypeof(context, value);
2377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr);
2378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
23813fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
23823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
2383b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2384b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
23851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2386b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->ReplayEnvironment(current_block_->last_environment());
2388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2389b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2390b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2391b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsDeferredCalling();
23943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (instr->is_function_entry()) {
2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseFixed(instr->context(), rsi);
2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(new(zone()) LStackCheck(context), instr);
23973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  } else {
2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->is_backwards_branch());
2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseAny(instr->context());
2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return AssignEnvironment(
2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        AssignPointerMap(new(zone()) LStackCheck(context)));
24023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
24071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HEnvironment* outer = current_block_->last_environment();
2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  outer->set_ast_id(instr->ReturnId());
24091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HConstant* undefined = graph()->GetConstantUndefined();
24103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  HEnvironment* inner = outer->CopyForInlining(
24113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      instr->closure(), instr->arguments_count(), instr->function(), undefined,
24123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      instr->inlining_kind(), instr->syntactic_tail_call_mode());
2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only replay binding of arguments object if it wasn't removed from graph.
2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inner->Bind(instr->arguments_var(), instr->arguments_object());
24163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inner->BindContext(instr->closure_context());
2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inner->set_entry(instr);
24191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  current_block_->UpdateEnvironment(inner);
2420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return NULL;
2421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2423b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2424b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* pop = NULL;
2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnvironment* env = current_block_->last_environment();
2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (env->entry()->arguments_pushed()) {
2430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int argument_count = env->arguments_environment()->parameter_count();
2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    pop = new(zone()) LDrop(argument_count);
2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->argument_delta() == -argument_count);
2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment()->
24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DiscardInlined(false);
24371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  current_block_->UpdateEnvironment(outer);
2438b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return pop;
2440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
24433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), rsi);
24453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->enumerable(), rax);
2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
24473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, rax), instr, CAN_DEOPTIMIZE_EAGERLY);
24483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
24523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegister(instr->map());
24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(
24543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LForInCacheArray(map)));
24553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
24593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
24603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegisterAtStart(instr->map());
24613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
24623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
24663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegister(instr->object());
24673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseTempRegister(instr->index());
2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(load);
2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignPointerMap(result);
2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif  // V8_TARGET_ARCH_X64
2477