13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
23ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Redistribution and use in source and binary forms, with or without
33ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// modification, are permitted provided that the following conditions are
43ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// met:
53ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
63ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions of source code must retain the above copyright
73ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       notice, this list of conditions and the following disclaimer.
83ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Redistributions in binary form must reproduce the above
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       copyright notice, this list of conditions and the following
103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       disclaimer in the documentation and/or other materials provided
113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       with the distribution.
123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//     * Neither the name of Google Inc. nor the names of its
133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       contributors may be used to endorse or promote products derived
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//       from this software without specific prior written permission.
153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "v8.h"
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "lithium-allocator-inl.h"
313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "mips/lithium-mips.h"
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "mips/lithium-codegen-mips.h"
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace v8 {
353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnamespace internal {
363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_COMPILE(type)                            \
383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void L##type::CompileToNative(LCodeGen* generator) {  \
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    generator->Do##type(this);                          \
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_COMPILE
433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOsrEntry::LOsrEntry() {
453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < Register::kNumAllocatableRegisters; ++i) {
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    register_spills_[i] = NULL;
473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; ++i) {
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    double_register_spills_[i] = NULL;
503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LOsrEntry::MarkSpilledRegister(int allocation_index,
553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    LOperand* spill_operand) {
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(spill_operand->IsStackSlot());
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(register_spills_[allocation_index] == NULL);
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  register_spills_[allocation_index] = spill_operand;
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::VerifyCall() {
643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Call instructions can use only fixed registers as temporaries and
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // outputs because all registers are blocked by the calling convention.
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Inputs operands must use a fixed register or use-at-start policy or
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a non-register policy.
683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(Output() == NULL ||
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         LUnallocated::cast(Output())->HasFixedPolicy() ||
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         !LUnallocated::cast(Output())->HasRegisterPolicy());
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (UseIterator it(this); !it.Done(); it.Advance()) {
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(operand->HasFixedPolicy() ||
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           operand->IsUsedAtStart());
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (TempIterator it(this); !it.Done(); it.Advance()) {
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnallocated* operand = LUnallocated::cast(it.Current());
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LOsrEntry::MarkSpilledDoubleRegister(int allocation_index,
853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                          LOperand* spill_operand) {
863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(spill_operand->IsDoubleStackSlot());
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(double_register_spills_[allocation_index] == NULL);
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  double_register_spills_[allocation_index] = spill_operand;
893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInstruction::PrintTo(StringStream* stream) {
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("%s ", this->Mnemonic());
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PrintOutputOperandTo(stream);
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PrintDataTo(stream);
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (HasEnvironment()) {
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" ");
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    environment()->PrintTo(stream);
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (HasPointerMap()) {
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" ");
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    pointer_map()->PrintTo(stream);
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int R, int I, int T>
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) {
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("= ");
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < inputs_.length(); i++) {
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (i > 0) stream->Add(" ");
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[i]->PrintTo(stream);
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int R, int I, int T>
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) {
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < results_.length(); i++) {
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (i > 0) stream->Add(" ");
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    results_[i]->PrintTo(stream);
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLabel::PrintDataTo(StringStream* stream) {
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LGap::PrintDataTo(stream);
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLabel* rep = replacement();
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (rep != NULL) {
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" Dead block replaced with B%d", rep->block_id());
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LGap::IsRedundant() const {
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < 4; i++) {
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (parallel_moves_[i] != NULL && !parallel_moves_[i]->IsRedundant()) {
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return false;
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return true;
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGap::PrintDataTo(StringStream* stream) {
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < 4; i++) {
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add("(");
1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (parallel_moves_[i] != NULL) {
1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      parallel_moves_[i]->PrintDataTo(stream);
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(") ");
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticD::Mnemonic() const {
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (op()) {
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::ADD: return "add-d";
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SUB: return "sub-d";
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MUL: return "mul-d";
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::DIV: return "div-d";
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MOD: return "mod-d";
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    default:
1693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UNREACHABLE();
1703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return NULL;
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* LArithmeticT::Mnemonic() const {
1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (op()) {
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::ADD: return "add-t";
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SUB: return "sub-t";
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MUL: return "mul-t";
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::MOD: return "mod-t";
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::DIV: return "div-t";
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::BIT_AND: return "bit-and-t";
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::BIT_OR: return "bit-or-t";
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::BIT_XOR: return "bit-xor-t";
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SHL: return "sll-t";
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SAR: return "sra-t";
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case Token::SHR: return "srl-t";
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    default:
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UNREACHABLE();
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return NULL;
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LGoto::PrintDataTo(StringStream* stream) {
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("B%d", block_id());
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LBranch::PrintDataTo(StringStream* stream) {
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("B%d | B%d on ", true_block_id(), false_block_id());
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCmpIDAndBranch::PrintDataTo(StringStream* stream) {
2073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if ");
2083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %s ", Token::String(op()));
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(1)->PrintTo(stream);
2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsNilAndBranch::PrintDataTo(StringStream* stream) {
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if ");
2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(kind() == kStrictEquality ? " === " : " == ");
2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(nil() == kNullValue ? "null" : "undefined");
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" then B%d else B%d", true_block_id(), false_block_id());
2213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsObjectAndBranch::PrintDataTo(StringStream* stream) {
2253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_object(");
2263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsStringAndBranch::PrintDataTo(StringStream* stream) {
2323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_string(");
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsSmiAndBranch::PrintDataTo(StringStream* stream) {
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_smi(");
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) {
2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if is_undetectable(");
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStringCompareAndBranch::PrintDataTo(StringStream* stream) {
2533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if string_compare(");
2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(1)->PrintTo(stream);
2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if has_instance_type(");
2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) {
2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if has_cached_array_index(");
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(") then B%d else B%d", true_block_id(), false_block_id());
2713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if class_of_test(");
2763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(", \"%o\") then B%d else B%d",
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              *hydrogen()->class_name(),
2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              true_block_id(),
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              false_block_id());
2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("if typeof ");
2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" == \"%s\" then B%d else B%d",
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              *hydrogen()->type_literal()->ToCString(),
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              true_block_id(), false_block_id());
2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallConstantFunction::PrintDataTo(StringStream* stream) {
2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("#%d / ", arity());
2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LUnaryMathOperation::PrintDataTo(StringStream* stream) {
2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("/%s ", hydrogen()->OpName());
3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LLoadContextSlot::PrintDataTo(StringStream* stream) {
3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[%d]", slot_index());
3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreContextSlot::PrintDataTo(StringStream* stream) {
3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[%d] <- ", slot_index());
3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(1)->PrintTo(stream);
3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LInvokeFunction::PrintDataTo(StringStream* stream) {
3183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("= ");
3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
3203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" #%d / ", arity());
3213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallKeyed::PrintDataTo(StringStream* stream) {
3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[a2] #%d / ", arity());
3263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallNamed::PrintDataTo(StringStream* stream) {
3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SmartArrayPointer<char> name_string = name()->ToCString();
3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("%s #%d / ", *name_string, arity());
3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallGlobal::PrintDataTo(StringStream* stream) {
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SmartArrayPointer<char> name_string = name()->ToCString();
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("%s #%d / ", *name_string, arity());
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallKnownGlobal::PrintDataTo(StringStream* stream) {
3423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("#%d / ", arity());
3433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LCallNew::PrintDataTo(StringStream* stream) {
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("= ");
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InputAt(0)->PrintTo(stream);
3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" #%d / ", arity());
3503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  arguments()->PrintTo(stream);
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" length ");
3573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  length()->PrintTo(stream);
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" index ");
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  index()->PrintTo(stream);
3613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedField::PrintDataTo(StringStream* stream) {
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(".");
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" <- ");
3693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintTo(stream);
3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreNamedGeneric::PrintDataTo(StringStream* stream) {
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
3753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(".");
3763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" <- ");
3783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintTo(stream);
3793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[");
3853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  key()->PrintTo(stream);
3863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("] <- ");
3873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintTo(stream);
3883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  elements()->PrintTo(stream);
3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[");
3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  key()->PrintTo(stream);
3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("] <- ");
3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintTo(stream);
3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
4013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[");
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  key()->PrintTo(stream);
4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("] <- ");
4053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintTo(stream);
4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LTransitionElementsKind::PrintDataTo(StringStream* stream) {
4103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintTo(stream);
4113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLChunk::LChunk(CompilationInfo* info, HGraph* graph)
4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    : spill_slot_count_(0),
4173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      info_(info),
4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      graph_(graph),
4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      instructions_(32),
4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      pointer_maps_(8),
4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      inlined_closures_(1) {
4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::GetNextSpillIndex(bool is_double) {
4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Skip a slot if for a double-width slot.
4273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (is_double) spill_slot_count_++;
4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return spill_slot_count_++;
4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunk::GetNextSpillSlot(bool is_double)  {
4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int index = GetNextSpillIndex(is_double);
4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (is_double) {
4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return LDoubleStackSlot::Create(index);
4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return LStackSlot::Create(index);
4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunk::MarkEmptyBlocks() {
4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhase phase("L_Mark empty blocks", this);
4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < graph()->blocks()->length(); ++i) {
4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* block = graph()->blocks()->at(i);
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int first = block->first_instruction_index();
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int last = block->last_instruction_index();
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* first_instr = instructions()->at(first);
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* last_instr = instructions()->at(last);
4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LLabel* label = LLabel::cast(first_instr);
4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (last_instr->IsGoto()) {
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LGoto* goto_instr = LGoto::cast(last_instr);
4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (label->IsRedundant() &&
4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          !label->is_loop_header()) {
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        bool can_eliminate = true;
4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        for (int i = first + 1; i < last && can_eliminate; ++i) {
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          LInstruction* cur = instructions()->at(i);
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          if (cur->IsGap()) {
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            LGap* gap = LGap::cast(cur);
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            if (!gap->IsRedundant()) {
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              can_eliminate = false;
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            }
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          } else {
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            can_eliminate = false;
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          }
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (can_eliminate) {
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          label->set_replacement(GetLabel(goto_instr->block_id()));
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) {
4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstructionGap* gap = new(graph_->zone()) LInstructionGap(block);
4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int index = -1;
4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->IsControl()) {
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instructions_.Add(gap);
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    index = instructions_.length();
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instructions_.Add(instr);
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    index = instructions_.length();
4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instructions_.Add(instr);
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instructions_.Add(gap);
4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->HasPointerMap()) {
4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    pointer_maps_.Add(instr->pointer_map());
4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instr->pointer_map()->set_lithium_position(index);
4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLConstantOperand* LChunk::DefineConstantOperand(HConstant* constant) {
4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return LConstantOperand::Create(constant->id());
4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::GetParameterStackSlot(int index) const {
5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The receiver is at index 0, the first parameter at index 1, so we
5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // shift all parameter indexes down by the number of parameters, and
5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // make sure they end up negative so they are distinguishable from
5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // spill slots.
5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int result = index - info()->scope()->num_parameters() - 1;
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(result < 0);
5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return result;
5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// A parameter relative to ebp in the arguments stub.
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::ParameterAt(int index) {
5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(-1 <= index);  // -1 is the receiver.
5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (1 + info()->scope()->num_parameters() - index) *
5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      kPointerSize;
5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLGap* LChunk::GetGapAt(int index) const {
5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return LGap::cast(instructions_[index]);
5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool LChunk::IsGapAt(int index) const {
5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instructions_[index]->IsGap();
5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint LChunk::NearestGapPos(int index) const {
5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (!IsGapAt(index)) index--;
5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return index;
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunk::AddGapMove(int index, LOperand* from, LOperand* to) {
5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GetGapAt(index)->GetOrCreateParallelMove(LGap::START)->AddMove(from, to);
5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> LChunk::LookupLiteral(LConstantOperand* operand) const {
5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HConstant::cast(graph_->LookupValue(operand->index()))->handle();
5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRepresentation LChunk::LookupLiteralRepresentation(
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LConstantOperand* operand) const {
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return graph_->LookupValue(operand->index())->representation();
5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLChunk* LChunkBuilder::Build() {
5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(is_unused());
5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  chunk_ = new(zone()) LChunk(info(), graph());
5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhase phase("L_Building chunk", chunk_);
5563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  status_ = BUILDING;
5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < blocks->length(); i++) {
5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* next = NULL;
5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (i < blocks->length() - 1) next = blocks->at(i + 1);
5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    DoBasicBlock(blocks->at(i), next);
5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (is_aborted()) return NULL;
5633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  status_ = DONE;
5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return chunk_;
5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::Abort(const char* format, ...) {
5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (FLAG_trace_bailout) {
5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SmartArrayPointer<char> name(
5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        info()->shared_info()->DebugName()->ToCString());
5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    PrintF("Aborting LChunk building in @\"%s\": ", *name);
5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    va_list arguments;
5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    va_start(arguments, format);
5763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    OS::VPrint(format, arguments);
5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    va_end(arguments);
5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    PrintF("\n");
5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  status_ = ABORTED;
5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(Register reg) {
5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LUnallocated(LUnallocated::FIXED_REGISTER,
5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  Register::ToAllocationIndex(reg));
5873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::ToUnallocated(DoubleRegister reg) {
5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LUnallocated(LUnallocated::FIXED_DOUBLE_REGISTER,
5923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  DoubleRegister::ToAllocationIndex(reg));
5933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixed(HValue* value, Register fixed_register) {
5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, ToUnallocated(fixed_register));
5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseFixedDouble(HValue* value, DoubleRegister reg) {
6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, ToUnallocated(reg));
6033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegister(HValue* value) {
6073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
6083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterAtStart(HValue* value) {
6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value,
6133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER,
6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                      LUnallocated::USED_AT_START));
6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseTempRegister(HValue* value) {
6193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::WRITABLE_REGISTER));
6203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value) {
6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE));
6253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAtStart(HValue* value) {
6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Use(value, new(zone()) LUnallocated(LUnallocated::NONE,
6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                     LUnallocated::USED_AT_START));
6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstant(HValue* value) {
6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
6363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
6373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : Use(value);
6383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseOrConstantAtStart(HValue* value) {
6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
6433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
6443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseAtStart(value);
6453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstant(HValue* value) {
6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
6513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegister(value);
6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegisterAtStart(value);
6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::UseAny(HValue* value) {
6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return value->IsConstant()
6643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? chunk_->DefineConstantOperand(HConstant::cast(value))
6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      :  Use(value, new(zone()) LUnallocated(LUnallocated::ANY));
6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::Use(HValue* value, LUnallocated* operand) {
6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value->EmitAtUses()) {
6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HInstruction* instr = HInstruction::cast(value);
6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    VisitInstruction(instr);
6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(value->id());
6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::Define(LTemplateInstruction<1, I, T>* instr,
6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    LUnallocated* result) {
6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  result->set_virtual_register(current_instruction_->id());
6833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->set_result(result);
6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsRegister(
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTemplateInstruction<1, I, T>* instr) {
6913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
6923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER));
6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
6973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineAsSpilled(
6983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTemplateInstruction<1, I, T>* instr, int index) {
6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
7003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::FIXED_SLOT, index));
7013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
7053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineSameAsFirst(
7063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTemplateInstruction<1, I, T>* instr) {
7073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr,
7083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                new(zone()) LUnallocated(LUnallocated::SAME_AS_FIRST_INPUT));
7093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixed(
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTemplateInstruction<1, I, T>* instr, Register reg) {
7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr, ToUnallocated(reg));
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DefineFixedDouble(
7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTemplateInstruction<1, I, T>* instr, DoubleRegister reg) {
7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Define(instr, ToUnallocated(reg));
7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* hydrogen_env = current_block_->last_environment();
7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int argument_index_accumulator = 0;
7293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->set_environment(CreateEnvironment(hydrogen_env,
7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           &argument_index_accumulator));
7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::SetInstructionPendingDeoptimizationEnvironment(
7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* instr, int ast_id) {
7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instruction_pending_deoptimization_environment_ == NULL);
7383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(pending_deoptimization_ast_id_ == AstNode::kNoNumber);
7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instruction_pending_deoptimization_environment_ = instr;
7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  pending_deoptimization_ast_id_ = ast_id;
7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::ClearInstructionPendingDeoptimizationEnvironment() {
7463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instruction_pending_deoptimization_environment_ = NULL;
7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  pending_deoptimization_ast_id_ = AstNode::kNoNumber;
7483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
7523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        HInstruction* hinstr,
7533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        CanDeoptimize can_deoptimize) {
7543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->VerifyCall();
7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
7573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->MarkAsCall();
7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr = AssignPointerMap(instr);
7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hinstr->HasObservableSideEffects()) {
7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(hinstr->next()->IsSimulate());
7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HSimulate* sim = HSimulate::cast(hinstr->next());
7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instr = SetInstructionPendingDeoptimizationEnvironment(
7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        instr, sim->ast_id());
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // If instruction does not have side-effects lazy deoptimization
7683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // after the call will try to deoptimize to the point before the call.
7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Thus we still need to attach environment to this call even if
7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // call sequence can not deoptimize eagerly.
7713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_environment =
7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (can_deoptimize == CAN_DEOPTIMIZE_EAGERLY) ||
7733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      !hinstr->HasObservableSideEffects();
7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (needs_environment && !instr->HasEnvironment()) {
7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instr = AssignEnvironment(instr);
7763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7823ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) {
7833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->MarkAsSaveDoubles();
7843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::AssignPointerMap(LInstruction* instr) {
7893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!instr->HasPointerMap());
7903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  instr->set_pointer_map(new(zone()) LPointerMap(position_));
7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr;
7923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLUnallocated* LChunkBuilder::TempRegister() {
7963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand =
7973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
7983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  operand->set_virtual_register(allocator_->GetVirtualRegister());
7993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!allocator_->AllocationOk()) Abort("Not enough virtual registers.");
8003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
8013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(Register reg) {
8053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand = ToUnallocated(reg);
8063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(operand->HasFixedPolicy());
8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
8083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) {
8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* operand = ToUnallocated(reg);
8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(operand->HasFixedPolicy());
8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return operand;
8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LLabel(instr->block());
8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSoftDeoptimize(HSoftDeoptimize* instr) {
8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
8293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LDeoptimize);
8303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShift(Token::Value op,
8343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                     HBitwiseBinaryOperation* instr) {
8353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsTagged()) {
8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsTagged());
8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsTagged());
8383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseFixed(instr->left(), a1);
8403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseFixed(instr->right(), a0);
8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LArithmeticT* result = new(zone()) LArithmeticT(op, left, right);
8423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixed(result, v0), instr);
8433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsInteger32());
8463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->left()->representation().IsInteger32());
8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->right()->representation().IsInteger32());
8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* right_value = instr->right();
8513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = NULL;
8523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int constant_value = 0;
8533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (right_value->IsConstant()) {
8543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* constant = HConstant::cast(right_value);
8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    right = chunk_->DefineConstantOperand(constant);
8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    constant_value = constant->Integer32Value() & 0x1f;
8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
8583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    right = UseRegisterAtStart(right_value);
8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Shift operations can only deoptimize if we do a logical shift
8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // by 0 and the result cannot be truncated to int32.
8633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool may_deopt = (op == Token::SHR && constant_value == 0);
8643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool does_deopt = false;
8653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (may_deopt) {
8663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (HUseIterator it(instr->uses()); !it.Done(); it.Advance()) {
8673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (!it.value()->CheckFlag(HValue::kTruncatingToInt32)) {
8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        does_deopt = true;
8693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        break;
8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
8723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineAsRegister(new(zone()) LShiftI(op, left, right, does_deopt));
8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return does_deopt ? AssignEnvironment(result) : result;
8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           HArithmeticBinaryOperation* instr) {
8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsDouble());
8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->left()->representation().IsDouble());
8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->right()->representation().IsDouble());
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(op != Token::MOD);
8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseRegisterAtStart(instr->right());
8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticD* result = new(zone()) LArithmeticD(op, left, right);
8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(result);
8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArithmeticT(Token::Value op,
8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           HArithmeticBinaryOperation* instr) {
8953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(op == Token::ADD ||
8963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         op == Token::DIV ||
8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         op == Token::MOD ||
8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         op == Token::MUL ||
8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         op == Token::SUB);
9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* left = instr->left();
9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* right = instr->right();
9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(left->representation().IsTagged());
9033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(right->representation().IsTagged());
9043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left_operand = UseFixed(left, a1);
9053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right_operand = UseFixed(right, a0);
9063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticT* result =
9073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LArithmeticT(op, left_operand, right_operand);
9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
9093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block) {
9133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(is_building());
9143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_ = block;
9153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  next_block_ = next_block;
9163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (block->IsStartBlock()) {
9173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->UpdateEnvironment(graph_->start_environment());
9183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    argument_count_ = 0;
9193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (block->predecessors()->length() == 1) {
9203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We have a single predecessor => copy environment and outgoing
9213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // argument count from the predecessor.
9223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(block->phis()->length() == 0);
9233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
9243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HEnvironment* last_environment = pred->last_environment();
9253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(last_environment != NULL);
9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Only copy the environment, if it is later used again.
9273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (pred->end()->SecondSuccessor() == NULL) {
9283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(pred->end()->FirstSuccessor() == block);
9293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
9303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (pred->end()->FirstSuccessor()->block_id() > block->block_id() ||
9313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          pred->end()->SecondSuccessor()->block_id() > block->block_id()) {
9323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        last_environment = last_environment->Copy();
9333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
9343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
9353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->UpdateEnvironment(last_environment);
9363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(pred->argument_count() >= 0);
9373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    argument_count_ = pred->argument_count();
9383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We are at a state join => process phis.
9403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* pred = block->predecessors()->at(0);
9413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // No need to copy the environment, it cannot be used later.
9423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HEnvironment* last_environment = pred->last_environment();
9433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (int i = 0; i < block->phis()->length(); ++i) {
9443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HPhi* phi = block->phis()->at(i);
9453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      last_environment->SetValueAt(phi->merged_index(), phi);
9463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
9473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (int i = 0; i < block->deleted_phis()->length(); ++i) {
9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      last_environment->SetValueAt(block->deleted_phis()->at(i),
9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   graph_->GetConstantUndefined());
9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
9513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->UpdateEnvironment(last_environment);
9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Pick up the outgoing argument count of one of the predecessors.
9533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    argument_count_ = pred->argument_count();
9543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HInstruction* current = block->first();
9563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int start = chunk_->instructions()->length();
9573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (current != NULL && !is_aborted()) {
9583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Code for constants in registers is generated lazily.
9593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!current->EmitAtUses()) {
9603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      VisitInstruction(current);
9613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
9623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    current = current->next();
9633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int end = chunk_->instructions()->length() - 1;
9653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (end >= start) {
9663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->set_first_instruction_index(start);
9673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    block->set_last_instruction_index(end);
9683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  block->set_argument_count(argument_count_);
9703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  next_block_ = NULL;
9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_ = NULL;
9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid LChunkBuilder::VisitInstruction(HInstruction* current) {
9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HInstruction* old_current = current_instruction_;
9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_instruction_ = current;
9783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (current->has_position()) position_ = current->position();
9793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* instr = current->CompileToLithium(this);
9803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr != NULL) {
9823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
9833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      instr = AssignPointerMap(instr);
9843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
9853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (FLAG_stress_environments && !instr->HasEnvironment()) {
9863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      instr = AssignEnvironment(instr);
9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instr->set_hydrogen_value(current);
9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    chunk_->AddInstruction(instr, current_block_);
9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_instruction_ = old_current;
9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLEnvironment* LChunkBuilder::CreateEnvironment(
9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HEnvironment* hydrogen_env,
9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int* argument_index_accumulator) {
9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hydrogen_env == NULL) return NULL;
9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* outer =
10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int ast_id = hydrogen_env->ast_id();
10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(ast_id != AstNode::kNoNumber ||
10043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         hydrogen_env->frame_type() != JS_FUNCTION);
10053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int value_count = hydrogen_env->length();
10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* result = new(zone()) LEnvironment(
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hydrogen_env->closure(),
10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hydrogen_env->frame_type(),
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ast_id,
10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hydrogen_env->parameter_count(),
10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      argument_count_,
10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      value_count,
10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      outer);
10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int argument_index = *argument_index_accumulator;
10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < value_count; ++i) {
10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (hydrogen_env->is_special_index(i)) continue;
10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HValue* value = hydrogen_env->values()->at(i);
10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* op = NULL;
10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (value->IsArgumentsObject()) {
10213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      op = NULL;
10223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else if (value->IsPushArgument()) {
10233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      op = new(zone()) LArgument(argument_index++);
10243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      op = UseAny(value);
10263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
10273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result->AddValue(op, value->representation());
10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hydrogen_env->frame_type() == JS_FUNCTION) {
10313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    *argument_index_accumulator = argument_index;
10323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return result;
10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
10393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LGoto(instr->FirstSuccessor()->block_id());
10403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
10443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value->EmitAtUses()) {
10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HBasicBlock* successor = HConstant::cast(value)->ToBoolean()
10473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        ? instr->FirstSuccessor()
10483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        : instr->SecondSuccessor();
10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone()) LGoto(successor->block_id());
10503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LBranch* result = new(zone()) LBranch(UseRegister(value));
10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Tagged values that are not known smis or booleans require a
10543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // deoptimization environment.
10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation rep = value->representation();
10563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HType type = value->type();
10573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) {
10583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(result);
10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return result;
10613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
10653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
10673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
10683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpMapAndBranch(value, temp);
10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
10733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(
10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LArgumentsLength(UseRegister(length->value())));
10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
10793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LArgumentsElements);
10803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
10843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstanceOf* result =
10853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LInstanceOf(UseFixed(instr->left(), a0),
10863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              UseFixed(instr->right(), a1));
10873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
10883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HInstanceOfKnownGlobal* instr) {
10933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstanceOfKnownGlobal* result =
10943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LInstanceOfKnownGlobal(UseFixed(instr->left(), a0),
10953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         FixedTemp(t0));
10963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
10973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
11013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseRegisterAtStart(instr->receiver());
11023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseRegisterAtStart(instr->function());
11033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
11043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineSameAsFirst(result));
11053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
11093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseFixed(instr->function(), a1);
11103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver = UseFixed(instr->receiver(), a0);
11113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length = UseFixed(instr->length(), a2);
11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* elements = UseFixed(instr->elements(), a3);
11133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LApplyArguments* result = new(zone()) LApplyArguments(function,
11143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        receiver,
11153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        length,
11163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        elements);
11173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
11183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ++argument_count_;
11233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* argument = Use(instr->argument());
11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LPushArgument(argument);
11253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
11293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses()
11303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? NULL
11313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : DefineAsRegister(new(zone()) LThisFunction);
11323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoContext(HContext* instr) {
11363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->HasNoUses() ? NULL : DefineAsRegister(new(zone()) LContext);
11373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) {
11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LOuterContext(context));
11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeclareGlobals(HDeclareGlobals* instr) {
11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(new(zone()) LDeclareGlobals, instr);
11483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) {
11523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
11533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGlobalObject(context));
11543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11573ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) {
11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* global_object = UseRegisterAtStart(instr->value());
11593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGlobalReceiver(global_object));
11603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallConstantFunction(
11643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HCallConstantFunction* instr) {
11653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, v0), instr);
11673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) {
11713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseFixed(instr->function(), a1);
11723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
11733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInvokeFunction* result = new(zone()) LInvokeFunction(function);
11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr, CANNOT_DEOPTIMIZE_EAGERLY);
11753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11783ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) {
11793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  BuiltinFunctionId op = instr->op();
11803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (op == kMathLog || op == kMathSin || op == kMathCos || op == kMathTan) {
11813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* input = UseFixedDouble(instr->value(), f4);
11823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input, NULL);
11833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixedDouble(result, f4), instr);
11843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (op == kMathPowHalf) {
11853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Input cannot be the same as the result.
11863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // See lithium-codegen-mips.cc::DoMathPowHalf.
11873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* input = UseFixedDouble(instr->value(), f8);
11883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* temp = FixedTemp(f6);
11893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input, temp);
11903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineFixedDouble(result, f4);
11913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* input = UseRegisterAtStart(instr->value());
11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL;
11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LUnaryMathOperation* result = new(zone()) LUnaryMathOperation(input, temp);
11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    switch (op) {
11963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case kMathAbs:
11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case kMathFloor:
11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
12003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case kMathSqrt:
12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return DefineAsRegister(result);
12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case kMathRound:
12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return AssignEnvironment(DefineAsRegister(result));
12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      default:
12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        UNREACHABLE();
12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return NULL;
12073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
12083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) {
12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsTagged());
12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseFixed(instr->key(), a2);
12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallKeyed(key), v0), instr);
12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) {
12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallNamed, v0), instr);
12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) {
12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, v0), instr);
12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) {
12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, v0), instr);
12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) {
12393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* constructor = UseFixed(instr->constructor(), a1);
12403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCallNew* result = new(zone()) LCallNew(constructor);
12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) {
12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function = UseFixed(instr->function(), a1);
12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallFunction(function), v0),
12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    instr);
12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) {
12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, v0), instr);
12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShr(HShr* instr) {
12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DoShift(Token::SHR, instr);
12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSar(HSar* instr) {
12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DoShift(Token::SAR, instr);
12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoShl(HShl* instr) {
12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DoShift(Token::SHL, instr);
12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsInteger32()) {
12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LBitI(left, right));
12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->representation().IsTagged());
12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsTagged());
12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsTagged());
12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseFixed(instr->left(), a1);
12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseFixed(instr->right(), a0);
12903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LArithmeticT* result = new(zone()) LArithmeticT(instr->op(), left, right);
12913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixed(result, v0), instr);
12923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsInteger32());
12983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsInteger32());
12993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LBitNotI(value));
13013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
13023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
13053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsDouble()) {
13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::DIV, instr);
13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsInteger32()) {
13083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(1042) The fixed register allocation
13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // is needed because we call TypeRecordingBinaryOpStub from
13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // the generated code, which requires registers a0
13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // and a1 to be used. We should remove that
13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // when we provide a native implementation.
13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* dividend = UseFixed(instr->left(), a0);
13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* divisor = UseFixed(instr->right(), a1);
13153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(AssignPointerMap(
13163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             DefineFixed(new(zone()) LDivI(dividend, divisor), v0)));
13173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
13183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::DIV, instr);
13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMod(HMod* instr) {
13243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsInteger32()) {
13253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
13263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
13273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LModI* mod;
13293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->HasPowerOf2Divisor()) {
13303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(!instr->CheckFlag(HValue::kCanBeDivByZero));
13313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = UseRegisterAtStart(instr->left());
13323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      mod = new(zone()) LModI(value, UseOrConstant(instr->right()));
13333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
13343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* dividend = UseRegister(instr->left());
13353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* divisor = UseRegister(instr->right());
13363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      mod = new(zone()) LModI(dividend,
13373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              divisor,
13383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              TempRegister(),
13393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              FixedTemp(f20),
13403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              FixedTemp(f22));
13413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        instr->CheckFlag(HValue::kCanBeDivByZero)) {
13453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return AssignEnvironment(DefineAsRegister(mod));
13463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return DefineAsRegister(mod);
13483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsTagged()) {
13503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::MOD, instr);
13513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->representation().IsDouble());
13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We call a C function for double modulo. It can't trigger a GC.
13543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We need to use fixed result register for the call.
13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(fschneider): Allow any register as input registers.
13563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseFixedDouble(instr->left(), f2);
13573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseFixedDouble(instr->right(), f4);
13583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LArithmeticD* result = new(zone()) LArithmeticD(Token::MOD, left, right);
13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixedDouble(result, f2), instr);
13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoMul(HMul* instr) {
13653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsInteger32()) {
13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left;
13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseOrConstant(instr->MostConstantOperand());
13703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* temp = NULL;
13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kBailoutOnMinusZero) &&
13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        (instr->CheckFlag(HValue::kCanOverflow) ||
13733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        !right->IsConstantOperand())) {
13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegister(instr->LeastConstantOperand());
13753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      temp = TempRegister();
13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
13773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      left = UseRegisterAtStart(instr->LeastConstantOperand());
13783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LMulI* mul = new(zone()) LMulI(left, right, temp);
13803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kCanOverflow) ||
13813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        instr->CheckFlag(HValue::kBailoutOnMinusZero)) {
13823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AssignEnvironment(mul);
13833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(mul);
13853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsDouble()) {
13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::MUL, instr);
13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
13903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::MUL, instr);
13913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
13933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSub(HSub* instr) {
13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsInteger32()) {
13973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->right());
14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LSubI* sub = new(zone()) LSubI(left, right);
14023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* result = DefineAsRegister(sub);
14033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kCanOverflow)) {
14043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      result = AssignEnvironment(result);
14053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
14073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsDouble()) {
14083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::SUB, instr);
14093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
14103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::SUB, instr);
14113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->representation().IsInteger32()) {
14173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
14193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->LeastConstantOperand());
14203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseOrConstantAtStart(instr->MostConstantOperand());
14213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LAddI* add = new(zone()) LAddI(left, right);
14223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* result = DefineAsRegister(add);
14233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->CheckFlag(HValue::kCanOverflow)) {
14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      result = AssignEnvironment(result);
14253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
14263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
14273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (instr->representation().IsDouble()) {
14283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticD(Token::ADD, instr);
14293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
14303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->representation().IsTagged());
14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoArithmeticT(Token::ADD, instr);
14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoPower(HPower* instr) {
14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsDouble());
14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // We call a C function for double power. It can't trigger a GC.
14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // We need to use fixed result register for the call.
14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation exponent_type = instr->right()->representation();
14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->left()->representation().IsDouble());
14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixedDouble(instr->left(), f2);
14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = exponent_type.IsDouble() ?
14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UseFixedDouble(instr->right(), f4) :
14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UseFixed(instr->right(), a2);
14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LPower* result = new(zone()) LPower(left, right);
14473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, f0),
14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    instr,
14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    CAN_DEOPTIMIZE_EAGERLY);
14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRandom(HRandom* instr) {
14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsDouble());
14553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->global_object()->representation().IsTagged());
14563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* global_object = UseFixed(instr->global_object(), a0);
14573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LRandom* result = new(zone()) LRandom(global_object);
14583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixedDouble(result, f0), instr);
14593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
14633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->left()->representation().IsTagged());
14643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->right()->representation().IsTagged());
14653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), a1);
14663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), a0);
14673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCmpT* result = new(zone()) LCmpT(left, right);
14683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
14693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareIDAndBranch(
14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HCompareIDAndBranch* instr) {
14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation r = instr->GetInputRepresentation();
14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (r.IsInteger32()) {
14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsInteger32());
14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsInteger32());
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterOrConstantAtStart(instr->left());
14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseRegisterOrConstantAtStart(instr->right());
14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone()) LCmpIDAndBranch(left, right);
14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(r.IsDouble());
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->left()->representation().IsDouble());
14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->right()->representation().IsDouble());
14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* left = UseRegisterAtStart(instr->left());
14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* right = UseRegisterAtStart(instr->right());
14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone()) LCmpIDAndBranch(left, right);
14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HCompareObjectEqAndBranch* instr) {
14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseRegisterAtStart(instr->right());
14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpObjectEqAndBranch(left, right);
14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCompareConstantEqAndBranch(
15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HCompareConstantEqAndBranch* instr) {
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LCmpConstantEqAndBranch(
15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UseRegisterAtStart(instr->value()));
15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsNilAndBranch(HIsNilAndBranch* instr) {
15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsNilAndBranch(UseRegisterAtStart(instr->value()));
15103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
15143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
15163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()),
15173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        temp);
15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsStringAndBranch(HIsStringAndBranch* instr) {
15223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp = TempRegister();
15243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsStringAndBranch(UseRegisterAtStart(instr->value()),
15253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                        temp);
15263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
15303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsSmiAndBranch(Use(instr->value()));
15323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
15363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HIsUndetectableAndBranch* instr) {
15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsUndetectableAndBranch(
15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UseRegisterAtStart(instr->value()), TempRegister());
15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCompareAndBranch(
15443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStringCompareAndBranch* instr) {
15453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->left()->representation().IsTagged());
15463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->right()->representation().IsTagged());
15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseFixed(instr->left(), a1);
15483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseFixed(instr->right(), a0);
15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCompareAndBranch* result =
15503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LStringCompareAndBranch(left, right);
15513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
15523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HHasInstanceTypeAndBranch* instr) {
15573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
15593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasInstanceTypeAndBranch(value);
15603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoGetCachedArrayIndex(
15643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HGetCachedArrayIndex* instr)  {
15653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
15673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LGetCachedArrayIndex(value));
15693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HHasCachedArrayIndexAndBranch* instr) {
15743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LHasCachedArrayIndexAndBranch(
15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      UseRegisterAtStart(instr->value()));
15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClassOfTestAndBranch(
15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HClassOfTestAndBranch* instr) {
15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LClassOfTestAndBranch(UseRegister(instr->value()),
15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           TempRegister());
15853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) {
15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* array = UseRegisterAtStart(instr->value());
15903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LJSArrayLength(array));
15913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFixedArrayBaseLength(
15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HFixedArrayBaseLength* instr) {
15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* array = UseRegisterAtStart(instr->value());
15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array));
15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoElementsKind(HElementsKind* instr) {
16023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegisterAtStart(instr->value());
16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LElementsKind(object));
16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) {
16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegister(instr->value());
16093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LValueOf* result = new(zone()) LValueOf(object, TempRegister());
16103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(result);
16113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDateField(HDateField* instr) {
16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->value(), a0);
16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LDateField* result = new LDateField(object, FixedTemp(a1), instr->index());
16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
16183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->index());
16233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length = UseRegister(instr->length());
16243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LBoundsCheck(value, length));
16253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAbnormalExit(HAbnormalExit* instr) {
16293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The control instruction marking the end of a block that completed
16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // abruptly (e.g., threw an exception).  There is nothing specific to do.
16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
16323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
16363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseFixed(instr->value(), a0);
16373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(new(zone()) LThrow(value), instr);
16383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // All HForceRepresentation instructions should be eliminated in the
16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // representation change phase of Hydrogen.
16493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  UNREACHABLE();
16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16543ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoChange(HChange* instr) {
16553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation from = instr->from();
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation to = instr->to();
16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (from.IsTagged()) {
16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to.IsDouble()) {
16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = UseRegister(instr->value());
16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberUntagD* res = new(zone()) LNumberUntagD(value);
16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return AssignEnvironment(DefineAsRegister(res));
16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
16633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(to.IsInteger32());
16643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = UseRegisterAtStart(instr->value());
16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      bool needs_check = !instr->value()->type().IsSmi();
16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LInstruction* res = NULL;
16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (!needs_check) {
16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        res = DefineAsRegister(new(zone()) LSmiUntag(value, needs_check));
16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LOperand* temp1 = TempRegister();
16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LOperand* temp2 = instr->CanTruncateToInt32() ? TempRegister()
16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                      : NULL;
16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LOperand* temp3 = instr->CanTruncateToInt32() ? FixedTemp(f22)
16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                      : NULL;
16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        res = DefineSameAsFirst(new(zone()) LTaggedToI(value,
16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                       temp1,
16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                       temp2,
16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                       temp3));
16793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        res = AssignEnvironment(res);
16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return res;
16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (from.IsDouble()) {
16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to.IsTagged()) {
16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = UseRegister(instr->value());
16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* temp1 = TempRegister();
16873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* temp2 = TempRegister();
16883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // Make sure that the temp and result_temp registers are
16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // different.
16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LUnallocated* result_temp = TempRegister();
16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2);
16933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      Define(result, result_temp);
16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return AssignPointerMap(result);
16953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
16963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(to.IsInteger32());
16973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = UseRegister(instr->value());
16983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* temp1 = TempRegister();
16993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* temp2 = instr->CanTruncateToInt32() ? TempRegister() : NULL;
17003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LDoubleToI* res = new(zone()) LDoubleToI(value, temp1, temp2);
17013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return AssignEnvironment(DefineAsRegister(res));
17023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
17033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (from.IsInteger32()) {
17043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to.IsTagged()) {
17053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HValue* val = instr->value();
17063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = UseRegisterAtStart(val);
17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (val->HasRange() && val->range()->IsInSmiRange()) {
17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return DefineAsRegister(new(zone()) LSmiTag(value));
17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
17103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        LNumberTagI* result = new(zone()) LNumberTagI(value);
17113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(to.IsDouble());
17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LOperand* value = Use(instr->value());
17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return DefineAsRegister(new(zone()) LInteger32ToDouble(value));
17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
17183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  UNREACHABLE();
17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) {
17253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckNonSmi(value));
17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
17313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LCheckInstanceType(value);
17333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(result);
17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp1 = TempRegister();
17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp2 = TempRegister();
17403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LCheckPrototypeMaps(temp1, temp2);
17413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(result);
17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckSmi(value));
17483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckFunction(value));
17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMap(HCheckMap* instr) {
17583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LCheckMap(value);
17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(result);
17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value = instr->value();
17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation input_rep = value->representation();
17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* reg = UseRegister(value);
17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (input_rep.IsDouble()) {
17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Revisit this decision, here and 8 lines below.
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LClampDToUint8(reg, FixedTemp(f22)));
17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (input_rep.IsInteger32()) {
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LClampIToUint8(reg));
17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(input_rep.IsTagged());
17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Register allocator doesn't (yet) support allocation of double
17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // temps. Reserve f22 explicitly.
17773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LClampTToUint8* result = new(zone()) LClampTToUint8(reg, FixedTemp(f22));
17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(DefineAsRegister(result));
17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LReturn(UseFixed(instr->value(), v0));
17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
17893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation r = instr->representation();
17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (r.IsInteger32()) {
17913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantI);
17923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (r.IsDouble()) {
17933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantD);
17943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (r.IsTagged()) {
17953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineAsRegister(new(zone()) LConstantT);
17963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    UNREACHABLE();
17983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return NULL;
17993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
18043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadGlobalCell* result = new(zone()) LLoadGlobalCell;
18053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck()
18063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? AssignEnvironment(DefineAsRegister(result))
18073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : DefineAsRegister(result);
18083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
18123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* global_object = UseFixed(instr->global_object(), a0);
18133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadGlobalGeneric* result = new(zone()) LLoadGlobalGeneric(global_object);
18143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
18153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreGlobalCell(HStoreGlobalCell* instr) {
18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegister(instr->value());
18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Use a temp to check the value in the cell in the case where we perform
18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a hole check.
18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck()
18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? AssignEnvironment(new(zone()) LStoreGlobalCell(value, TempRegister()))
18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : new(zone()) LStoreGlobalCell(value, NULL);
18253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreGlobalGeneric(HStoreGlobalGeneric* instr) {
18293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* global_object = UseFixed(instr->global_object(), a1);
18303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseFixed(instr->value(), a0);
18313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStoreGlobalGeneric* result =
18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LStoreGlobalGeneric(global_object, value);
18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* context = UseRegisterAtStart(instr->value());
18393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
18403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineAsRegister(new(zone()) LLoadContextSlot(context));
18413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
18423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
18463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* context;
18473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value;
18483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->NeedsWriteBarrier()) {
18493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    context = UseTempRegister(instr->context());
18503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    value = UseTempRegister(instr->value());
18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    context = UseRegister(instr->context());
18533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    value = UseRegister(instr->value());
18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LStoreContextSlot(context, value);
18563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instr->RequiresHoleCheck() ? AssignEnvironment(result) : result;
18573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
18613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(
18623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadNamedField(UseRegisterAtStart(instr->object())));
18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
18673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadNamedFieldPolymorphic* instr) {
18683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsTagged());
18693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->need_generic()) {
18703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* obj = UseFixed(instr->object(), a0);
18713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LLoadNamedFieldPolymorphic* result =
18723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LLoadNamedFieldPolymorphic(obj);
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixed(result, v0), instr);
18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* obj = UseRegisterAtStart(instr->object());
18763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LLoadNamedFieldPolymorphic* result =
18773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LLoadNamedFieldPolymorphic(obj);
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(DefineAsRegister(result));
18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->object(), a0);
18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = DefineFixed(new(zone()) LLoadNamedGeneric(object), v0);
18863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFunctionPrototype(
18913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadFunctionPrototype* instr) {
18923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(
18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadFunctionPrototype(UseRegister(instr->function()))));
18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) {
18983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
18993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadElements(input));
19003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
19043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadExternalArrayPointer* instr) {
19053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* input = UseRegisterAtStart(instr->value());
19063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadExternalArrayPointer(input));
19073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastElement(
19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadKeyedFastElement* instr) {
19123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsTagged());
19133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* obj = UseRegisterAtStart(instr->object());
19153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterAtStart(instr->key());
19163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadKeyedFastElement* result = new(zone()) LLoadKeyedFastElement(obj, key);
19173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->RequiresHoleCheck()) AssignEnvironment(result);
19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(result);
19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement(
19233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadKeyedFastDoubleElement* instr) {
19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->representation().IsDouble());
19253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* elements = UseTempRegister(instr->elements());
19273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
19283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadKeyedFastDoubleElement* result =
19293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadKeyedFastDoubleElement(elements, key);
19303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
19353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadKeyedSpecializedArrayElement* instr) {
19363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
19373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation representation(instr->representation());
19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(
19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (representation.IsInteger32() &&
19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (representation.IsDouble() &&
19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
19443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
19453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* external_pointer = UseRegister(instr->external_pointer());
19473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
19483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadKeyedSpecializedArrayElement* result =
19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LLoadKeyedSpecializedArrayElement(external_pointer, key);
19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* load_instr = DefineAsRegister(result);
19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // An unsigned int array load might overflow and cause a deopt, make sure it
19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // has an environment.
19533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) ?
19543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AssignEnvironment(load_instr) : load_instr;
19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) {
19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->object(), a1);
19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseFixed(instr->key(), a0);
19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result =
19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DefineFixed(new(zone()) LLoadKeyedGeneric(object, key), v0);
19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
19653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastElement(
19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStoreKeyedFastElement* instr) {
19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_write_barrier = instr->NeedsWriteBarrier();
19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->object()->representation().IsTagged());
19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* obj = UseTempRegister(instr->object());
19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* val = needs_write_barrier
19773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? UseTempRegister(instr->value())
19783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegisterAtStart(instr->value());
19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = needs_write_barrier
19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? UseTempRegister(instr->key())
19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegisterOrConstantAtStart(instr->key());
19823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreKeyedFastElement(obj, key, val);
19833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement(
19873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStoreKeyedFastDoubleElement* instr) {
19883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsDouble());
19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->elements()->representation().IsTagged());
19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* elements = UseRegisterAtStart(instr->elements());
19933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* val = UseTempRegister(instr->value());
19943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterOrConstantAtStart(instr->key());
19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreKeyedFastDoubleElement(elements, key, val);
19973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
20013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HStoreKeyedSpecializedArrayElement* instr) {
20023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation representation(instr->value()->representation());
20033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind elements_kind = instr->elements_kind();
20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(
20053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (representation.IsInteger32() &&
20063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       (elements_kind != EXTERNAL_FLOAT_ELEMENTS) &&
20073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       (elements_kind != EXTERNAL_DOUBLE_ELEMENTS)) ||
20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      (representation.IsDouble() &&
20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       ((elements_kind == EXTERNAL_FLOAT_ELEMENTS) ||
20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch       (elements_kind == EXTERNAL_DOUBLE_ELEMENTS))));
20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->external_pointer()->representation().IsExternal());
20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsInteger32());
20133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* external_pointer = UseRegister(instr->external_pointer());
20153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool val_is_temp_register =
20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      elements_kind == EXTERNAL_PIXEL_ELEMENTS ||
20173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      elements_kind == EXTERNAL_FLOAT_ELEMENTS;
20183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* val = val_is_temp_register
20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? UseTempRegister(instr->value())
20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegister(instr->value());
20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterOrConstant(instr->key());
20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreKeyedSpecializedArrayElement(external_pointer,
20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        key,
20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        val);
20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) {
20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* obj = UseFixed(instr->object(), a2);
20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseFixed(instr->key(), a1);
20323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* val = UseFixed(instr->value(), a0);
20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->object()->representation().IsTagged());
20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->key()->representation().IsTagged());
20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(instr->value()->representation().IsTagged());
20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(new(zone()) LStoreKeyedGeneric(obj, key, val), instr);
20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTransitionElementsKind(
20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HTransitionElementsKind* instr) {
20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->original_map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS &&
20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      instr->transitioned_map()->elements_kind() == FAST_ELEMENTS) {
20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseRegister(instr->object());
20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = TempRegister();
20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LTransitionElementsKind(object, new_map_reg, NULL);
20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DefineSameAsFirst(result);
20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* object = UseFixed(instr->object(), a0);
20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* fixed_object_reg = FixedTemp(a2);
20543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LOperand* new_map_reg = FixedTemp(a3);
20553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LTransitionElementsKind* result =
20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        new(zone()) LTransitionElementsKind(object,
20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                            new_map_reg,
20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                            fixed_object_reg);
20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(DefineFixed(result, v0), instr);
20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
20653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_write_barrier = instr->NeedsWriteBarrier();
20663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* obj = needs_write_barrier
20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? UseTempRegister(instr->object())
20693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegisterAtStart(instr->object());
20703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* val = needs_write_barrier
20723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? UseTempRegister(instr->value())
20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : UseRegister(instr->value());
20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LStoreNamedField(obj, val);
20763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) {
20803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* obj = UseFixed(instr->object(), a1);
20813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* val = UseFixed(instr->value(), a0);
20823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* result = new(zone()) LStoreNamedGeneric(obj, val);
20843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(result, instr);
20853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
20893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* left = UseRegisterAtStart(instr->left());
20903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* right = UseRegisterAtStart(instr->right());
20913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LStringAdd(left, right), v0),
20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    instr);
20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* string = UseTempRegister(instr->string());
20983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseTempRegister(instr->index());
20993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCharCodeAt* result = new(zone()) LStringCharCodeAt(string, index);
21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* char_code = UseRegister(instr->value());
21063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStringCharFromCode* result = new(zone()) LStringCharFromCode(char_code);
21073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* string = UseRegisterAtStart(instr->value());
21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LStringLength(string));
21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) {
21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAllocateObject* result = new(zone()) LAllocateObject(
21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      TempRegister(), TempRegister());
21203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignPointerMap(DefineAsRegister(result));
21213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFastLiteral(HFastLiteral* instr) {
21253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LFastLiteral, v0), instr);
21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArrayLiteral(HArrayLiteral* instr) {
21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LArrayLiteral, v0), instr);
21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoObjectLiteral(HObjectLiteral* instr) {
21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LObjectLiteral, v0), instr);
21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) {
21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, v0), instr);
21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoFunctionLiteral(HFunctionLiteral* instr) {
21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LFunctionLiteral, v0), instr);
21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
21503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->object(), a0);
21513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseFixed(instr->key(), a1);
21523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LDeleteProperty* result = new(zone()) LDeleteProperty(object, key);
21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21573ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  allocator_->MarkAsOsrEntry();
21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_->last_environment()->set_ast_id(instr->ast_id());
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LOsrEntry);
21613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
21653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int spill_index = chunk()->GetParameterStackSlot(instr->index());
21663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LParameter, spill_index);
21673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int spill_index = chunk()->GetNextSpillIndex(false);  // Not double-width.
21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (spill_index > LUnallocated::kMaxFixedIndex) {
21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Abort("Too many spill slots needed for OSR");
21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    spill_index = 0;
21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) {
21813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  argument_count_ -= instr->argument_count();
21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(new(zone()) LCallStub, v0), instr);
21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // There are no real uses of the arguments object.
21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // arguments.length and element access are supported directly on
21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // stack arguments, and any real arguments object use causes a bailout.
21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // So this value is never used.
21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
21923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
21963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* arguments = UseRegister(instr->arguments());
21973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length = UseTempRegister(instr->length());
21983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseRegister(instr->index());
21993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAccessArgumentsAt* result =
22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LAccessArgumentsAt(arguments, length, index);
22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(result));
22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
22063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->value(), a0);
22073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LToFastProperties* result = new(zone()) LToFastProperties(object);
22083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
22133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LTypeof* result = new(zone()) LTypeof(UseFixed(instr->value(), a0));
22143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
22153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value()));
22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HIsConstructCallAndBranch* instr) {
22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone()) LIsConstructCallAndBranch(TempRegister());
22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* env = current_block_->last_environment();
22313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(env != NULL);
22323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  env->set_ast_id(instr->ast_id());
22343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  env->Drop(instr->pop_count());
22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < instr->values()->length(); ++i) {
22373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HValue* value = instr->values()->at(i);
22383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (instr->HasAssignedIndexAt(i)) {
22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      env->Bind(instr->GetAssignedIndexAt(i), value);
22403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
22413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      env->Push(value);
22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
22433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // If there is an instruction pending deoptimization environment create a
22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // lazy bailout instruction to capture the environment.
22473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (pending_deoptimization_ast_id_ == instr->ast_id()) {
22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LInstruction* result = new(zone()) LLazyBailout;
22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result = AssignEnvironment(result);
22503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    instruction_pending_deoptimization_environment_->
22513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        set_deoptimization_environment(result->environment());
22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ClearInstructionPendingDeoptimizationEnvironment();
22533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
22543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
22573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->is_function_entry()) {
22623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return MarkAsCall(new(zone()) LStackCheck, instr);
22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(instr->is_backwards_branch());
22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return AssignEnvironment(AssignPointerMap(new(zone()) LStackCheck));
22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment();
22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HConstant* undefined = graph()->GetConstantUndefined();
22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->arguments_count(),
22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->function(),
22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               undefined,
22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->call_kind(),
22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                               instr->is_construct());
22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instr->arguments() != NULL) {
22803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inner->Bind(instr->arguments(), graph()->GetArgumentsObject());
22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_->UpdateEnvironment(inner);
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  chunk_->AddInlinedClosure(instr->closure());
22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
22853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) {
22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HEnvironment* outer = current_block_->last_environment()->
22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      DiscardInlined(false);
22913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  current_block_->UpdateEnvironment(outer);
22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return NULL;
22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoIn(HIn* instr) {
22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key = UseRegisterAtStart(instr->key());
22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegisterAtStart(instr->object());
22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LIn* result = new(zone()) LIn(key, object);
23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr);
23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInPrepareMap(HForInPrepareMap* instr) {
23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseFixed(instr->enumerable(), a0);
23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LForInPrepareMap* result = new(zone()) LForInPrepareMap(object);
23073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return MarkAsCall(DefineFixed(result, v0), instr, CAN_DEOPTIMIZE_EAGERLY);
23083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoForInCacheArray(HForInCacheArray* instr) {
23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegister(instr->map());
23133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(DefineAsRegister(
23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      new(zone()) LForInCacheArray(map)));
23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoCheckMapValue(HCheckMapValue* instr) {
23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value = UseRegisterAtStart(instr->value());
23203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map = UseRegisterAtStart(instr->map());
23213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AssignEnvironment(new(zone()) LCheckMapValue(value, map));
23223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) {
23263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object = UseRegister(instr->object());
23273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index = UseRegister(instr->index());
23283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return DefineAsRegister(new(zone()) LLoadFieldByIndex(object, index));
23293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} }  // namespace v8::internal
2333