112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// found in the LICENSE file.
412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/v8.h"
612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if V8_TARGET_ARCH_MIPS64
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/hydrogen-osr.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium-inl.h"
1112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/lithium-codegen-mips64.h"
1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace v8 {
1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace internal {
1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define DEFINE_COMPILE(type)                            \
1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  void L##type::CompileToNative(LCodeGen* generator) {  \
1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    generator->Do##type(this);                          \
1912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
2012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
2112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#undef DEFINE_COMPILE
2212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef DEBUG
2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::VerifyCall() {
2512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Call instructions can use only fixed registers as temporaries and
2612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // outputs because all registers are blocked by the calling convention.
2712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Inputs operands must use a fixed register or use-at-start policy or
2812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // a non-register policy.
29e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(Output() == NULL ||
3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org         LUnallocated::cast(Output())->HasFixedPolicy() ||
3112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org         !LUnallocated::cast(Output())->HasRegisterPolicy());
3212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (UseIterator it(this); !it.Done(); it.Advance()) {
3312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
34e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||
3512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           operand->IsUsedAtStart());
3612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
3712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (TempIterator it(this); !it.Done(); it.Advance()) {
3812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LUnallocated* operand = LUnallocated::cast(it.Current());
39e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
4012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
4112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
4212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
4312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::PrintTo(StringStream* stream) {
4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("%s ", this->Mnemonic());
4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  PrintOutputOperandTo(stream);
4912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  PrintDataTo(stream);
5112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (HasEnvironment()) {
5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(" ");
5412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    environment()->PrintTo(stream);
5512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
5612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (HasPointerMap()) {
5812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(" ");
5912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    pointer_map()->PrintTo(stream);
6012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
6112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
6212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
6312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
6412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::PrintDataTo(StringStream* stream) {
6512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("= ");
6612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 0; i < InputCount(); i++) {
6712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (i > 0) stream->Add(" ");
6812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (InputAt(i) == NULL) {
6912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      stream->Add("NULL");
7012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
7112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      InputAt(i)->PrintTo(stream);
7212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
7312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
7412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
7512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInstruction::PrintOutputOperandTo(StringStream* stream) {
7812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (HasResult()) result()->PrintTo(stream);
7912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
8012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LLabel::PrintDataTo(StringStream* stream) {
8312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LGap::PrintDataTo(stream);
8412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LLabel* rep = replacement();
8512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (rep != NULL) {
8612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(" Dead block replaced with B%d", rep->block_id());
8712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
8812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
8912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgbool LGap::IsRedundant() const {
9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 0; i < 4; i++) {
9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return false;
9512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
9612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
9712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return true;
9912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LGap::PrintDataTo(StringStream* stream) {
10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 0; i < 4; i++) {
10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add("(");
10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (parallel_moves_[i] != NULL) {
10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      parallel_moves_[i]->PrintDataTo(stream);
10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(") ");
10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* LArithmeticD::Mnemonic() const {
11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  switch (op()) {
11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::ADD: return "add-d";
11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::SUB: return "sub-d";
11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::MUL: return "mul-d";
11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::DIV: return "div-d";
11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::MOD: return "mod-d";
12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    default:
12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      UNREACHABLE();
12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return NULL;
12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* LArithmeticT::Mnemonic() const {
12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  switch (op()) {
12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::ADD: return "add-t";
13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::SUB: return "sub-t";
13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::MUL: return "mul-t";
13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::MOD: return "mod-t";
13312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::DIV: return "div-t";
13412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::BIT_AND: return "bit-and-t";
13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::BIT_OR: return "bit-or-t";
13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::BIT_XOR: return "bit-xor-t";
13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::ROR: return "ror-t";
13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::SHL: return "sll-t";
13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::SAR: return "sra-t";
14012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Token::SHR: return "srl-t";
14112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    default:
14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      UNREACHABLE();
14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return NULL;
14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgbool LGoto::HasInterestingComment(LCodeGen* gen) const {
14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return !gen->IsNextEmittedBlock(block_id());
15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LGoto::PrintDataTo(StringStream* stream) {
15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("B%d", block_id());
15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LBranch::PrintDataTo(StringStream* stream) {
15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
16512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LDebugBreak();
16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if ");
17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  left()->PrintTo(stream);
17212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" %s ", Token::String(op()));
17312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  right()->PrintTo(stream);
17412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
17512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
17612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
17912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if is_object(");
18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if is_string(");
18712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
18812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
18912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
19012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
19312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if is_smi(");
19412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
19512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
19612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
19712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
20012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if is_undetectable(");
20112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
20212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
20312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
20412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
20712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if string_compare(");
20812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  left()->PrintTo(stream);
20912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  right()->PrintTo(stream);
21012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
21112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
21212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
21512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if has_instance_type(");
21612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
21712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
21812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
21912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
22012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
22112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
22212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if has_cached_array_index(");
22312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
22412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
22512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
22612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
22712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
22812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
22912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if class_of_test(");
23012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
23112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(", \"%o\") then B%d else B%d",
23212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org              *hydrogen()->class_name(),
23312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org              true_block_id(),
23412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org              false_block_id());
23512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
23612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
23712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
23812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
23912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("if typeof ");
24012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
24112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" == \"%s\" then B%d else B%d",
24212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org              hydrogen()->type_literal()->ToCString().get(),
24312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org              true_block_id(), false_block_id());
24412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
24512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
24612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
24712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreCodeEntry::PrintDataTo(StringStream* stream) {
24812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" = ");
24912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  function()->PrintTo(stream);
25012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(".code_entry = ");
25112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  code_object()->PrintTo(stream);
25212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
25312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
25412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
25512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInnerAllocatedObject::PrintDataTo(StringStream* stream) {
25612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" = ");
25712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  base_object()->PrintTo(stream);
25812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" + ");
25912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  offset()->PrintTo(stream);
26012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
26112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
26212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
26312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallJSFunction::PrintDataTo(StringStream* stream) {
26412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("= ");
26512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  function()->PrintTo(stream);
26612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("#%d / ", arity());
26712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
26812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
26912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
27012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallWithDescriptor::PrintDataTo(StringStream* stream) {
27112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 0; i < InputCount(); i++) {
27212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    InputAt(i)->PrintTo(stream);
27312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(" ");
27412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
27512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("#%d / ", arity());
27612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
27712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
27812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
27912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
28012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  context()->PrintTo(stream);
28112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("[%d]", slot_index());
28212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
28312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
28412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
28512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
28612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  context()->PrintTo(stream);
28712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("[%d] <- ", slot_index());
28812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
28912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
29012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
29112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
29212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
29312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("= ");
29412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  function()->PrintTo(stream);
29512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" #%d / ", arity());
29612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
29712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
29812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
29912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallNew::PrintDataTo(StringStream* stream) {
30012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("= ");
30112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  constructor()->PrintTo(stream);
30212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" #%d / ", arity());
30312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
30412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
30512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
30612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LCallNewArray::PrintDataTo(StringStream* stream) {
30712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("= ");
30812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  constructor()->PrintTo(stream);
30912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" #%d / ", arity());
31012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ElementsKind kind = hydrogen()->elements_kind();
31112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" (%s) ", ElementsKindToString(kind));
31212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
31312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
31412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
31512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
31612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  arguments()->PrintTo(stream);
31712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" length ");
31812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  length()->PrintTo(stream);
31912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" index ");
32012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  index()->PrintTo(stream);
32112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
32212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
32312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
32412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
32512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  object()->PrintTo(stream);
32612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  OStringStream os;
32712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  os << hydrogen()->access() << " <- ";
32812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(os.c_str());
32912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
33012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
33112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
33212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
33312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
33412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  object()->PrintTo(stream);
33512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(".");
33612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(String::cast(*name())->ToCString().get());
33712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" <- ");
33812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
33912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
34012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
34112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
34212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LLoadKeyed::PrintDataTo(StringStream* stream) {
34312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  elements()->PrintTo(stream);
34412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("[");
34512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  key()->PrintTo(stream);
34612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (hydrogen()->IsDehoisted()) {
34712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(" + %d]", base_offset());
34812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
34912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add("]");
35012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
35112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
35212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
35312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
35412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreKeyed::PrintDataTo(StringStream* stream) {
35512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  elements()->PrintTo(stream);
35612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("[");
35712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  key()->PrintTo(stream);
35812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (hydrogen()->IsDehoisted()) {
35912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add(" + %d] <-", base_offset());
36012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
36112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add("] <- ");
36212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
36312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
36412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (value() == NULL) {
365e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(hydrogen()->IsConstantHoleStore() &&
36612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           hydrogen()->value()->representation().IsDouble());
36712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    stream->Add("<the hole(nan)>");
36812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
36912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    value()->PrintTo(stream);
37012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
37112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
37212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
37312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
37412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
37512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  object()->PrintTo(stream);
37612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("[");
37712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  key()->PrintTo(stream);
37812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add("] <- ");
37912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  value()->PrintTo(stream);
38012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
38112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
38412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  object()->PrintTo(stream);
38512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
38612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
38712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint LPlatformChunk::GetNextSpillIndex(RegisterKind kind) {
39012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Skip a slot if for a double-width slot.
39112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (kind == DOUBLE_REGISTERS) spill_slot_count_++;
39212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return spill_slot_count_++;
39312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
39412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
39512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
39612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind)  {
39712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int index = GetNextSpillIndex(kind);
39812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (kind == DOUBLE_REGISTERS) {
39912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return LDoubleStackSlot::Create(index, zone());
40012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
401e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(kind == GENERAL_REGISTERS);
40212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return LStackSlot::Create(index, zone());
40312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
40412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
40512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
40612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
40712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLPlatformChunk* LChunkBuilder::Build() {
408e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_unused());
40912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  chunk_ = new(zone()) LPlatformChunk(info(), graph());
41012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LPhase phase("L_Building chunk", chunk_);
41112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  status_ = BUILDING;
41212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
41312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // If compiling for OSR, reserve space for the unoptimized frame,
41412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // which will be subsumed into this frame.
41512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (graph()->has_osr()) {
41612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    for (int i = graph()->osr()->UnoptimizedFrameSlots(); i > 0; i--) {
41712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      chunk_->GetNextSpillIndex(GENERAL_REGISTERS);
41812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
41912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
42012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
42112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
42212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 0; i < blocks->length(); i++) {
42312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HBasicBlock* next = NULL;
42412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (i < blocks->length() - 1) next = blocks->at(i + 1);
42512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    DoBasicBlock(blocks->at(i), next);
42612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (is_aborted()) return NULL;
42712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
42812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  status_ = DONE;
42912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return chunk_;
43012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
43112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
43412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
43512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                  Register::ToAllocationIndex(reg));
43612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
43712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) {
44012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
44112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                  DoubleRegister::ToAllocationIndex(reg));
44212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
44312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
44612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value, ToUnallocated(fixed_register));
44712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
44812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) {
45112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value, ToUnallocated(reg));
45212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
45312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegister(HValue* value) {
45612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
45712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
45812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
46012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
46112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value,
46212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
46312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                      LUnallocated::USED_AT_START));
46412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
46512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
46612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
46712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
46812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
46912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
47012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
47112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
47212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::Use(HValue* value) {
47312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
47412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
47512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
47612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
47712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseAtStart(HValue* value) {
47812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
47912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                     LUnallocated::USED_AT_START));
48012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
48112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
48212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
48312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
48412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return value->IsConstant()
48512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
48612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : Use(value);
48712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
48812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
48912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
49012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
49112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return value->IsConstant()
49212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
49312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : UseAtStart(value);
49412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
49512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
49612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
49712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
49812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return value->IsConstant()
49912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
50012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : UseRegister(value);
50112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
50212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
50312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
50412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
50512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return value->IsConstant()
50612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
50712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : UseRegisterAtStart(value);
50812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
50912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
51012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
51112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseConstant(HValue* value) {
51212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return chunk_->DefineConstantOperand(HConstant::cast(value));
51312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
51412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
51512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
51612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::UseAny(HValue* value) {
51712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return value->IsConstant()
51812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? chunk_->DefineConstantOperand(HConstant::cast(value))
51912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
52012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
52112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
52212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
52312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
52412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (value->EmitAtUses()) {
52512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HInstruction* instr = HInstruction::cast(value);
52612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    VisitInstruction(instr);
52712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
52812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  operand->set_virtual_register(value->id());
52912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return operand;
53012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
53112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
53212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
53312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::Define(LTemplateResultInstruction<1>* instr,
53412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                    LUnallocated* result) {
53512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  result->set_virtual_register(current_instruction_->id());
53612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->set_result(result);
53712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr;
53812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
53912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
54012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
54112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineAsRegister(
54212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
54312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Define(instr,
54412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
54512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
54612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
54712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
54812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineAsSpilled(
54912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTemplateResultInstruction<1>* instr, int index) {
55012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Define(instr,
55112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
55212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
55312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
55412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
55512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineSameAsFirst(
55612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTemplateResultInstruction<1>* instr) {
55712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Define(instr,
55812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
55912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
56012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixed(
56312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTemplateResultInstruction<1>* instr, Register reg) {
56412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Define(instr, ToUnallocated(reg));
56512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
56612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DefineFixedDouble(
56912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTemplateResultInstruction<1>* instr, DoubleRegister reg) {
57012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return Define(instr, ToUnallocated(reg));
57112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
57212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
57312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
57412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
57512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HEnvironment* hydrogen_env = current_block_->last_environment();
57612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int argument_index_accumulator = 0;
57712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ZoneList<HValue*> objects_to_materialize(0, zone());
57812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->set_environment(CreateEnvironment(hydrogen_env,
57912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                           &argument_index_accumulator,
58012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                           &objects_to_materialize));
58112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr;
58212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
58312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
58412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
58512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
58612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                        HInstruction* hinstr,
58712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                        CanDeoptimize can_deoptimize) {
58812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  info()->MarkAsNonDeferredCalling();
58912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef DEBUG
59012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->VerifyCall();
59112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
59212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->MarkAsCall();
59312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr = AssignPointerMap(instr);
59412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
59512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // If instruction does not have side-effects lazy deoptimization
59612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // after the call will try to deoptimize to the point before the call.
59712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Thus we still need to attach environment to this call even if
59812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // call sequence can not deoptimize eagerly.
59912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool needs_environment =
60012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
60112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      !hinstr->HasObservableSideEffects();
60212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (needs_environment && !instr->HasEnvironment()) {
60312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    instr = AssignEnvironment(instr);
60412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // We can't really figure out if the environment is needed or not.
60512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    instr->environment()->set_has_been_used();
60612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
60712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
60812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr;
60912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
61012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
61112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
61212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
613e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!instr->HasPointerMap());
61412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->set_pointer_map(new(zone()) LPointerMap(zone()));
61512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr;
61612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
61712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
61812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
61912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::TempRegister() {
62012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LUnallocated* operand =
62112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
62212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int vreg = allocator_->GetVirtualRegister();
62312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!allocator_->AllocationOk()) {
62412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
62512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    vreg = 0;
62612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
62712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  operand->set_virtual_register(vreg);
62812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return operand;
62912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
63012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLUnallocated* LChunkBuilder::TempDoubleRegister() {
63312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LUnallocated* operand =
63412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_DOUBLE_REGISTER);
63512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int vreg = allocator_->GetVirtualRegister();
63612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!allocator_->AllocationOk()) {
63712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
63812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    vreg = 0;
63912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
64012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  operand->set_virtual_register(vreg);
64112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return operand;
64212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
64312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
64412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
64512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::FixedTemp(Register reg) {
64612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LUnallocated* operand = ToUnallocated(reg);
647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
64812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return operand;
64912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
65012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
65112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
65212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) {
65312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LUnallocated* operand = ToUnallocated(reg);
654e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(operand->HasFixedPolicy());
65512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return operand;
65612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
65712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
65812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
65912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
66012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LLabel(instr->block());
66112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
66212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDummyUse(HDummyUse* instr) {
66512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LDummyUse(UseAny(instr->value())));
66612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
66712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoEnvironmentMarker(HEnvironmentMarker* instr) {
67012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  UNREACHABLE();
67112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
67212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
67312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
67612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(new(zone()) LDeoptimize);
67712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
67812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
68012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoShift(Token::Value op,
68112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                     HBitwiseBinaryOperation* instr) {
68212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
683e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
684e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
68512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
68612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
68712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HValue* right_value = instr->right();
68812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = NULL;
68912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int constant_value = 0;
69012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    bool does_deopt = false;
69112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (right_value->IsConstant()) {
69212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      HConstant* constant = HConstant::cast(right_value);
69312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      right = chunk_->DefineConstantOperand(constant);
69412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      constant_value = constant->Integer32Value() & 0x1f;
69512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // Left shifts can deoptimize if we shift by > 0 and the result cannot be
69612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // truncated to smi.
69712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (instr->representation().IsSmi() && constant_value > 0) {
69812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToSmi);
69912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
70012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
70112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      right = UseRegisterAtStart(right_value);
70212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
70312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
70412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Shift operations can only deoptimize if we do a logical shift
70512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // by 0 and the result cannot be truncated to int32.
70612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (op == Token::SHR && constant_value == 0) {
70712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (FLAG_opt_safe_uint32_operations) {
70812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        does_deopt = !instr->CheckFlag(HInstruction::kUint32);
70912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
71012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        does_deopt = !instr->CheckUsesForFlag(HValue::kTruncatingToInt32);
71112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
71212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
71312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
71412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LInstruction* result =
71512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt));
71612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return does_deopt ? AssignEnvironment(result) : result;
71712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
71812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(op, instr);
71912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
72012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
72112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
72212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
72312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
72412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                           HArithmeticBinaryOperation* instr) {
725e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
726e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
727e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsDouble());
72812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (op == Token::MOD) {
72912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseFixedDouble(instr->left(), f2);
73012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseFixedDouble(instr->right(), f4);
73112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
73212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // We call a C function for double modulo. It can't trigger a GC. We need
73312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // to use fixed result register for the call.
73412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // TODO(fschneider): Allow any register as input registers.
73512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return MarkAsCall(DefineFixedDouble(result, f2), instr);
73612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
73712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
73812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
73912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
74012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(result);
74112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
74212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
74312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
74412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
74512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
74612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                           HBinaryOperation* instr) {
74712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HValue* left = instr->left();
74812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HValue* right = instr->right();
749e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(left->representation().IsTagged());
750e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(right->representation().IsTagged());
75112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
75212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left_operand = UseFixed(left, a1);
75312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* right_operand = UseFixed(right, a0);
75412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LArithmeticT* result =
75512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LArithmeticT(op, context, left_operand, right_operand);
75612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
75712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
75812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
75912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
76012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
761e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_building());
76212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_block_ = block;
76312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  next_block_ = next_block;
76412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (block->IsStartBlock()) {
76512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    block->UpdateEnvironment(graph_->start_environment());
76612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    argument_count_ = 0;
76712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (block->predecessors()->length() == 1) {
76812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // We have a single predecessor => copy environment and outgoing
76912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // argument count from the predecessor.
770e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block->phis()->length() == 0);
77112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
77212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HEnvironment* last_environment = pred->last_environment();
773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(last_environment != NULL);
77412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Only copy the environment, if it is later used again.
77512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (pred->end()->SecondSuccessor() == NULL) {
776e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(pred->end()->FirstSuccessor() == block);
77712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
77812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
77912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
78012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        last_environment = last_environment->Copy();
78112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
78212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
78312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    block->UpdateEnvironment(last_environment);
784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(pred->argument_count() >= 0);
78512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    argument_count_ = pred->argument_count();
78612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
78712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // We are at a state join => process phis.
78812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HBasicBlock* pred = block->predecessors()->at(0);
78912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // No need to copy the environment, it cannot be used later.
79012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HEnvironment* last_environment = pred->last_environment();
79112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    for (int i = 0; i < block->phis()->length(); ++i) {
79212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      HPhi* phi = block->phis()->at(i);
79312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (phi->HasMergedIndex()) {
79412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        last_environment->SetValueAt(phi->merged_index(), phi);
79512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
79612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
79712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
79812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (block->deleted_phis()->at(i) < last_environment->length()) {
79912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        last_environment->SetValueAt(block->deleted_phis()->at(i),
80012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                     graph_->GetConstantUndefined());
80112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
80212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
80312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    block->UpdateEnvironment(last_environment);
80412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Pick up the outgoing argument count of one of the predecessors.
80512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    argument_count_ = pred->argument_count();
80612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
80712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HInstruction* current = block->first();
80812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int start = chunk_->instructions()->length();
80912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  while (current != NULL && !is_aborted()) {
81012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Code for constants in registers is generated lazily.
81112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (!current->EmitAtUses()) {
81212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      VisitInstruction(current);
81312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
81412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    current = current->next();
81512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
81612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int end = chunk_->instructions()->length() - 1;
81712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (end >= start) {
81812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    block->set_first_instruction_index(start);
81912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    block->set_last_instruction_index(end);
82012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
82112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  block->set_argument_count(argument_count_);
82212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  next_block_ = NULL;
82312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_block_ = NULL;
82412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
82512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
82812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HInstruction* old_current = current_instruction_;
82912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_instruction_ = current;
83012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
83112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* instr = NULL;
83212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (current->CanReplaceWithDummyUses()) {
83312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (current->OperandCount() == 0) {
83412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr = DefineAsRegister(new(zone()) LDummy());
83512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
836e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(!current->OperandAt(0)->IsControlInstruction());
83712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr = DefineAsRegister(new(zone())
83812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          LDummyUse(UseAny(current->OperandAt(0))));
83912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
84012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    for (int i = 1; i < current->OperandCount(); ++i) {
84112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (current->OperandAt(i)->IsControlInstruction()) continue;
84212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LInstruction* dummy =
84312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
84412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      dummy->set_hydrogen_value(current);
84512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      chunk_->AddInstruction(dummy, current_block_);
84612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
84712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
84812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HBasicBlock* successor;
84912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (current->IsControlInstruction() &&
85012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
85112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        successor != NULL) {
85212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr = new(zone()) LGoto(successor);
85312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
85412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr = current->CompileToLithium(this);
85512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
85612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
85712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
85812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  argument_count_ += current->argument_delta();
859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ >= 0);
86012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
86112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr != NULL) {
86212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    AddInstruction(instr, current);
86312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
86412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
86512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_instruction_ = old_current;
86612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
86712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
86812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
86912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid LChunkBuilder::AddInstruction(LInstruction* instr,
87012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                   HInstruction* hydrogen_val) {
87112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Associate the hydrogen instruction first, since we may need it for
87212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below.
87312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->set_hydrogen_value(hydrogen_val);
87412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
87512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#if DEBUG
87612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Make sure that the lithium instruction has either no fixed register
87712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // constraints in temps or the result OR no uses that are only used at
87812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // start. If this invariant doesn't hold, the register allocator can decide
87912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // to insert a split of a range immediately before the instruction due to an
88012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // already allocated register needing to be used for the instruction's fixed
88112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // register constraint. In this case, The register allocator won't see an
88212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // interference between the split child and the use-at-start (it would if
88312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // the it was just a plain use), so it is free to move the split child into
88412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // the same register that is used for the use-at-start.
88512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // See https://code.google.com/p/chromium/issues/detail?id=201590
88612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!(instr->ClobbersRegisters() &&
88712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        instr->ClobbersDoubleRegisters(isolate()))) {
88812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int fixed = 0;
88912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int used_at_start = 0;
89012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    for (UseIterator it(instr); !it.Done(); it.Advance()) {
89112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
89212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (operand->IsUsedAtStart()) ++used_at_start;
89312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
89412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instr->Output() != NULL) {
89512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (LUnallocated::cast(instr->Output())->HasFixedPolicy()) ++fixed;
89612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
89712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    for (TempIterator it(instr); !it.Done(); it.Advance()) {
89812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LUnallocated* operand = LUnallocated::cast(it.Current());
89912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (operand->HasFixedPolicy()) ++fixed;
90012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
901e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(fixed == 0 || used_at_start == 0);
90212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
90312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
90412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
90512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
90612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    instr = AssignPointerMap(instr);
90712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
90812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (FLAG_stress_environments && !instr->HasEnvironment()) {
90912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    instr = AssignEnvironment(instr);
91012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
91112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  chunk_->AddInstruction(instr, current_block_);
91212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
91312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->IsCall()) {
91412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HValue* hydrogen_value_for_lazy_bailout = hydrogen_val;
91512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LInstruction* instruction_needing_environment = NULL;
91612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (hydrogen_val->HasObservableSideEffects()) {
91712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      HSimulate* sim = HSimulate::cast(hydrogen_val->next());
91812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instruction_needing_environment = instr;
91912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      sim->ReplayEnvironment(current_block_->last_environment());
92012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      hydrogen_value_for_lazy_bailout = sim;
92112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
92212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout());
92312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout);
92412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    chunk_->AddInstruction(bailout, current_block_);
92512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instruction_needing_environment != NULL) {
92612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // Store the lazy deopt environment with the instruction if needed.
92712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // Right now it is only used for LInstanceOfKnownGlobal.
92812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instruction_needing_environment->
92912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          SetDeferredLazyDeoptimizationEnvironment(bailout->environment());
93012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
93112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
93212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
93312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
93412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
93512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
93612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LGoto(instr->FirstSuccessor());
93712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
93812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
93912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
94012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
94112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HValue* value = instr->value();
94212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation r = value->representation();
94312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HType type = value->type();
94412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ToBooleanStub::Types expected = instr->expected_input_types();
94512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic();
94612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
94712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() ||
94812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      type.IsJSArray() || type.IsHeapNumber() || type.IsString();
94912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* branch = new(zone()) LBranch(UseRegister(value));
95012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!easy_case &&
95112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) ||
95212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       !expected.IsGeneric())) {
95312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    branch = AssignEnvironment(branch);
95412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
95512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return branch;
95612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
95712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
95812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
95912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
960e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
96112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
96212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempRegister();
96312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LCmpMapAndBranch(value, temp);
96412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
96512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
96612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
96712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
96812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  info()->MarkAsRequiresFrame();
96912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(
97012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LArgumentsLength(UseRegister(length->value())));
97112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
97212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
97312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
97412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
97512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  info()->MarkAsRequiresFrame();
97612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LArgumentsElements);
97712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
97812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
97912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
98012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
98112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
98212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstanceOf* result =
98312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LInstanceOf(context, UseFixed(instr->left(), a0),
98412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                              UseFixed(instr->right(), a1));
98512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
98612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
98712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
98812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
98912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
99012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HInstanceOfKnownGlobal* instr) {
99112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstanceOfKnownGlobal* result =
99212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LInstanceOfKnownGlobal(
99312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          UseFixed(instr->context(), cp),
99412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          UseFixed(instr->left(), a0),
99512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          FixedTemp(a4));
99612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
99712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
99812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
99912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
100012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
100112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* receiver = UseRegisterAtStart(instr->receiver());
100212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
100312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
100412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(result));
100512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
100612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
100712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
100812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
100912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
101012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* receiver = UseFixed(instr->receiver(), a0);
101112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* length = UseFixed(instr->length(), a2);
101212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* elements = UseFixed(instr->elements(), a3);
101312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LApplyArguments* result = new(zone()) LApplyArguments(function,
101412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                                        receiver,
101512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                                        length,
101612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                                        elements);
101712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
101812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
101912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
102012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
102112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoPushArguments(HPushArguments* instr) {
102212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int argc = instr->OperandCount();
102312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 0; i < argc; ++i) {
102412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* argument = Use(instr->argument(i));
102512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    AddInstruction(new(zone()) LPushArgument(argument), instr);
102612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
102712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
102812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
102912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
103012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
103112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreCodeEntry(
103212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HStoreCodeEntry* store_code_entry) {
103312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseRegister(store_code_entry->function());
103412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* code_object = UseTempRegister(store_code_entry->code_object());
103512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LStoreCodeEntry(function, code_object);
103612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
103712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
103812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
103912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInnerAllocatedObject(
104012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HInnerAllocatedObject* instr) {
104112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* base_object = UseRegisterAtStart(instr->base_object());
104212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* offset = UseRegisterOrConstantAtStart(instr->offset());
104312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(
104412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LInnerAllocatedObject(base_object, offset));
104512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
104612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
104712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
104812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
104912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr->HasNoUses()
105012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? NULL
105112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : DefineAsRegister(new(zone()) LThisFunction);
105212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
105312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
105412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
105512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoContext(HContext* instr) {
105612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->HasNoUses()) return NULL;
105712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
105812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (info()->IsStub()) {
105912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineFixed(new(zone()) LContext, cp);
106012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
106112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
106212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LContext);
106312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
106412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
106512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
106612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
106712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
106812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(new(zone()) LDeclareGlobals(context), instr);
106912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
107012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
107112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
107212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallJSFunction(
107312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HCallJSFunction* instr) {
107412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
107512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
107612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LCallJSFunction* result = new(zone()) LCallJSFunction(function);
107712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
107812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
107912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
108012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallWithDescriptor(
108312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HCallWithDescriptor* instr) {
10849aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  CallInterfaceDescriptor descriptor = instr->descriptor();
108512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
108612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* target = UseRegisterOrConstantAtStart(instr->target());
108712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ZoneList<LOperand*> ops(instr->OperandCount(), zone());
108812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ops.Add(target, zone());
108912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  for (int i = 1; i < instr->OperandCount(); i++) {
10909aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    LOperand* op =
10919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org        UseFixed(instr->OperandAt(i), descriptor.GetParameterRegister(i - 1));
10929aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org     ops.Add(op, zone());
109312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
109412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
109512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(
109612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      descriptor, ops, zone());
109712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
109812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
109912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
110012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1101e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgLInstruction* LChunkBuilder::DoTailCallThroughMegamorphicCache(
1102e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    HTailCallThroughMegamorphicCache* instr) {
1103e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
1104e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* receiver_register =
1105e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->receiver(), LoadDescriptor::ReceiverRegister());
1106e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* name_register =
1107e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      UseFixed(instr->name(), LoadDescriptor::NameRegister());
1108e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  // Not marked as call. It can't deoptimize, and it never returns.
1109e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return new (zone()) LTailCallThroughMegamorphicCache(
1110e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org      context, receiver_register, name_register);
1111e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
1112e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1113e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
111412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
111512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
111612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
111712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInvokeFunction* result = new(zone()) LInvokeFunction(context, function);
111812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
111912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
112012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
112112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
112212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
112312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  switch (instr->op()) {
1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFloor:
1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathFloor(instr);
1126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathRound:
1127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathRound(instr);
1128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFround:
1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathFround(instr);
1130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathAbs:
1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathAbs(instr);
1132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathLog:
1133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathLog(instr);
1134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathExp:
1135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathExp(instr);
1136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathSqrt:
1137dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathSqrt(instr);
1138dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathPowHalf:
1139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathPowHalf(instr);
1140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathClz32:
1141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return DoMathClz32(instr);
114212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    default:
114312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      UNREACHABLE();
114412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return NULL;
114512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
114612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
114712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
114812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
114912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathLog(HUnaryMathOperation* instr) {
1150e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1151e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsDouble());
115212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseFixedDouble(instr->value(), f4);
115312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixedDouble(new(zone()) LMathLog(input), f4), instr);
115412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
115512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
115612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
115712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathClz32(HUnaryMathOperation* instr) {
115812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseRegisterAtStart(instr->value());
115912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LMathClz32* result = new(zone()) LMathClz32(input);
116012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(result);
116112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
116212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
116312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
116412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathExp(HUnaryMathOperation* instr) {
1165e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
1166e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsDouble());
116712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseRegister(instr->value());
116812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp1 = TempRegister();
116912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp2 = TempRegister();
117012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* double_temp = TempDoubleRegister();
117112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LMathExp* result = new(zone()) LMathExp(input, double_temp, temp1, temp2);
117212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(result);
117312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
117412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
117512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
117612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathPowHalf(HUnaryMathOperation* instr) {
117712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Input cannot be the same as the result, see LCodeGen::DoMathPowHalf.
117812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseFixedDouble(instr->value(), f8);
117912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempDoubleRegister();
118012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LMathPowHalf* result = new(zone()) LMathPowHalf(input, temp);
118112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineFixedDouble(result, f4);
118212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
118312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
118412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFround(HUnaryMathOperation* instr) {
1186dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LOperand* input = UseRegister(instr->value());
1187dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LMathFround* result = new (zone()) LMathFround(input);
1188dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  return DefineAsRegister(result);
1189dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org}
1190dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
1191dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
119212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathAbs(HUnaryMathOperation* instr) {
119312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation r = instr->value()->representation();
119412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = (r.IsDouble() || r.IsSmiOrInteger32())
119512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? NULL
119612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : UseFixed(instr->context(), cp);
119712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseRegister(instr->value());
119812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result =
119912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      DefineAsRegister(new(zone()) LMathAbs(context, input));
120012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!r.IsDouble() && !r.IsSmiOrInteger32()) result = AssignPointerMap(result);
120112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!r.IsDouble()) result = AssignEnvironment(result);
120212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
120312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
120412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
120512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
120612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloor(HUnaryMathOperation* instr) {
120712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseRegister(instr->value());
120812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempRegister();
120912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LMathFloor* result = new(zone()) LMathFloor(input, temp);
121012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
121112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
121212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
121312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
121412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathSqrt(HUnaryMathOperation* instr) {
121512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseRegister(instr->value());
121612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LMathSqrt* result = new(zone()) LMathSqrt(input);
121712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(result);
121812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
121912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
122012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
122112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathRound(HUnaryMathOperation* instr) {
122212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* input = UseRegister(instr->value());
122312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempDoubleRegister();
122412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LMathRound* result = new(zone()) LMathRound(input, temp);
122512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(result));
122612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
122712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
122812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
122912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
123012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
123112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), a1);
123212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LCallNew* result = new(zone()) LCallNew(context, constructor);
123312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
123412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
123512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
123612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
123712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) {
123812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
123912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* constructor = UseFixed(instr->constructor(), a1);
124012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LCallNewArray* result = new(zone()) LCallNewArray(context, constructor);
124112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
124212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
124312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
124412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
124512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
124612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
124712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseFixed(instr->function(), a1);
124812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LCallFunction* call = new(zone()) LCallFunction(context, function);
124912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(call, v0), instr);
125012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
125112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
125212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
125312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
125412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
125512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime(context), v0), instr);
125612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
125712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
125812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
125912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoRor(HRor* instr) {
126012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DoShift(Token::ROR, instr);
126112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
126212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
126312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
126412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoShr(HShr* instr) {
126512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DoShift(Token::SHR, instr);
126612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
126712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
126812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
126912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSar(HSar* instr) {
127012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DoShift(Token::SAR, instr);
127112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
127212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
127312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
127412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoShl(HShl* instr) {
127512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DoShift(Token::SHL, instr);
127612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
127712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
127812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
127912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
128012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1281e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1282e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
1283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->CheckFlag(HValue::kTruncatingToInt32));
128412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
128512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
128612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
128712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LBitI(left, right));
128812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
128912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(instr->op(), instr);
129012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
129112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
129212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
129312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
129412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) {
1295e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1296e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1297e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
129812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
129912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
130012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I(
130112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          dividend, divisor));
130212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
130312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) ||
130412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) &&
130512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      divisor != 1 && divisor != -1)) {
130612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
130712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
130812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
130912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
131012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
131112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
131212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) {
1313e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1314e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1315e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
131612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
131712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
131812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI(
131912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          dividend, divisor));
132012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (divisor == 0 ||
132112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
132212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) {
132312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
132412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
132512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
132612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
132712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
132812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
132912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDivI(HDiv* instr) {
1330e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1331e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1332e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
133312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
133412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
1335dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)
1336dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    ? NULL : TempRegister();
133712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result =
1338dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      DefineAsRegister(new(zone()) LDivI(dividend, divisor, temp));
133912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
134012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
134112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->CheckFlag(HValue::kCanOverflow) &&
134212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)) ||
134312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (!instr->IsMathFloorOfDiv() &&
134412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) {
134512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
134612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
134712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
134812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
134912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
135012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
135112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
135212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
135312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instr->RightIsPowerOf2()) {
135412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return DoDivByPowerOf2I(instr);
135512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else if (instr->right()->IsConstant()) {
135612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return DoDivByConstI(instr);
135712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
135812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return DoDivI(instr);
135912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
136012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->representation().IsDouble()) {
136112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticD(Token::DIV, instr);
136212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
136312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(Token::DIV, instr);
136412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
136512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
136612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
136712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
136812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr) {
136912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
137012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
137112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LFlooringDivByPowerOf2I(
137212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          dividend, divisor));
137312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) ||
137412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->CheckFlag(HValue::kLeftCanBeMinInt) && divisor == -1)) {
137512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
137612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
137712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
137812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
137912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
138012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
138112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) {
1382e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsInteger32());
1383e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
138512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
138612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
138712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp =
138812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) ||
138912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ?
139012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      NULL : TempRegister();
139112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineAsRegister(
139212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LFlooringDivByConstI(dividend, divisor, temp));
139312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (divisor == 0 ||
139412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) {
139512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
139612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
139712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
139812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
139912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
140012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
140112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
1402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1403e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1404e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
140512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
140612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
140712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor);
140812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(div));
140912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
141012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
141112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
141212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) {
141312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->RightIsPowerOf2()) {
141412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoFlooringDivByPowerOf2I(instr);
141512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->right()->IsConstant()) {
141612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoFlooringDivByConstI(instr);
141712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
141812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoFlooringDivI(instr);
141912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
142012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
142112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
142212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
142312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) {
1424e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1426e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
142712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegisterAtStart(instr->left());
142812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
142912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I(
143012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          dividend, divisor));
1431e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  if (instr->CheckFlag(HValue::kLeftCanBeNegative) &&
1432e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
143312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
143412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
143512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
143612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
143712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
143812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
143912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoModByConstI(HMod* instr) {
1440e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1441e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1442e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
144312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
144412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int32_t divisor = instr->right()->GetInteger32Constant();
144512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModByConstI(
144612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          dividend, divisor));
144712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
144812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
144912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
145012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
145112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
145212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
145312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
145412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoModI(HMod* instr) {
1455e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsSmiOrInteger32());
1456e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().Equals(instr->representation()));
1457e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().Equals(instr->representation()));
145812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* dividend = UseRegister(instr->left());
145912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* divisor = UseRegister(instr->right());
146012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineAsRegister(new(zone()) LModI(
146112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      dividend, divisor));
146212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
146312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
146412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
146512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
146612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
146712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
146812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
146912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
147012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMod(HMod* instr) {
147112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
147212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return instr->RightIsPowerOf2() ? DoModByPowerOf2I(instr) : DoModI(instr);
147312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->representation().IsDouble()) {
147412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticD(Token::MOD, instr);
147512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
147612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(Token::MOD, instr);
147712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
147812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
147912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
148012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
148112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMul(HMul* instr) {
148212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1483e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1484e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
148512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HValue* left = instr->BetterLeftOperand();
148612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HValue* right = instr->BetterRightOperand();
148712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left_op;
148812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right_op;
148912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
149012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero);
149112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
149212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (right->IsConstant()) {
149312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      HConstant* constant = HConstant::cast(right);
149412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      int32_t constant_value = constant->Integer32Value();
149512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // Constants -1, 0 and 1 can be optimized if the result can overflow.
149612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // For other constants, it can be optimized only without overflow.
149712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) {
149812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        left_op = UseRegisterAtStart(left);
149912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        right_op = UseConstant(right);
150012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
150112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        if (bailout_on_minus_zero) {
150212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          left_op = UseRegister(left);
150312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        } else {
150412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          left_op = UseRegisterAtStart(left);
150512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        }
150612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        right_op = UseRegister(right);
150712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
150812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
150912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (bailout_on_minus_zero) {
151012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        left_op = UseRegister(left);
151112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
151212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        left_op = UseRegisterAtStart(left);
151312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
151412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      right_op = UseRegister(right);
151512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
151612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LMulI* mul = new(zone()) LMulI(left_op, right_op);
151712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (can_overflow || bailout_on_minus_zero) {
151812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      AssignEnvironment(mul);
151912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
152012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(mul);
152112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
152212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->representation().IsDouble()) {
152312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (kArchVariant == kMips64r2) {
152412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (instr->HasOneUse() && instr->uses().value()->IsAdd()) {
152512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        HAdd* add = HAdd::cast(instr->uses().value());
152612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        if (instr == add->left()) {
152712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          // This mul is the lhs of an add. The add and mul will be folded
152812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          // into a multiply-add.
152912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          return NULL;
153012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        }
153112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        if (instr == add->right() && !add->left()->IsMul()) {
153212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          // This mul is the rhs of an add, where the lhs is not another mul.
153312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          // The add and mul will be folded into a multiply-add.
153412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          return NULL;
153512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        }
153612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
153712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
153812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticD(Token::MUL, instr);
153912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
154012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(Token::MUL, instr);
154112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
154212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
154312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
154412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
154512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSub(HSub* instr) {
154612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1547e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1548e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
154912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
155012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
155112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LSubI* sub = new(zone()) LSubI(left, right);
155212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LInstruction* result = DefineAsRegister(sub);
155312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
155412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      result = AssignEnvironment(result);
155512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
155612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return result;
155712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->representation().IsDouble()) {
155812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticD(Token::SUB, instr);
155912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
156012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(Token::SUB, instr);
156112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
156212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
156312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
156412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
156512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMultiplyAdd(HMul* mul, HValue* addend) {
156612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* multiplier_op = UseRegisterAtStart(mul->left());
156712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* multiplicand_op = UseRegisterAtStart(mul->right());
156812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* addend_op = UseRegisterAtStart(addend);
156912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineSameAsFirst(new(zone()) LMultiplyAddD(addend_op, multiplier_op,
157012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                                     multiplicand_op));
157112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
157212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
157312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
157412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
157512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1576e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1577e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
157812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
157912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
158012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
158112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LInstruction* result = DefineAsRegister(add);
158212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instr->CheckFlag(HValue::kCanOverflow)) {
158312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      result = AssignEnvironment(result);
158412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
158512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return result;
158612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->representation().IsExternal()) {
1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsExternal());
1588e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsInteger32());
1589e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!instr->CheckFlag(HValue::kCanOverflow));
159012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
159112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseOrConstantAtStart(instr->right());
159212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LAddI* add = new(zone()) LAddI(left, right);
159312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LInstruction* result = DefineAsRegister(add);
159412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return result;
159512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->representation().IsDouble()) {
159612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (kArchVariant == kMips64r2) {
159712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (instr->left()->IsMul())
159812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DoMultiplyAdd(HMul::cast(instr->left()), instr->right());
159912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
160012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (instr->right()->IsMul()) {
1601e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org        DCHECK(!instr->left()->IsMul());
160212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DoMultiplyAdd(HMul::cast(instr->right()), instr->left());
160312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
160412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
160512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticD(Token::ADD, instr);
160612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
160712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DoArithmeticT(Token::ADD, instr);
160812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
160912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
161012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
161112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
161212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
161312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left = NULL;
161412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* right = NULL;
161512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->representation().IsSmiOrInteger32()) {
1616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(instr->representation()));
1617e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(instr->representation()));
161812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    left = UseRegisterAtStart(instr->BetterLeftOperand());
161912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    right = UseOrConstantAtStart(instr->BetterRightOperand());
162012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
1621e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->representation().IsDouble());
1622e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1623e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
162412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    left = UseRegisterAtStart(instr->left());
162512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    right = UseRegisterAtStart(instr->right());
162612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
162712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LMathMinMax(left, right));
162812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
162912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
163012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
163112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoPower(HPower* instr) {
1632e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->representation().IsDouble());
163312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // We call a C function for double power. It can't trigger a GC.
163412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // We need to use fixed result register for the call.
163512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation exponent_type = instr->right()->representation();
1636e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsDouble());
163712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left = UseFixedDouble(instr->left(), f2);
16386313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  LOperand* right =
16396313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      exponent_type.IsDouble()
16406313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org          ? UseFixedDouble(instr->right(), f4)
16416313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org          : UseFixed(instr->right(), MathPowTaggedDescriptor::exponent());
164212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LPower* result = new(zone()) LPower(left, right);
164312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixedDouble(result, f0),
164412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                    instr,
164512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                    CAN_DEOPTIMIZE_EAGERLY);
164612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
164712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
164812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
164912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1650e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
165212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
165312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left = UseFixed(instr->left(), a1);
165412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* right = UseFixed(instr->right(), a0);
165512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LCmpT* result = new(zone()) LCmpT(context, left, right);
165612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
165712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
165812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
165912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
166012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareNumericAndBranch(
166112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HCompareNumericAndBranch* instr) {
166212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation r = instr->representation();
166312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (r.IsSmiOrInteger32()) {
1664e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().Equals(r));
1665e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().Equals(r));
166612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
166712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
166812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
166912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
1670e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(r.IsDouble());
1671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->left()->representation().IsDouble());
1672e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->right()->representation().IsDouble());
167312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* left = UseRegisterAtStart(instr->left());
167412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* right = UseRegisterAtStart(instr->right());
167512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return new(zone()) LCompareNumericAndBranch(left, right);
167612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
167712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
167812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
167912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
168012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
168112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HCompareObjectEqAndBranch* instr) {
168212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left = UseRegisterAtStart(instr->left());
168312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* right = UseRegisterAtStart(instr->right());
168412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LCmpObjectEqAndBranch(left, right);
168512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
168612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
168712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
168812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareHoleAndBranch(
168912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HCompareHoleAndBranch* instr) {
169012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
169112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LCmpHoleAndBranch(value);
169212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
169312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
169412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
169512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch(
169612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HCompareMinusZeroAndBranch* instr) {
169712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegister(instr->value());
169812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* scratch = TempRegister();
169912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LCompareMinusZeroAndBranch(value, scratch);
170012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
170112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
170212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
170312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1704e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
170512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempRegister();
170612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()),
170712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                        temp);
170812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
170912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
171012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
171112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
1712e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
171312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempRegister();
171412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()),
171512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                        temp);
171612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
171712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
171812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
171912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
172112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
172212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
172312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
172412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
172512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
172612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HIsUndetectableAndBranch* instr) {
1727e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
172812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LIsUndetectableAndBranch(
172912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      UseRegisterAtStart(instr->value()), TempRegister());
173012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
173112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
173212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
173312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringCompareAndBranch(
173412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HStringCompareAndBranch* instr) {
1735e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->left()->representation().IsTagged());
1736e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->right()->representation().IsTagged());
173712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
173812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left = UseFixed(instr->left(), a1);
173912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* right = UseFixed(instr->right(), a0);
174012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LStringCompareAndBranch* result =
174112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LStringCompareAndBranch(context, left, right);
174212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(result, instr);
174312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
174412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
174512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
174612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
174712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HHasInstanceTypeAndBranch* instr) {
1748e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
174912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
175012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LHasInstanceTypeAndBranch(value);
175112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
175212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
175312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
175412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
175512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HGetCachedArrayIndex* instr)  {
1756e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
175712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
175812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
175912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
176012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
176112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
176212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
176312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
176412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HHasCachedArrayIndexAndBranch* instr) {
1765e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
176612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LHasCachedArrayIndexAndBranch(
176712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      UseRegisterAtStart(instr->value()));
176812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
176912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
177012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
177112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
177212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HClassOfTestAndBranch* instr) {
1773e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
177412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()),
177512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                           TempRegister());
177612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
177712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
177812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
177912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
178012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* map = UseRegisterAtStart(instr->value());
178112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LMapEnumLength(map));
178212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
178312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
178412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
178512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
178612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* object = UseFixed(instr->value(), a0);
178712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LDateField* result =
178812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LDateField(object, FixedTemp(a1), instr->index());
178912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
179012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
179112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
179212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
179312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringGetChar(HSeqStringGetChar* instr) {
179412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
179512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
179612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LSeqStringGetChar(string, index));
179712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
179812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
179912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
180012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
180112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* string = UseRegisterAtStart(instr->string());
180212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* index = FLAG_debug_code
180312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? UseRegisterAtStart(instr->index())
180412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : UseRegisterOrConstantAtStart(instr->index());
180512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
180612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = FLAG_debug_code ? UseFixed(instr->context(), cp) : NULL;
180712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LSeqStringSetChar(context, string, index, value);
180812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
180912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
181012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
181112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
181212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!FLAG_debug_code && instr->skip_check()) return NULL;
181312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
181412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* length = !index->IsConstantOperand()
181512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ? UseRegisterOrConstantAtStart(instr->length())
181612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  : UseRegisterAtStart(instr->length());
181712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = new(zone()) LBoundsCheck(index, length);
181812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!FLAG_debug_code || !instr->skip_check()) {
181912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
182012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
182112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgreturn result;
182212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
182312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
182412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
182512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation(
182612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HBoundsCheckBaseIndexInformation* instr) {
182712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  UNREACHABLE();
182812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
182912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
183012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
183112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
183212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
183312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // The control instruction marking the end of a block that completed
183412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // abruptly (e.g., threw an exception).  There is nothing specific to do.
183512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
183612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
183712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
183812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
183912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
184012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
184112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
184212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
184312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
184412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
184512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // All HForceRepresentation instructions should be eliminated in the
184612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // representation change phase of Hydrogen.
184712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  UNREACHABLE();
184812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
184912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
185012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
185112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
185212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoChange(HChange* instr) {
185312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation from = instr->from();
185412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation to = instr->to();
185512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HValue* val = instr->value();
185612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (from.IsSmi()) {
185712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (to.IsTagged()) {
185812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
185912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return DefineSameAsFirst(new(zone()) LDummyUse(value));
186012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
186112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    from = Representation::Tagged();
186212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
186312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (from.IsTagged()) {
186412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (to.IsDouble()) {
186512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
186612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LNumberUntagD(value));
186712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (!val->representation().IsSmi()) result = AssignEnvironment(result);
186812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return result;
186912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else if (to.IsSmi()) {
187012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
187112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (val->type().IsSmi()) {
187212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DefineSameAsFirst(new(zone()) LDummyUse(value));
187312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
187412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
187512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
1876e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
187712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (val->type().IsSmi() || val->representation().IsSmi()) {
187812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
187912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiUntag(value, false));
188012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
188112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* value = UseRegister(val);
188212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* temp1 = TempRegister();
188312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* temp2 = TempDoubleRegister();
188412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LInstruction* result =
188512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org            DefineSameAsFirst(new(zone()) LTaggedToI(value, temp1, temp2));
188612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        if (!val->representation().IsSmi()) result = AssignEnvironment(result);
188712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return result;
188812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
188912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
189012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (from.IsDouble()) {
189112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (to.IsTagged()) {
189212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      info()->MarkAsDeferredCalling();
189312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
189412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* temp1 = TempRegister();
189512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* temp2 = TempRegister();
189612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
189712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LUnallocated* result_temp = TempRegister();
189812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2);
189912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return AssignPointerMap(Define(result, result_temp));
190012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else if (to.IsSmi()) {
190112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
190212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return AssignEnvironment(
190312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          DefineAsRegister(new(zone()) LDoubleToSmi(value)));
190412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
1905e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsInteger32());
190612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
190712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value));
190812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result);
190912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return result;
191012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
191112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (from.IsInteger32()) {
191212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    info()->MarkAsDeferredCalling();
191312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (to.IsTagged()) {
191412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
191512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
191612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* temp1 = TempRegister();
191712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* temp2 = TempRegister();
191812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2);
191912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return AssignPointerMap(DefineAsRegister(result));
192012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
192112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        STATIC_ASSERT((kMinInt == Smi::kMinValue) &&
192212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                      (kMaxInt == Smi::kMaxValue));
192312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        LOperand* value = UseRegisterAtStart(val);
192412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DefineAsRegister(new(zone()) LSmiTag(value));
192512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
192612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else if (to.IsSmi()) {
192712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LOperand* value = UseRegister(val);
192812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value));
192912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (instr->CheckFlag(HValue::kCanOverflow)) {
193012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        result = AssignEnvironment(result);
193112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
193212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return result;
193312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
1934e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(to.IsDouble());
193512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (val->CheckFlag(HInstruction::kUint32)) {
193612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DefineAsRegister(new(zone()) LUint32ToDouble(UseRegister(val)));
193712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
193812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return DefineAsRegister(new(zone()) LInteger32ToDouble(Use(val)));
193912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
194012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
194112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
194212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  UNREACHABLE();
194312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
194412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
194512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
194612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
194712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
194812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
194912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = new(zone()) LCheckNonSmi(value);
195012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!instr->value()->type().IsHeapObject()) {
195112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
195212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
195312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
195412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
195512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
195612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
195712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
195812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
195912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(new(zone()) LCheckSmi(value));
196012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
196112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
196212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
196312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
196412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
196512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = new(zone()) LCheckInstanceType(value);
196612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(result);
196712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
196812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
196912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
197012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckValue(HCheckValue* instr) {
197112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
197212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(new(zone()) LCheckValue(value));
197312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
197412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
197512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
197612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
197712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->IsStabilityCheck()) return new(zone()) LCheckMaps;
197812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
197912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = AssignEnvironment(new(zone()) LCheckMaps(value));
198012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->HasMigrationTarget()) {
198112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    info()->MarkAsDeferredCalling();
198212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignPointerMap(result);
198312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
198412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
198512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
198612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
198712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
198812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
198912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HValue* value = instr->value();
199012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation input_rep = value->representation();
199112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* reg = UseRegister(value);
199212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (input_rep.IsDouble()) {
199312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // Revisit this decision, here and 8 lines below.
199412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LClampDToUint8(reg,
199512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        TempDoubleRegister()));
199612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (input_rep.IsInteger32()) {
199712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LClampIToUint8(reg));
199812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
1999e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(input_rep.IsSmiOrTagged());
200012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LClampTToUint8* result =
200112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        new(zone()) LClampTToUint8(reg, TempDoubleRegister());
200212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return AssignEnvironment(DefineAsRegister(result));
200312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
200412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
200512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
200612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
200712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoDoubleBits(HDoubleBits* instr) {
200812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HValue* value = instr->value();
2009e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(value->representation().IsDouble());
201012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LDoubleBits(UseRegister(value)));
201112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
201212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
201312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
201412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstructDouble(HConstructDouble* instr) {
201512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* lo = UseRegister(instr->lo());
201612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* hi = UseRegister(instr->hi());
201712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LConstructDouble(hi, lo));
201812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
201912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
202012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
202112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
202212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = info()->IsStub()
202312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? UseFixed(instr->context(), cp)
202412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : NULL;
202512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* parameter_count = UseRegisterOrConstant(instr->parameter_count());
202612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LReturn(UseFixed(instr->value(), v0), context,
202712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                             parameter_count);
202812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
202912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
203012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
203112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
203212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Representation r = instr->representation();
203312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (r.IsSmi()) {
203412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LConstantS);
203512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (r.IsInteger32()) {
203612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LConstantI);
203712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (r.IsDouble()) {
203812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LConstantD);
203912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (r.IsExternal()) {
204012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LConstantE);
204112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (r.IsTagged()) {
204212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsRegister(new(zone()) LConstantT);
204312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
204412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    UNREACHABLE();
204512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return NULL;
204612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
204712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
204812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
204912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
205012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
205112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell;
205212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr->RequiresHoleCheck()
205312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? AssignEnvironment(DefineAsRegister(result))
205412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : DefineAsRegister(result);
205512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
205612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
205712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
205812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
205912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2060fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* global_object =
20619aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister());
20629d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
20639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
20649aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
20659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
206612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LLoadGlobalGeneric* result =
20679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      new(zone()) LLoadGlobalGeneric(context, global_object, vector);
206812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
206912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
207012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
207112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
207212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
207312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegister(instr->value());
207412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Use a temp to check the value in the cell in the case where we perform
207512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // a hole check.
207612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return instr->RequiresHoleCheck()
207712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister()))
207812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      : new(zone()) LStoreGlobalCell(value, NULL);
207912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
208012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
208112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
208212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
208312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseRegisterAtStart(instr->value());
208412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result =
208512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      DefineAsRegister(new(zone()) LLoadContextSlot(context));
208612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
208712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
208812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
208912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
209012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
209112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
209212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
209312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
209412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context;
209512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value;
209612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->NeedsWriteBarrier()) {
209712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    context = UseTempRegister(instr->context());
209812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    value = UseTempRegister(instr->value());
209912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
210012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    context = UseRegister(instr->context());
210112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    value = UseRegister(instr->value());
210212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
210312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = new(zone()) LStoreContextSlot(context, value);
210412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->RequiresHoleCheck() && instr->DeoptimizesOnHole()) {
210512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
210612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
210712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
210812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
210912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
211012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
211112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
211212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* obj = UseRegisterAtStart(instr->object());
211312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LLoadNamedField(obj));
211412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
211512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
211612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
211712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
211812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2119fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
21209aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
21219d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
21229d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
21239aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
21249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
21259d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
212612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result =
21279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), v0);
212812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(result, instr);
212912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
213012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
213112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
213212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
213312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HLoadFunctionPrototype* instr) {
213412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(
213512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
213612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
213712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
213812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
213912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) {
214012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LLoadRoot);
214112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
214212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
214312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
214412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
2145e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsSmiOrInteger32());
214612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ElementsKind elements_kind = instr->elements_kind();
214712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
214812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = NULL;
214912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
215012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!instr->is_typed_elements()) {
215112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* obj = NULL;
215212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instr->representation().IsDouble()) {
215312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      obj = UseRegister(instr->elements());
215412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
2155e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->representation().IsSmiOrTagged() ||
215612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org             instr->representation().IsInteger32());
215712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      obj = UseRegisterAtStart(instr->elements());
215812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
215912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key));
216012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
2161e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(
216212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        (instr->representation().IsInteger32() &&
216312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org         !IsDoubleOrFloatElementsKind(elements_kind)) ||
216412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        (instr->representation().IsDouble() &&
216512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org         IsDoubleOrFloatElementsKind(elements_kind)));
216612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* backing_store = UseRegister(instr->elements());
216712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = DefineAsRegister(new(zone()) LLoadKeyed(backing_store, key));
216812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
216912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
217012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if ((instr->is_external() || instr->is_fixed_typed_array()) ?
217112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // see LCodeGen::DoLoadKeyedExternalArray
217212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      ((elements_kind == EXTERNAL_UINT32_ELEMENTS ||
217312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        elements_kind == UINT32_ELEMENTS) &&
217412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       !instr->CheckFlag(HInstruction::kUint32)) :
217512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // see LCodeGen::DoLoadKeyedFixedDoubleArray and
217612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      // LCodeGen::DoLoadKeyedFixedArray
217712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr->RequiresHoleCheck()) {
217812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    result = AssignEnvironment(result);
217912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
218012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return result;
218112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
218212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
218312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
218412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
218512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2186fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* object =
21879aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), LoadDescriptor::ReceiverRegister());
21889aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister());
21899d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* vector = NULL;
21909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  if (FLAG_vector_ics) {
21919aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    vector = FixedTemp(VectorLoadICDescriptor::VectorRegister());
21929d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
219312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
219412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result =
21959d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector),
21969d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                  v0);
219712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(result, instr);
219812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
219912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
220012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
220112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
220212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (!instr->is_typed_elements()) {
2203e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->elements()->representation().IsTagged());
220412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    bool needs_write_barrier = instr->NeedsWriteBarrier();
220512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* object = NULL;
220612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* val = NULL;
220712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* key = NULL;
220812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
220912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (instr->value()->representation().IsDouble()) {
221012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      object = UseRegisterAtStart(instr->elements());
221112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      key = UseRegisterOrConstantAtStart(instr->key());
221212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      val = UseRegister(instr->value());
221312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    } else {
2214e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(instr->value()->representation().IsSmiOrTagged() ||
221512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org             instr->value()->representation().IsInteger32());
221612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      if (needs_write_barrier) {
221712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        object = UseTempRegister(instr->elements());
221812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        val = UseTempRegister(instr->value());
221912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        key = UseTempRegister(instr->key());
222012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      } else {
222112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        object = UseRegisterAtStart(instr->elements());
222212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        val = UseRegisterAtStart(instr->value());
222312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        key = UseRegisterOrConstantAtStart(instr->key());
222412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      }
222512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
222612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
222712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return new(zone()) LStoreKeyed(object, key, val);
222812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
222912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
2230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(
223112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->value()->representation().IsInteger32() &&
223212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       !IsDoubleOrFloatElementsKind(instr->elements_kind())) ||
223312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      (instr->value()->representation().IsDouble() &&
223412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org       IsDoubleOrFloatElementsKind(instr->elements_kind())));
2235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((instr->is_fixed_typed_array() &&
223612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          instr->elements()->representation().IsTagged()) ||
223712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org         (instr->is_external() &&
223812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org          instr->elements()->representation().IsExternal()));
223912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* val = UseRegister(instr->value());
224012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
224112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* backing_store = UseRegister(instr->elements());
224212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LStoreKeyed(backing_store, key, val);
224312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
224412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
224512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
224612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
224712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2248fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* obj =
22499aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
22509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister());
22519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
225212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
2253e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->object()->representation().IsTagged());
2254e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->key()->representation().IsTagged());
2255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr->value()->representation().IsTagged());
225612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
225712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(
225812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LStoreKeyedGeneric(context, obj, key, val), instr);
225912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
226012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
226112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
226212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTransitionElementsKind(
226312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HTransitionElementsKind* instr) {
226412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (IsSimpleMapChangeTransition(instr->from_kind(), instr->to_kind())) {
226512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* object = UseRegister(instr->object());
226612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* new_map_reg = TempRegister();
226712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTransitionElementsKind* result =
226812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        new(zone()) LTransitionElementsKind(object, NULL, new_map_reg);
226912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return result;
227012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
227112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* object = UseFixed(instr->object(), a0);
227212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
227312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LTransitionElementsKind* result =
227412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        new(zone()) LTransitionElementsKind(object, context, NULL);
227512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return MarkAsCall(result, instr);
227612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
227712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
227812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
227912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
228012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTrapAllocationMemento(
228112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HTrapAllocationMemento* instr) {
228212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* object = UseRegister(instr->object());
228312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = TempRegister();
228412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LTrapAllocationMemento* result =
228512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LTrapAllocationMemento(object, temp);
228612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(result);
228712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
228812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
228912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
229012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
229112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool is_in_object = instr->access().IsInobject();
229212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool needs_write_barrier = instr->NeedsWriteBarrier();
229312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool needs_write_barrier_for_map = instr->has_transition() &&
229412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr->NeedsWriteBarrierForMap();
229512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
229612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* obj;
229712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (needs_write_barrier) {
229812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    obj = is_in_object
229912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        ? UseRegister(instr->object())
230012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        : UseTempRegister(instr->object());
230112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
230212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    obj = needs_write_barrier_for_map
230312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        ? UseRegister(instr->object())
230412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        : UseRegisterAtStart(instr->object());
230512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
230612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
230712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* val;
2308d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  if (needs_write_barrier) {
230912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    val = UseTempRegister(instr->value());
231012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else if (instr->field_representation().IsDouble()) {
231112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    val = UseRegisterAtStart(instr->value());
231212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
231312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    val = UseRegister(instr->value());
231412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
231512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
231612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // We need a temporary register for write barrier of the map field.
231712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp = needs_write_barrier_for_map ? TempRegister() : NULL;
231812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
231912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LStoreNamedField(obj, val, temp);
232012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
232112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
232212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
232312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
232412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
2325fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  LOperand* obj =
23269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      UseFixed(instr->object(), StoreDescriptor::ReceiverRegister());
23279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LOperand* val = UseFixed(instr->value(), StoreDescriptor::ValueRegister());
232812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
232912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = new(zone()) LStoreNamedGeneric(context, obj, val);
233012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(result, instr);
233112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
233212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
233312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
233412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
233512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
233612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* left = UseFixed(instr->left(), a1);
233712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* right = UseFixed(instr->right(), a0);
233812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(
233912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      DefineFixed(new(zone()) LStringAdd(context, left, right), v0),
234012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      instr);
234112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
234212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
234312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
234412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
234512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* string = UseTempRegister(instr->string());
234612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* index = UseTempRegister(instr->index());
234712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseAny(instr->context());
234812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LStringCharCodeAt* result =
234912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LStringCharCodeAt(context, string, index);
235012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
235112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
235212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
235312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
235412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
235512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* char_code = UseRegister(instr->value());
235612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseAny(instr->context());
235712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LStringCharFromCode* result =
235812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LStringCharFromCode(context, char_code);
235912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
236012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
236112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
236212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
236312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
236412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  info()->MarkAsDeferredCalling();
236512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseAny(instr->context());
236612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* size = UseRegisterOrConstant(instr->size());
236712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp1 = TempRegister();
236812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* temp2 = TempRegister();
236912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2);
237012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignPointerMap(DefineAsRegister(result));
237112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
237212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
237312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
237412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
237512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
237612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(
237712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      DefineFixed(new(zone()) LRegExpLiteral(context), v0), instr);
237812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
237912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
238012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
238112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
238212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
238312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(
238412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      DefineFixed(new(zone()) LFunctionLiteral(context), v0), instr);
238512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
238612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
238712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
238812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
2389e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(argument_count_ == 0);
239012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  allocator_->MarkAsOsrEntry();
239112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_block_->last_environment()->set_ast_id(instr->ast_id());
239212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(new(zone()) LOsrEntry);
239312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
239412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
239512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
239612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
239712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LParameter* result = new(zone()) LParameter;
239812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->kind() == HParameter::STACK_PARAMETER) {
239912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int spill_index = chunk()->GetParameterStackSlot(instr->index());
240012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineAsSpilled(result, spill_index);
240112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
2402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(info()->IsStub());
2403e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    CallInterfaceDescriptor descriptor =
2404e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org        info()->code_stub()->GetCallInterfaceDescriptor();
240512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int index = static_cast<int>(instr->index());
240642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org    Register reg = descriptor.GetEnvironmentParameterRegister(index);
240712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return DefineFixed(result, reg);
240812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
240912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
241012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
241112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
241212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
241312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Use an index that corresponds to the location in the unoptimized frame,
241412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // which the optimized frame will subsume.
241512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int env_index = instr->index();
241612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  int spill_index = 0;
241712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->environment()->is_parameter_index(env_index)) {
241812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    spill_index = chunk()->GetParameterStackSlot(env_index);
241912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
242012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    spill_index = env_index - instr->environment()->first_local_index();
242112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
2422b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      Retry(kTooManySpillSlotsNeededForOSR);
242312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      spill_index = 0;
242412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
242512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
242612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
242712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
242812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
242912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
243012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
243112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
243212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(new(zone()) LCallStub(context), v0), instr);
243312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
243412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
243512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
243612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
243712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // There are no real uses of the arguments object.
243812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // arguments.length and element access are supported directly on
243912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // stack arguments, and any real arguments object use causes a bailout.
244012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // So this value is never used.
244112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
244212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
244312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
244412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
244512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
244612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
244712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
244812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // There are no real uses of a captured object.
244912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
245012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
245112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
245212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
245312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
245412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  info()->MarkAsRequiresFrame();
245512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* args = UseRegister(instr->arguments());
245612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* length = UseRegisterOrConstantAtStart(instr->length());
245712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* index = UseRegisterOrConstantAtStart(instr->index());
245812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
245912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
246012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
246112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
246212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
246312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* object = UseFixed(instr->value(), a0);
246412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LToFastProperties* result = new(zone()) LToFastProperties(object);
246512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
246612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
246712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
246812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
246912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
247012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
247112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0));
247212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr);
247312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
247412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
247512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
247612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
247712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
247812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
247912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
248012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
248112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
248212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HIsConstructCallAndBranch* instr) {
248312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LIsConstructCallAndBranch(TempRegister());
248412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
248512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
248612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
248712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
248812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  instr->ReplayEnvironment(current_block_->last_environment());
248912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
249012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
249112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
249212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
249312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
249412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->is_function_entry()) {
249512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* context = UseFixed(instr->context(), cp);
249612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return MarkAsCall(new(zone()) LStackCheck(context), instr);
249712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  } else {
2498e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->is_backwards_branch());
249912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    LOperand* context = UseAny(instr->context());
250012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return AssignEnvironment(
250112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        AssignPointerMap(new(zone()) LStackCheck(context)));
250212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
250312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
250412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
250512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
250612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
250712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HEnvironment* outer = current_block_->last_environment();
250812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  outer->set_ast_id(instr->ReturnId());
250912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HConstant* undefined = graph()->GetConstantUndefined();
251012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
251112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                               instr->arguments_count(),
251212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                               instr->function(),
251312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                               undefined,
251412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                                               instr->inlining_kind());
251512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Only replay binding of arguments object if it wasn't removed from graph.
251612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (instr->arguments_var() != NULL && instr->arguments_object()->IsLinked()) {
251712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    inner->Bind(instr->arguments_var(), instr->arguments_object());
251812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
2519ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  inner->BindContext(instr->closure_context());
252012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inner->set_entry(instr);
252112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_block_->UpdateEnvironment(inner);
252212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  chunk_->AddInlinedClosure(instr->closure());
252312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return NULL;
252412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
252512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
252612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
252712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
252812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* pop = NULL;
252912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
253012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HEnvironment* env = current_block_->last_environment();
253112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
253212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  if (env->entry()->arguments_pushed()) {
253312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int argument_count = env->arguments_environment()->parameter_count();
253412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    pop = new(zone()) LDrop(argument_count);
2535e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->argument_delta() == -argument_count);
253612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
253712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
253812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  HEnvironment* outer = current_block_->last_environment()->
253912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      DiscardInlined(false);
254012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  current_block_->UpdateEnvironment(outer);
254112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
254212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return pop;
254312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
254412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
254512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
254612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
254712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
254812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* object = UseFixed(instr->enumerable(), a0);
254912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LForInPrepareMap* result = new(zone()) LForInPrepareMap(context, object);
255012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
255112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
255212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
255312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
255412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
255512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* map = UseRegister(instr->map());
255612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(DefineAsRegister(new(zone()) LForInCacheArray(map)));
255712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
255812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
255912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
256012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
256112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* value = UseRegisterAtStart(instr->value());
256212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* map = UseRegisterAtStart(instr->map());
256312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
256412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
256512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
256612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
256712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
256812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* object = UseRegister(instr->object());
256912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* index = UseTempRegister(instr->index());
257012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index);
257112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LInstruction* result = DefineSameAsFirst(load);
257212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return AssignPointerMap(result);
257312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
257412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
257512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
257612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) {
257712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseRegisterAtStart(instr->context());
257812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return new(zone()) LStoreFrameContext(context);
257912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
258012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
258112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
258212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgLInstruction* LChunkBuilder::DoAllocateBlockContext(
258312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    HAllocateBlockContext* instr) {
258412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* context = UseFixed(instr->context(), cp);
258512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LOperand* function = UseRegisterAtStart(instr->function());
258612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LAllocateBlockContext* result =
258712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      new(zone()) LAllocateBlockContext(context, function);
258812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return MarkAsCall(DefineFixed(result, cp), instr);
258912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
259012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
259112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
259212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} }  // namespace v8::internal
25937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
25947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_TARGET_ARCH_MIPS64
2595