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/mips/lithium-mips.h"
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <sstream>
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_MIPS
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen-osr.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-inl.h"
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips/lithium-codegen-mips.h"
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 {
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal {
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_COMPILE(type)                            \
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void L##type::CompileToNative(LCodeGen* generator) {  \
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    generator->Do##type(this);                          \
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_COMPILE
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::VerifyCall() {
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Call instructions can use only fixed registers as temporaries and
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // outputs because all registers are blocked by the calling convention.
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Inputs operands must use a fixed register or use-at-start policy or
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a non-register policy.
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(Output() == NULL ||
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         LUnallocated::cast(Output())->HasFixedPolicy() ||
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         !LUnallocated::cast(Output())->HasRegisterPolicy());
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (UseIterator it(this); !it.Done(); it.Advance()) {
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operand->HasFixedPolicy() ||
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           operand->IsUsedAtStart());
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (TempIterator it(this); !it.Done(); it.Advance()) {
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::PrintTo(StringStream* stream) {
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("%s ", this->Mnemonic());
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PrintOutputOperandTo(stream);
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PrintDataTo(stream);
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (HasEnvironment()) {
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" ");
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    environment()->PrintTo(stream);
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (HasPointerMap()) {
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" ");
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    pointer_map()->PrintTo(stream);
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintDataTo(StringStream* stream) {
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("= ");
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < InputCount(); i++) {
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (i > 0) stream->Add(" ");
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (InputAt(i) == NULL) {
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      stream->Add("NULL");
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      InputAt(i)->PrintTo(stream);
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (HasResult()) result()->PrintTo(stream);
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLabel::PrintDataTo(StringStream* stream) {
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LGap::PrintDataTo(stream);
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLabel* rep = replacement();
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (rep != NULL) {
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" Dead block replaced with B%d", rep->block_id());
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LGap::IsRedundant() const {
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < 4; i++) {
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return false;
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return true;
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGap::PrintDataTo(StringStream* stream) {
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < 4; i++) {
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add("(");
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (parallel_moves_[i] != NULL) {
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      parallel_moves_[i]->PrintDataTo(stream);
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(") ");
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticD::Mnemonic() const {
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (op()) {
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::ADD: return "add-d";
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SUB: return "sub-d";
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MUL: return "mul-d";
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::DIV: return "div-d";
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MOD: return "mod-d";
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    default:
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UNREACHABLE();
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return NULL;
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticT::Mnemonic() const {
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (op()) {
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::ADD: return "add-t";
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SUB: return "sub-t";
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MUL: return "mul-t";
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MOD: return "mod-t";
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::DIV: return "div-t";
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::BIT_AND: return "bit-and-t";
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::BIT_OR: return "bit-or-t";
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::BIT_XOR: return "bit-xor-t";
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case Token::ROR: return "ror-t";
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SHL: return "sll-t";
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SAR: return "sra-t";
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SHR: return "srl-t";
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    default:
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UNREACHABLE();
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return NULL;
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool LGoto::HasInterestingComment(LCodeGen* gen) const {
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !gen->IsNextEmittedBlock(block_id());
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGoto::PrintDataTo(StringStream* stream) {
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("B%d", block_id());
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LBranch::PrintDataTo(StringStream* stream) {
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LDebugBreak();
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if ");
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  left()->PrintTo(stream);
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" %s ", Token::String(op()));
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  right()->PrintTo(stream);
1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_string(");
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_smi(");
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
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_undetectable(");
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if string_compare(");
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  left()->PrintTo(stream);
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  right()->PrintTo(stream);
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if has_instance_type(");
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if class_of_test(");
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(", \"%o\") then B%d else B%d",
2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              *hydrogen()->class_name(),
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              true_block_id(),
2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              false_block_id());
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if typeof ");
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" == \"%s\" then B%d else B%d",
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              hydrogen()->type_literal()->ToCString().get(),
2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              true_block_id(), false_block_id());
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" = ");
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(".code_entry = ");
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  code_object()->PrintTo(stream);
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" = ");
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base_object()->PrintTo(stream);
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" + ");
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  offset()->PrintTo(stream);
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < InputCount(); i++) {
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InputAt(i)->PrintTo(stream);
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" ");
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add("#%d / ", arity());
2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context()->PrintTo(stream);
2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[%d]", slot_index());
2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  context()->PrintTo(stream);
2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[%d] <- ", slot_index());
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value()->PrintTo(stream);
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("= ");
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function()->PrintTo(stream);
2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" #%d / ", arity());
2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LCallNewArray::PrintDataTo(StringStream* stream) {
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("= ");
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  constructor()->PrintTo(stream);
2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" #%d / ", arity());
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind kind = hydrogen()->elements_kind();
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  stream->Add(" (%s) ", ElementsKindToString(kind));
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  arguments()->PrintTo(stream);
2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" length ");
2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  length()->PrintTo(stream);
2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" index ");
2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  index()->PrintTo(stream);
2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::ostringstream os;
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os << hydrogen()->access() << " <- ";
301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  stream->Add(os.str().c_str());
3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintTo(stream);
3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  elements()->PrintTo(stream);
3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[");
3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  key()->PrintTo(stream);
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hydrogen()->IsDehoisted()) {
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" + %d]", base_offset());
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("]");
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  elements()->PrintTo(stream);
3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[");
3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  key()->PrintTo(stream);
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hydrogen()->IsDehoisted()) {
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add(" + %d] <-", base_offset());
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("] <- ");
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value() == NULL) {
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(hydrogen()->IsConstantHoleStore() &&
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           hydrogen()->value()->representation().IsDouble());
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stream->Add("<the hole(nan)>");
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value()->PrintTo(stream);
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Skip a slot if for a double-width slot.
346109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (kind == DOUBLE_REGISTERS) current_frame_slots_++;
347109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return current_frame_slots_++;
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind)  {
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index = GetNextSpillIndex(kind);
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kind == DOUBLE_REGISTERS) {
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LDoubleStackSlot::Create(index, zone());
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(kind == GENERAL_REGISTERS);
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LStackSlot::Create(index, zone());
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLPlatformChunk* LChunkBuilder::Build() {
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_unused());
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  chunk_ = new(zone()) LPlatformChunk(info(), graph());
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LPhase phase("L_Building chunk", chunk_);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  status_ = BUILDING;
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If compiling for OSR, reserve space for the unoptimized frame,
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // which will be subsumed into this frame.
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (graph()->has_osr()) {
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < blocks->length(); i++) {
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* next = NULL;
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (i < blocks->length() - 1) next = blocks->at(i + 1);
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    DoBasicBlock(blocks->at(i), next);
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (is_aborted()) return NULL;
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  status_ = DONE;
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return chunk_;
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LUnallocated(LUnallocated::FIXED_REGISTER, reg.code());
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) {
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone())
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER, reg.code());
3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, ToUnallocated(fixed_register));
4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) {
4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, ToUnallocated(reg));
4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) {
4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value,
4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
4173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                      LUnallocated::USED_AT_START));
4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value) {
4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) {
4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                     LUnallocated::USED_AT_START));
4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : Use(value);
4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseAtStart(value);
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegister(value);
4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegisterAtStart(value);
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOperand* LChunkBuilder::UseConstant(HValue* value) {
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return chunk_->DefineConstantOperand(HConstant::cast(value));
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAny(HValue* value) {
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value->EmitAtUses()) {
4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HInstruction* instr = HInstruction::cast(value);
4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    VisitInstruction(instr);
4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(value->id());
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    LUnallocated* result) {
4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result->set_virtual_register(current_instruction_->id());
4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->set_result(result);
4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsRegister(
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr) {
4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsSpilled(
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr, int index) {
5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineSameAsFirst(
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr) {
5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixed(
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr, Register reg) {
5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr, ToUnallocated(reg));
5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixedDouble(
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LTemplateResultInstruction<1>* instr, DoubleRegister reg) {
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr, ToUnallocated(reg));
5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* hydrogen_env = current_block_->last_environment();
5303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return LChunkBuilderBase::AssignEnvironment(instr, hydrogen_env);
5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        HInstruction* hinstr,
5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        CanDeoptimize can_deoptimize) {
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsNonDeferredCalling();
5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->VerifyCall();
5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->MarkAsCall();
5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr = AssignPointerMap(instr);
5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // If instruction does not have side-effects lazy deoptimization
5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // after the call will try to deoptimize to the point before the call.
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Thus we still need to attach environment to this call even if
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // call sequence can not deoptimize eagerly.
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_environment =
5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !hinstr->HasObservableSideEffects();
5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (needs_environment && !instr->HasEnvironment()) {
5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instr = AssignEnvironment(instr);
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We can't really figure out if the environment is needed or not.
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->environment()->set_has_been_used();
5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!instr->HasPointerMap());
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::TempRegister() {
5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand =
5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int vreg = allocator_->GetVirtualRegister();
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!allocator_->AllocationOk()) {
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    vreg = 0;
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  operand->set_virtual_register(vreg);
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return operand;
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLUnallocated* LChunkBuilder::TempDoubleRegister() {
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LUnallocated* operand =
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER);
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int vreg = allocator_->GetVirtualRegister();
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!allocator_->AllocationOk()) {
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    vreg = 0;
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  operand->set_virtual_register(vreg);
5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) {
5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand = ToUnallocated(reg);
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(operand->HasFixedPolicy());
5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) {
6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand = ToUnallocated(reg);
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(operand->HasFixedPolicy());
6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LLabel(instr->block());
6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  UNREACHABLE();
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShift(Token::Value op,
6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                     HBitwiseBinaryOperation* instr) {
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right_value = instr->right();
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = NULL;
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int constant_value = 0;
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool does_deopt = false;
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right_value->IsConstant()) {
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant* constant = HConstant::cast(right_value);
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = chunk_->DefineConstantOperand(constant);
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      constant_value = constant->Integer32Value() & 0x1f;
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Left shifts can deoptimize if we shift by > 0 and the result cannot be
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // truncated to smi.
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->representation().IsSmi() && constant_value > 0) {
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right = UseRegisterAtStart(right_value);
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Shift operations can only deoptimize if we do a logical shift
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // by 0 and the result cannot be truncated to int32.
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (op == Token::SHR && constant_value == 0) {
656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      does_deopt = !instr->CheckFlag(HInstruction::kUint32);
6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result =
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt));
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return does_deopt ? AssignEnvironment(result) : result;
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(op, instr);
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           HArithmeticBinaryOperation* instr) {
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsDouble());
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsDouble());
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (op == Token::MOD) {
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseFixedDouble(instr->left(), f2);
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseFixedDouble(instr->right(), f4);
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We call a C function for double modulo. It can't trigger a GC. We need
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // to use fixed result register for the call.
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(fschneider): Allow any register as input registers.
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(DefineFixedDouble(result, f2), instr);
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseRegisterAtStart(instr->right());
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(result);
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           HBinaryOperation* instr) {
6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* left = instr->left();
6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* right = instr->right();
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(left->representation().IsTagged());
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(right->representation().IsTagged());
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
6973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left_operand = UseFixed(left, a1);
6983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right_operand = UseFixed(right, a0);
6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticT* result =
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
7023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_building());
7073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_ = block;
7083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  next_block_ = next_block;
7093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (block->IsStartBlock()) {
7103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->UpdateEnvironment(graph_->start_environment());
7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    argument_count_ = 0;
7123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (block->predecessors()->length() == 1) {
7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We have a single predecessor => copy environment and outgoing
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // argument count from the predecessor.
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(block->phis()->length() == 0);
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HEnvironment* last_environment = pred->last_environment();
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(last_environment != NULL);
7193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Only copy the environment, if it is later used again.
7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (pred->end()->SecondSuccessor() == NULL) {
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(pred->end()->FirstSuccessor() == block);
7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        last_environment = last_environment->Copy();
7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->UpdateEnvironment(last_environment);
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(pred->argument_count() >= 0);
7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    argument_count_ = pred->argument_count();
7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We are at a state join => process phis.
7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
7343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // No need to copy the environment, it cannot be used later.
7353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HEnvironment* last_environment = pred->last_environment();
7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (int i = 0; i < block->phis()->length(); ++i) {
7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HPhi* phi = block->phis()->at(i);
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (phi->HasMergedIndex()) {
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        last_environment->SetValueAt(phi->merged_index(), phi);
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (block->deleted_phis()->at(i) < last_environment->length()) {
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        last_environment->SetValueAt(block->deleted_phis()->at(i),
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     graph_->GetConstantUndefined());
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
7483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->UpdateEnvironment(last_environment);
7493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Pick up the outgoing argument count of one of the predecessors.
7503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    argument_count_ = pred->argument_count();
7513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HInstruction* current = block->first();
7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int start = chunk_->instructions()->length();
7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (current != NULL && !is_aborted()) {
7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Code for constants in registers is generated lazily.
7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!current->EmitAtUses()) {
7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      VisitInstruction(current);
7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    current = current->next();
7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int end = chunk_->instructions()->length() - 1;
7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (end >= start) {
7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->set_first_instruction_index(start);
7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->set_last_instruction_index(end);
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  block->set_argument_count(argument_count_);
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  next_block_ = NULL;
7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_ = NULL;
7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
7733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HInstruction* old_current = current_instruction_;
7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_instruction_ = current;
7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* instr = NULL;
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (current->CanReplaceWithDummyUses()) {
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current->OperandCount() == 0) {
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = DefineAsRegister(new(zone()) LDummy());
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(!current->OperandAt(0)->IsControlInstruction());
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = DefineAsRegister(new(zone())
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          LDummyUse(UseAny(current->OperandAt(0))));
7843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 1; i < current->OperandCount(); ++i) {
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (current->OperandAt(i)->IsControlInstruction()) continue;
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* dummy =
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      dummy->set_hydrogen_value(current);
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      chunk_->AddInstruction(dummy, current_block_);
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBasicBlock* successor;
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current->IsControlInstruction() &&
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        successor != NULL) {
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = new(zone()) LGoto(successor);
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr = current->CompileToLithium(this);
8003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
8013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  argument_count_ += current->argument_delta();
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(argument_count_ >= 0);
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr != NULL) {
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddInstruction(instr, current);
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_instruction_ = old_current;
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid LChunkBuilder::AddInstruction(LInstruction* instr,
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   HInstruction* hydrogen_val) {
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Associate the hydrogen instruction first, since we may need it for
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->set_hydrogen_value(hydrogen_val);
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if DEBUG
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Make sure that the lithium instruction has either no fixed register
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // constraints in temps or the result OR no uses that are only used at
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // start. If this invariant doesn't hold, the register allocator can decide
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // to insert a split of a range immediately before the instruction due to an
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // already allocated register needing to be used for the instruction's fixed
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // register constraint. In this case, The register allocator won't see an
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // interference between the split child and the use-at-start (it would if
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the it was just a plain use), so it is free to move the split child into
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the same register that is used for the use-at-start.
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // See https://code.google.com/p/chromium/issues/detail?id=201590
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!(instr->ClobbersRegisters() &&
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instr->ClobbersDoubleRegisters(isolate()))) {
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int fixed = 0;
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int used_at_start = 0;
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (UseIterator it(instr); !it.Done(); it.Advance()) {
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LUnallocated* operand = LUnallocated::cast(it.Current());
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (operand->IsUsedAtStart()) ++used_at_start;
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->Output() != NULL) {
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (TempIterator it(instr); !it.Done(); it.Advance()) {
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LUnallocated* operand = LUnallocated::cast(it.Current());
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (operand->HasFixedPolicy()) ++fixed;
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(fixed == 0 || used_at_start == 0);
8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr = AssignPointerMap(instr);
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_stress_environments && !instr->HasEnvironment()) {
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr = AssignEnvironment(instr);
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  chunk_->AddInstruction(instr, current_block_);
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  CreateLazyBailoutForCall(current_block_, instr, hydrogen_val);
8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoPrologue(HPrologue* instr) {
8633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LInstruction* result = new (zone()) LPrologue();
864f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  if (info_->scope()->NeedsContext()) {
8653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    result = MarkAsCall(result, instr);
8663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
8673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return result;
868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LGoto(instr->FirstSuccessor());
8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = value->representation();
8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HType type = value->type();
880c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ToBooleanHints expected = instr->expected_input_types();
881c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (expected == ToBooleanHint::kNone) expected = ToBooleanHint::kAny;
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* branch = new(zone()) LBranch(UseRegister(value));
886c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!easy_case && ((!(expected & ToBooleanHint::kSmallInteger) &&
887c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                      (expected & ToBooleanHint::kNeedsMap)) ||
888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                     expected != ToBooleanHint::kAny)) {
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    branch = AssignEnvironment(branch);
8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return branch;
8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpMapAndBranch(value, temp);
9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
9053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(
9063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LArgumentsLength(UseRegister(length->value())));
9073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsElements);
9133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch(
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HHasInPrototypeChainAndBranch* instr) {
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object = UseRegister(instr->object());
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* prototype = UseRegister(instr->prototype());
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LHasInPrototypeChainAndBranch* result =
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LHasInPrototypeChainAndBranch(object, prototype);
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignEnvironment(result);
9233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
9273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseRegisterAtStart(instr->receiver());
9283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseRegisterAtStart(instr->function());
9293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
9313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
9353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseFixed(instr->function(), a1);
9363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseFixed(instr->receiver(), a0);
9373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length = UseFixed(instr->length(), a2);
9383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* elements = UseFixed(instr->elements(), a3);
9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LApplyArguments* result = new(zone()) LApplyArguments(function,
9403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        receiver,
9413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        length,
9423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        elements);
9433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
9443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int argc = instr->OperandCount();
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < argc; ++i) {
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* argument = Use(instr->argument(i));
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddInstruction(new(zone()) LPushArgument(argument), instr);
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreCodeEntry(
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HStoreCodeEntry* store_code_entry) {
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function = UseRegister(store_code_entry->function());
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LStoreCodeEntry(function, code_object);
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoInnerAllocatedObject(
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HInnerAllocatedObject* instr) {
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* base_object = UseRegisterAtStart(instr->base_object());
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LInnerAllocatedObject(base_object, offset));
9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses()
9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? NULL
9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : DefineAsRegister(new(zone()) LThisFunction);
9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoContext(HContext* instr) {
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->HasNoUses()) return NULL;
9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (info()->IsStub()) {
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(new(zone()) LContext, cp);
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LContext);
9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallWithDescriptor(
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCallWithDescriptor* instr) {
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptor descriptor = instr->descriptor();
1001f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_EQ(descriptor.GetParameterCount() +
1002f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                LCallWithDescriptor::kImplicitRegisterParameterCount,
1003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            instr->OperandCount());
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Target
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ops.Add(target, zone());
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Context
1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* op = UseFixed(instr->OperandAt(1), cp);
1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ops.Add(op, zone());
1012f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Load register parameters.
1013f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int i = 0;
1014f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (; i < descriptor.GetRegisterParameterCount(); i++) {
1015f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    op = UseFixed(instr->OperandAt(
1016f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                      i + LCallWithDescriptor::kImplicitRegisterParameterCount),
1017f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  descriptor.GetRegisterParameter(i));
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ops.Add(op, zone());
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1020f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Push stack parameters.
1021f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  for (; i < descriptor.GetParameterCount(); i++) {
1022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    op = UseAny(instr->OperandAt(
1023f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        i + LCallWithDescriptor::kImplicitRegisterParameterCount));
1024f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    AddInstruction(new (zone()) LPushArgument(op), instr);
1025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      descriptor, ops, zone());
10293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) {
10303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    result->MarkAsSyntacticTailCall();
10313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseFixed(instr->function(), a1);
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
10403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (instr->syntactic_tail_call_mode() == TailCallMode::kAllow) {
10413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    result->MarkAsSyntacticTailCall();
10423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
10443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (instr->op()) {
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathFloor:
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathFloor(instr);
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathRound:
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathRound(instr);
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathFround:
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathFround(instr);
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathAbs:
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathAbs(instr);
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathLog:
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathLog(instr);
105913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case kMathCos:
106013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return DoMathCos(instr);
106113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case kMathSin:
106213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return DoMathSin(instr);
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathExp:
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathExp(instr);
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathSqrt:
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathSqrt(instr);
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathPowHalf:
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathPowHalf(instr);
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kMathClz32:
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoMathClz32(instr);
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return NULL;
10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), f4);
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr);
10833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathClz32* result = new(zone()) LMathClz32(input);
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
109213e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathCos(HUnaryMathOperation* instr) {
109313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->representation().IsDouble());
109413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
109513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), f4);
109613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathCos(input), f4), instr);
109713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
109813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
109913e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochLInstruction* LChunkBuilder::DoMathSin(HUnaryMathOperation* instr) {
110013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->representation().IsDouble());
110113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
110213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), f4);
110313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathSin(input), f4), instr);
110413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
11053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsDouble());
110913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), f4);
111013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return MarkAsCall(DefineFixedDouble(new (zone()) LMathExp(input), f4), instr);
11113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf.
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseFixedDouble(instr->value(), f8);
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempDoubleRegister();
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp);
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineFixedDouble(result, f4);
11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) {
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathFround* result = new (zone()) LMathFround(input);
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
11273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = instr->value()->representation();
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32())
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? NULL
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseFixed(instr->context(), cp);
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result =
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineAsRegister(new(zone()) LMathAbs(context, input));
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!r.IsDouble()) result = AssignEnvironment(result);
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempRegister();
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathFloor* result = new(zone()) LMathFloor(input, temp);
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathSqrt* result = new(zone()) LMathSqrt(input);
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(result);
11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* input = UseRegister(instr->value());
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempDoubleRegister();
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathRound* result = new(zone()) LMathRound(input, temp);
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
11643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* constructor = UseFixed(instr->constructor(), a1);
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr);
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoRor(HRor* instr) {
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::ROR, instr);
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) {
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SHR, instr);
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) {
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DoShift(Token::SAR, instr);
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) {
11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DoShift(Token::SHL, instr);
11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LBitI(left, right));
12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(instr->op(), instr);
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       divisor != 1 && divisor != -1)) {
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsInteger32());
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI(
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 ||
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoDivI(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  LOperand* divisor = UseRegister(instr->right());
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempRegister();
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result =
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp));
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kCanOverflow) &&
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) ||
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (!instr->IsMathFloorOfDiv() &&
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) {
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->RightIsPowerOf2()) {
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivByPowerOf2I(instr);
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (instr->right()->IsConstant()) {
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivByConstI(instr);
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DoDivI(instr);
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsDouble()) {
12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::DIV, instr);
12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::DIV, instr);
12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegisterAtStart(instr->left());
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I(
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsInteger32());
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp =
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      NULL : TempRegister();
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LFlooringDivByConstI(dividend, divisor, temp));
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 ||
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* result =
1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      DefineAsRegister(new (zone()) LFlooringDivI(dividend, divisor));
1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      (instr->CheckFlag(HValue::kCanOverflow))) {
1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    result = AssignEnvironment(result);
1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return result;
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RightIsPowerOf2()) {
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivByPowerOf2I(instr);
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->right()->IsConstant()) {
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivByConstI(instr);
13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoFlooringDivI(instr);
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegisterAtStart(instr->left());
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor = instr->right()->GetInteger32Constant();
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LModByConstI(
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          dividend, divisor));
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsSmiOrInteger32());
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().Equals(instr->representation()));
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().Equals(instr->representation()));
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend = UseRegister(instr->left());
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor = UseRegister(instr->right());
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineAsRegister(new(zone()) LModI(
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      dividend, divisor));
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) {
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr);
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsDouble()) {
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticD(Token::MOD, instr);
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DoArithmeticT(Token::MOD, instr);
14043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) {
1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* left = instr->BetterLeftOperand();
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* right = instr->BetterRightOperand();
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left_op;
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right_op;
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero);
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int32_t constant_value = 0;
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right->IsConstant()) {
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant* constant = HConstant::cast(right);
1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      constant_value = constant->Integer32Value();
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Constants -1, 0 and 1 can be optimized if the result can overflow.
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // For other constants, it can be optimized only without overflow.
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) {
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        left_op = UseRegisterAtStart(left);
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        right_op = UseConstant(right);
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (bailout_on_minus_zero) {
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          left_op = UseRegister(left);
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        } else {
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          left_op = UseRegisterAtStart(left);
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        right_op = UseRegister(right);
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (bailout_on_minus_zero) {
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        left_op = UseRegister(left);
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        left_op = UseRegisterAtStart(left);
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      right_op = UseRegister(right);
14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LMulI* mul = new(zone()) LMulI(left_op, right_op);
1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (right_op->IsConstantOperand()
1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            ? ((can_overflow && constant_value == -1) ||
1447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               (bailout_on_minus_zero && constant_value <= 0))
1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            : (can_overflow || bailout_on_minus_zero)) {
14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AssignEnvironment(mul);
14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(mul);
14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsDouble()) {
1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (IsMipsArchVariant(kMips32r2)) {
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->HasOneUse() && instr->uses().value()->IsAdd()) {
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HAdd* add = HAdd::cast(instr->uses().value());
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (instr == add->left()) {
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // This mul is the lhs of an add. The add and mul will be folded
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // into a multiply-add.
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return NULL;
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (instr == add->right() && !add->left()->IsMul()) {
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // This mul is the rhs of an add, where the lhs is not another mul.
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          // The add and mul will be folded into a multiply-add.
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return NULL;
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
14693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::MUL, instr);
14703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
14713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::MUL, instr);
14723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) {
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->right());
14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LSubI* sub = new(zone()) LSubI(left, right);
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* result = DefineAsRegister(sub);
14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kCanOverflow)) {
14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      result = AssignEnvironment(result);
14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsDouble()) {
14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::SUB, instr);
14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::SUB, instr);
14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) {
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* multiplier_op = UseRegisterAtStart(mul->left());
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* multiplicand_op = UseRegisterAtStart(mul->right());
1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* addend_op = UseRegisterAtStart(addend);
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op,
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                     multiplicand_op));
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* result = DefineAsRegister(add);
15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kCanOverflow)) {
15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      result = AssignEnvironment(result);
15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->representation().IsExternal()) {
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(instr->IsConsistentExternalRepresentation());
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->right());
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LInstruction* result = DefineAsRegister(add);
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsDouble()) {
1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (IsMipsArchVariant(kMips32r2)) {
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->left()->IsMul())
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DoMultiplyAdd(HMul::cast(instr->left()), instr->right());
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->right()->IsMul()) {
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DCHECK(!instr->left()->IsMul());
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DoMultiplyAdd(HMul::cast(instr->right()), instr->left());
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::ADD, instr);
15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::ADD, instr);
15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left = NULL;
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = NULL;
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->representation().IsSmiOrInteger32()) {
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(instr->representation()));
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(instr->representation()));
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->BetterLeftOperand());
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseOrConstantAtStart(instr->BetterRightOperand());
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->representation().IsDouble());
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().IsDouble());
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().IsDouble());
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    left = UseRegisterAtStart(instr->left());
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    right = UseRegisterAtStart(instr->right());
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LMathMinMax(left, right));
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->representation().IsDouble());
15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // We call a C function for double power. It can't trigger a GC.
15643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // We need to use fixed result register for the call.
15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation exponent_type = instr->right()->representation();
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsDouble());
15673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixedDouble(instr->left(), f2);
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right =
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      exponent_type.IsDouble()
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ? UseFixedDouble(instr->right(), f4)
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LPower* result = new(zone()) LPower(left, right);
15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, f0),
15743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    instr,
15753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    CAN_DEOPTIMIZE_EAGERLY);
15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsTagged());
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsTagged());
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), a1);
15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), a0);
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCmpT* result = new(zone()) LCmpT(context, left, right);
15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCompareNumericAndBranch* instr) {
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation r = instr->representation();
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsSmiOrInteger32()) {
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().Equals(r));
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().Equals(r));
15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone()) LCompareNumericAndBranch(left, right);
15993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(r.IsDouble());
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->left()->representation().IsDouble());
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->right()->representation().IsDouble());
16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseRegisterAtStart(instr->right());
1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone()) LCompareNumericAndBranch(left, right);
16063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HCompareObjectEqAndBranch* instr) {
16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseRegisterAtStart(instr->right());
16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpObjectEqAndBranch(left, right);
16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCompareHoleAndBranch* instr) {
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LCmpHoleAndBranch(value);
16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
16283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()),
16293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        temp);
16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
16363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
16403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HIsUndetectableAndBranch* instr) {
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsUndetectableAndBranch(
16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UseRegisterAtStart(instr->value()), TempRegister());
16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch(
16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStringCompareAndBranch* instr) {
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->left()->representation().IsTagged());
1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->right()->representation().IsTagged());
1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
16523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), a1);
16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), a0);
16543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCompareAndBranch* result =
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCompareAndBranch(context, left, right);
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HHasInstanceTypeAndBranch* instr) {
1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
16643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasInstanceTypeAndBranch(value);
16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HClassOfTestAndBranch* instr) {
1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->value()->representation().IsTagged());
16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()),
16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister());
16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string = UseRegisterAtStart(instr->string());
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string = UseRegisterAtStart(instr->string());
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = FLAG_debug_code
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseRegisterAtStart(instr->index())
1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : UseRegisterOrConstantAtStart(instr->index());
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL;
1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LSeqStringSetChar(context, string, index, value);
16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_debug_code && instr->skip_check()) return NULL;
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length = !index->IsConstantOperand()
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ? UseRegisterOrConstantAtStart(instr->length())
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  : UseRegisterAtStart(instr->length());
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LBoundsCheck(index, length);
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!FLAG_debug_code || !instr->skip_check()) {
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The control instruction marking the end of a block that completed
17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // abruptly (e.g., threw an exception).  There is nothing specific to do.
17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
17113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // All HForceRepresentation instructions should be eliminated in the
17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // representation change phase of Hydrogen.
17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  UNREACHABLE();
17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) {
17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation from = instr->from();
17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation to = instr->to();
1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* val = instr->value();
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (from.IsSmi()) {
1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged()) {
1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return DefineSameAsFirst(new(zone()) LDummyUse(value));
1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    from = Representation::Tagged();
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (from.IsTagged()) {
17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to.IsDouble()) {
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value));
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->type().IsSmi()) {
1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineSameAsFirst(new(zone()) LDummyUse(value));
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsInteger32());
1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->type().IsSmi() || val->representation().IsSmi()) {
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegisterAtStart(val);
1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LSmiUntag(value, false));
17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegister(val);
17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LOperand* temp1 = TempRegister();
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = TempDoubleRegister();
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LInstruction* result =
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2));
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return result;
17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (from.IsDouble()) {
17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to.IsTagged()) {
1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      info()->MarkAsDeferredCalling();
1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* temp1 = TempRegister();
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* temp2 = TempRegister();
17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LUnallocated* result_temp = TempRegister();
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2);
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignPointerMap(Define(result, result_temp));
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return AssignEnvironment(
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsInteger32());
1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value));
1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result);
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (from.IsInteger32()) {
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info()->MarkAsDeferredCalling();
17873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to.IsTagged()) {
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!instr->CheckFlag(HValue::kCanOverflow)) {
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegisterAtStart(val);
17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return DefineAsRegister(new(zone()) LSmiTag(value));
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (val->CheckFlag(HInstruction::kUint32)) {
1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegisterAtStart(val);
1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp1 = TempRegister();
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = TempRegister();
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return AssignPointerMap(DefineAsRegister(result));
17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* value = UseRegisterAtStart(val);
1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp1 = TempRegister();
1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* temp2 = TempRegister();
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2);
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return AssignPointerMap(DefineAsRegister(result));
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (to.IsSmi()) {
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LOperand* value = UseRegister(val);
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (instr->CheckFlag(HValue::kCanOverflow)) {
1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        result = AssignEnvironment(result);
18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return result;
18113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(to.IsDouble());
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (val->CheckFlag(HInstruction::kUint32)) {
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val)));
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  UNREACHABLE();
18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
18263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LCheckNonSmi(value);
1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!instr->value()->type().IsHeapObject()) {
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(new(zone()) LCheckSmi(value));
18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoCheckArrayBufferNotNeutered(
1842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HCheckArrayBufferNotNeutered* instr) {
1843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* view = UseRegisterAtStart(instr->value());
1844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LCheckArrayBufferNotNeutered* result =
1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      new (zone()) LCheckArrayBufferNotNeutered(view);
1846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignEnvironment(result);
1847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = new(zone()) LCheckInstanceType(value);
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(result);
18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
18583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(new(zone()) LCheckValue(value));
18603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
18653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->HasMigrationTarget()) {
1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    info()->MarkAsDeferredCalling();
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignPointerMap(result);
1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
18723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
18763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation input_rep = value->representation();
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* reg = UseRegister(value);
18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (input_rep.IsDouble()) {
18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Revisit this decision, here and 8 lines below.
1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LClampDToUint8(reg,
1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        TempDoubleRegister()));
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (input_rep.IsInteger32()) {
18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LClampIToUint8(reg));
18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(input_rep.IsSmiOrTagged());
1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LClampTToUint8* result =
1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        new(zone()) LClampTToUint8(reg, TempDoubleRegister());
18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(DefineAsRegister(result));
18903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = info()->IsStub()
1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? UseFixed(instr->context(), cp)
1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : NULL;
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LReturn(UseFixed(instr->value(), v0), context,
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             parameter_count);
19013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
19053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation r = instr->representation();
1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (r.IsSmi()) {
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LConstantS);
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (r.IsInteger32()) {
19093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantI);
19103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (r.IsDouble()) {
19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantD);
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (r.IsExternal()) {
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsRegister(new(zone()) LConstantE);
19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (r.IsTagged()) {
19153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantT);
19163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
19173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    UNREACHABLE();
19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return NULL;
19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
19253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
19263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineAsRegister(new(zone()) LLoadContextSlot(context));
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
19353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* context;
19363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value;
19373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->NeedsWriteBarrier()) {
19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    context = UseTempRegister(instr->context());
19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    value = UseTempRegister(instr->value());
19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    context = UseRegister(instr->context());
19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    value = UseRegister(instr->value());
19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LStoreContextSlot(context, value);
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* obj = UseRegisterAtStart(instr->object());
1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadFunctionPrototype* instr) {
19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(
19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
1966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LLoadRoot);
19673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instr->key()->representation().IsSmiOrInteger32());
1972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = NULL;
19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!instr->is_fixed_typed_array()) {
1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* obj = NULL;
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->representation().IsDouble()) {
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      obj = UseRegister(instr->elements());
1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(instr->representation().IsSmiOrTagged());
1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      obj = UseRegisterAtStart(instr->elements());
1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = DefineAsRegister(new (zone()) LLoadKeyed(obj, key, nullptr));
1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(
1987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (instr->representation().IsInteger32() &&
1988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         !IsDoubleOrFloatElementsKind(elements_kind)) ||
1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (instr->representation().IsDouble() &&
1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         IsDoubleOrFloatElementsKind(elements_kind)));
1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* backing_store = UseRegister(instr->elements());
1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LOperand* backing_store_owner = UseAny(instr->backing_store_owner());
1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = DefineAsRegister(
1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        new (zone()) LLoadKeyed(backing_store, key, backing_store_owner));
1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool needs_environment;
1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instr->is_fixed_typed_array()) {
1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // see LCodeGen::DoLoadKeyedExternalArray
2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    needs_environment = elements_kind == UINT32_ELEMENTS &&
2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        !instr->CheckFlag(HInstruction::kUint32);
2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // see LCodeGen::DoLoadKeyedFixedDoubleArray and
2004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // LCodeGen::DoLoadKeyedFixedArray
2005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    needs_environment =
2006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        instr->RequiresHoleCheck() ||
2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        (instr->hole_mode() == CONVERT_HOLE_TO_UNDEFINED && info()->IsStub());
2008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (needs_environment) {
2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = AssignEnvironment(result);
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!instr->is_fixed_typed_array()) {
2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->elements()->representation().IsTagged());
2020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool needs_write_barrier = instr->NeedsWriteBarrier();
2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* object = NULL;
2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* val = NULL;
2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* key = NULL;
20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instr->value()->representation().IsDouble()) {
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      object = UseRegisterAtStart(instr->elements());
2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      key = UseRegisterOrConstantAtStart(instr->key());
2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      val = UseRegister(instr->value());
2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(instr->value()->representation().IsSmiOrTagged());
2031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (needs_write_barrier) {
2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object = UseTempRegister(instr->elements());
2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val = UseTempRegister(instr->value());
2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key = UseTempRegister(instr->key());
2035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object = UseRegisterAtStart(instr->elements());
2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val = UseRegisterAtStart(instr->value());
2038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        key = UseRegisterOrConstantAtStart(instr->key());
2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return new (zone()) LStoreKeyed(object, key, val, nullptr);
2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(
2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->value()->representation().IsInteger32() &&
2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       !IsDoubleOrFloatElementsKind(instr->elements_kind())) ||
2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->value()->representation().IsDouble() &&
2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       IsDoubleOrFloatElementsKind(instr->elements_kind())));
2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(instr->elements()->representation().IsExternal());
2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* val = UseRegister(instr->value());
20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* backing_store = UseRegister(instr->elements());
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner = UseAny(instr->backing_store_owner());
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return new (zone()) LStoreKeyed(backing_store, key, val, backing_store_owner);
20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind(
20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HTransitionElementsKind* instr) {
2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
20623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseRegister(instr->object());
20633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = TempRegister();
20643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        new(zone()) LTransitionElementsKind(object, NULL, new_map_reg);
2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
20673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseFixed(instr->object(), a0);
2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseFixed(instr->context(), cp);
20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        new(zone()) LTransitionElementsKind(object, context, NULL);
2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(result, instr);
20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoTrapAllocationMemento(
2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HTrapAllocationMemento* instr) {
2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object = UseRegister(instr->object());
2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = TempRegister();
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTrapAllocationMemento* result =
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LTrapAllocationMemento(object, temp);
2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(result);
2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLInstruction* LChunkBuilder::DoMaybeGrowElements(HMaybeGrowElements* instr) {
2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  info()->MarkAsDeferredCalling();
2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* context = UseFixed(instr->context(), cp);
2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object = Use(instr->object());
2091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* elements = Use(instr->elements());
2092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
2093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* current_capacity = UseRegisterOrConstant(instr->current_capacity());
2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LMaybeGrowElements* result = new (zone())
2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LMaybeGrowElements(context, object, elements, key, current_capacity);
2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DefineFixed(result, v0);
2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AssignPointerMap(AssignEnvironment(result));
2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_in_object = instr->access().IsInobject();
21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_write_barrier = instr->NeedsWriteBarrier();
2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool needs_write_barrier_for_map = instr->has_transition() &&
2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr->NeedsWriteBarrierForMap();
2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* obj;
2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (needs_write_barrier) {
2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = is_in_object
2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegister(instr->object())
2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseTempRegister(instr->object());
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    obj = needs_write_barrier_for_map
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? UseRegister(instr->object())
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : UseRegisterAtStart(instr->object());
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* val;
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (needs_write_barrier) {
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseTempRegister(instr->value());
2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (instr->field_representation().IsDouble()) {
2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegisterAtStart(instr->value());
2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = UseRegister(instr->value());
2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We need a temporary register for write barrier of the map field.
2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL;
21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return new(zone()) LStoreNamedField(obj, val, temp);
21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left = UseFixed(instr->left(), a1);
2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right = UseFixed(instr->right(), a0);
2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkAsCall(
2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DefineFixed(new(zone()) LStringAdd(context, left, right), v0),
2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instr);
21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* string = UseTempRegister(instr->string());
21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseTempRegister(instr->index());
2148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharCodeAt* result =
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCharCodeAt(context, string, index);
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
21523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* char_code = UseRegister(instr->value());
2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseAny(instr->context());
2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharFromCode* result =
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new(zone()) LStringCharFromCode(context, char_code);
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
21613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
2165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* size = UseRegisterOrConstant(instr->size());
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1 = TempRegister();
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2 = TempRegister();
2168bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (instr->IsAllocationFolded()) {
2169bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LFastAllocate* result = new (zone()) LFastAllocate(size, temp1, temp2);
2170bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return DefineAsRegister(result);
2171bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } else {
2172bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    info()->MarkAsDeferredCalling();
2173bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LOperand* context = UseAny(instr->context());
2174bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LAllocate* result = new (zone()) LAllocate(context, size, temp1, temp2);
2175bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return AssignPointerMap(DefineAsRegister(result));
2176bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(argument_count_ == 0);
21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  allocator_->MarkAsOsrEntry();
21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_->last_environment()->set_ast_id(instr->ast_id());
21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LOsrEntry);
21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LParameter* result = new(zone()) LParameter;
2190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->kind() == HParameter::STACK_PARAMETER) {
2191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int spill_index = chunk()->GetParameterStackSlot(instr->index());
2192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineAsSpilled(result, spill_index);
2193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(info()->IsStub());
2195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    CallInterfaceDescriptor descriptor = graph()->descriptor();
2196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index = static_cast<int>(instr->index());
2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Register reg = descriptor.GetRegisterParameter(index);
2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return DefineFixed(result, reg);
2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use an index that corresponds to the location in the unoptimized frame,
2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // which the optimized frame will subsume.
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int env_index = instr->index();
2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int spill_index = 0;
2208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->environment()->is_parameter_index(env_index)) {
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    spill_index = chunk()->GetParameterStackSlot(env_index);
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    spill_index = env_index - instr->environment()->first_local_index();
2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Retry(kTooManySpillSlotsNeededForOSR);
2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      spill_index = 0;
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2216109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    spill_index += StandardFrameConstants::kFixedSlotCount;
22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // There are no real uses of the arguments object.
22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // arguments.length and element access are supported directly on
22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // stack arguments, and any real arguments object use causes a bailout.
22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // So this value is never used.
22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->ReplayEnvironment(current_block_->last_environment());
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // There are no real uses of a captured object.
2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NULL;
2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  info()->MarkAsRequiresFrame();
2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* args = UseRegister(instr->arguments());
2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length = UseRegisterOrConstantAtStart(instr->length());
2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* value = UseFixed(instr->value(), a3);
2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LTypeof* result = new (zone()) LTypeof(context, value);
22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
22533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
22573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
22583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  instr->ReplayEnvironment(current_block_->last_environment());
22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->is_function_entry()) {
2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseFixed(instr->context(), cp);
2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MarkAsCall(new(zone()) LStackCheck(context), instr);
22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->is_backwards_branch());
2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LOperand* context = UseAny(instr->context());
2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return AssignEnvironment(
2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        AssignPointerMap(new(zone()) LStackCheck(context)));
22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment();
2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  outer->set_ast_id(instr->ReturnId());
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HConstant* undefined = graph()->GetConstantUndefined();
22843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  HEnvironment* inner = outer->CopyForInlining(
22853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      instr->closure(), instr->arguments_count(), instr->function(), undefined,
22863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      instr->inlining_kind(), instr->syntactic_tail_call_mode());
2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Only replay binding of arguments object if it wasn't removed from graph.
2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inner->Bind(instr->arguments_var(), instr->arguments_object());
22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inner->BindContext(instr->closure_context());
2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inner->set_entry(instr);
22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_->UpdateEnvironment(inner);
22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* pop = NULL;
2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnvironment* env = current_block_->last_environment();
2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (env->entry()->arguments_pushed()) {
2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int argument_count = env->arguments_environment()->parameter_count();
2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    pop = new(zone()) LDrop(argument_count);
2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->argument_delta() == -argument_count);
2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment()->
23103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DiscardInlined(false);
23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_->UpdateEnvironment(outer);
23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return pop;
23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context = UseFixed(instr->context(), cp);
23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->enumerable(), a0);
2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
23263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegister(instr->map());
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map)));
23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
23333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegisterAtStart(instr->map());
23343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
23353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
23393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegister(instr->object());
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index = UseTempRegister(instr->index());
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* result = DefineSameAsFirst(load);
2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AssignPointerMap(result);
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // V8_TARGET_ARCH_MIPS
2350