1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
2a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Redistribution and use in source and binary forms, with or without
3a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// modification, are permitted provided that the following conditions are
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// met:
5a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Redistributions of source code must retain the above copyright
7a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       notice, this list of conditions and the following disclaimer.
8a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Redistributions in binary form must reproduce the above
9a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       copyright notice, this list of conditions and the following
10a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       disclaimer in the documentation and/or other materials provided
11a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       with the distribution.
12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//     * Neither the name of Google Inc. nor the names of its
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       contributors may be used to endorse or promote products derived
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//       from this software without specific prior written permission.
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org//
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
28a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifndef V8_ARM_LITHIUM_CODEGEN_ARM_H_
29a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define V8_ARM_LITHIUM_CODEGEN_ARM_H_
30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
31a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "arm/lithium-arm.h"
32b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org#include "arm/lithium-gap-resolver-arm.h"
34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "deoptimizer.h"
35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "safepoint-table.h"
36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "scopes.h"
37b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org#include "v8utils.h"
38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Forward declarations.
43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass LDeferredCode;
44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass SafepointGenerator;
45a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
46a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass LCodeGen BASE_EMBEDDED {
47a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
485a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info)
495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      : zone_(info->zone()),
5028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org        chunk_(static_cast<LPlatformChunk*>(chunk)),
51a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        masm_(assembler),
52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        info_(info),
53a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        current_block_(-1),
54a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        current_instruction_(-1),
55a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        instructions_(chunk->instructions()),
565a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        deoptimizations_(4, info->zone()),
575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        deopt_jump_table_(4, info->zone()),
585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        deoptimization_literals_(8, info->zone()),
59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        inlined_function_count_(0),
608f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org        scope_(info->scope()),
61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        status_(UNUSED),
625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        translations_(info->zone()),
635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        deferred_(8, info->zone()),
643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        osr_pc_offset_(-1),
6527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org        last_lazy_deopt_pc_(0),
66a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        frame_is_built_(false),
675a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        safepoints_(info->zone()),
6844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        resolver_(this),
69594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        expected_safepoint_kind_(Safepoint::kSimple),
70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        old_position_(RelocInfo::kNoPosition) {
71a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    PopulateDeoptimizationLiteralsWithInlinedFunctions();
72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Simple accessors.
763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  MacroAssembler* masm() const { return masm_; }
778f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  CompilationInfo* info() const { return info_; }
78ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate() const { return info_->isolate(); }
79ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Factory* factory() const { return isolate()->factory(); }
80ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Heap* heap() const { return isolate()->heap(); }
81400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  Zone* zone() const { return zone_; }
823a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
8332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  int LookupDestination(int block_id) const {
8432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org    return chunk()->LookupDestination(block_id);
8532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  }
8632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
8732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool IsNextEmittedBlock(int block_id) const {
8832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org    return LookupDestination(block_id) == GetNextEmittedBlock();
8932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  }
9032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
91a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  bool NeedsEagerFrame() const {
92a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return GetStackSlotCount() > 0 ||
93a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        info()->is_non_deferred_calling() ||
9477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        !info()->IsStub() ||
9577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org        info()->requires_frame();
96a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
97a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  bool NeedsDeferredFrame() const {
98a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return !NeedsEagerFrame() && info()->is_deferred_calling();
99a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
100a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1017bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  LinkRegisterStatus GetLinkRegisterState() const {
1027bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org    return frame_is_built_ ? kLRHasBeenSaved : kLRHasNotBeenSaved;
1037bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org  }
1047bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org
1053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Support for converting LOperands to assembler types.
1063a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // LOperand must be a register.
1073a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  Register ToRegister(LOperand* op) const;
1083a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1093a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // LOperand is loaded into scratch, unless already a register.
1103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  Register EmitLoadRegister(LOperand* op, Register scratch);
1113a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1123a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // LOperand must be a double register.
113a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DwVfpRegister ToDoubleRegister(LOperand* op) const;
1143a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // LOperand is loaded into dbl_scratch, unless already a double register.
116a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DwVfpRegister EmitLoadDoubleRegister(LOperand* op,
117a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                       SwVfpRegister flt_scratch,
118a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                       DwVfpRegister dbl_scratch);
119594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int32_t ToRepresentation(LConstantOperand* op, const Representation& r) const;
120fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int32_t ToInteger32(LConstantOperand* op) const;
121c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Smi* ToSmi(LConstantOperand* op) const;
122394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  double ToDouble(LConstantOperand* op) const;
1233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  Operand ToOperand(LOperand* op);
1243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  MemOperand ToMemOperand(LOperand* op) const;
1253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  // Returns a MemOperand pointing to the high word of a DoubleStackSlot.
1263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  MemOperand ToHighMemOperand(LOperand* op) const;
1273a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
128bf0c820d028452571c8c744ddd212c32c6d6a996danno@chromium.org  bool IsInteger32(LConstantOperand* op) const;
129a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  bool IsSmi(LConstantOperand* op) const;
130bf0c820d028452571c8c744ddd212c32c6d6a996danno@chromium.org  Handle<Object> ToHandle(LConstantOperand* op) const;
131bf0c820d028452571c8c744ddd212c32c6d6a996danno@chromium.org
132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Try to generate code for the entire chunk, but it may fail if the
133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // chunk contains constructs we cannot handle. Returns true if the
134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // code generation attempt succeeded.
135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool GenerateCode();
136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Finish the code by setting stack height, safepoint, and bailout
138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // information on it.
139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void FinishCode(Handle<Code> code);
140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Deferred code support.
142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void DoDeferredNumberTagD(LNumberTagD* instr);
14346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
14446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  enum IntegerSignedness { SIGNED_INT32, UNSIGNED_INT32 };
14546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  void DoDeferredNumberTagI(LInstruction* instr,
14646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                            LOperand* value,
14746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                            IntegerSignedness signedness);
14846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void DoDeferredTaggedToI(LTaggedToI* instr);
150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void DoDeferredMathAbsTaggedHeapNumber(LMathAbs* instr);
15104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  void DoDeferredStackCheck(LStackCheck* instr);
152bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  void DoDeferredRandom(LRandom* instr);
1530a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
154b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  void DoDeferredStringCharFromCode(LStringCharFromCode* instr);
15594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  void DoDeferredAllocate(LAllocate* instr);
15627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
15727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                       Label* map_check);
158594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void DoDeferredInstanceMigration(LCheckMaps* instr, Register object);
159f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
160a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Parallel move support.
161a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void DoParallelMove(LParallelMove* move);
1628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  void DoGap(LGap* instr);
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
164304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  MemOperand PrepareKeyedOperand(Register key,
165304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 Register base,
166304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 bool key_is_constant,
167304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 int constant_key,
168304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 int element_size,
169304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 int shift_size,
170304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 int additional_index,
171304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org                                 int additional_offset);
172304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
173c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Emit frame translation commands for an environment.
174b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  void WriteTranslation(LEnvironment* environment, Translation* translation);
175c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
176a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Declare methods that deal with the individual node types.
177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DECLARE_DO(type) void Do##type(L##type* node);
178a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DECLARE_DO
180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private:
182a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  enum Status {
183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    UNUSED,
184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    GENERATING,
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    DONE,
186a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    ABORTED
187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  };
188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool is_unused() const { return status_ == UNUSED; }
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool is_generating() const { return status_ == GENERATING; }
191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool is_done() const { return status_ == DONE; }
192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool is_aborted() const { return status_ == ABORTED; }
193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
194394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  StrictModeFlag strict_mode_flag() const {
1951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    return info()->is_classic_mode() ? kNonStrictMode : kStrictMode;
19649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  }
19749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org
19828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  LPlatformChunk* chunk() const { return chunk_; }
199a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Scope* scope() const { return scope_; }
20032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  HGraph* graph() const { return chunk()->graph(); }
201a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2025d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org  Register scratch0() { return r9; }
203fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  LowDwVfpRegister double_scratch0() { return kScratchDoubleReg; }
2045d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org
20532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  int GetNextEmittedBlock() const;
206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LInstruction* GetNextInstruction();
207a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void EmitClassOfTest(Label* if_true,
209a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       Label* if_false,
210a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       Handle<String> class_name,
211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       Register input,
212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       Register temporary,
213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                       Register temporary2);
214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
215160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
216a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
217594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void Abort(BailoutReason reason);
218b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  void FPRINTF_CHECKING Comment(const char* format, ...);
219a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
221a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
222a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Code generation passes.  Returns true if code generation should
223a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // continue.
224a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool GeneratePrologue();
225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool GenerateBody();
226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool GenerateDeferredCode();
22740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  bool GenerateDeoptJumpTable();
228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool GenerateSafepointTable();
229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
23044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  enum SafepointMode {
23144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    RECORD_SIMPLE_SAFEPOINT,
23244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS
23344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  };
23444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
23589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  void CallCode(
23689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      Handle<Code> code,
23789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      RelocInfo::Mode mode,
23889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      LInstruction* instr,
23989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      TargetAddressStorageMode storage_mode = CAN_INLINE_TARGET_ADDRESS);
24089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
24189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  void CallCodeGeneric(
24289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      Handle<Code> code,
24389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      RelocInfo::Mode mode,
24489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      LInstruction* instr,
24589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      SafepointMode safepoint_mode,
24689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      TargetAddressStorageMode storage_mode = CAN_INLINE_TARGET_ADDRESS);
24744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  void CallRuntime(const Runtime::Function* function,
249a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                   int num_arguments,
250a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                   LInstruction* instr);
25144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
252a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void CallRuntime(Runtime::FunctionId id,
253a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                   int num_arguments,
254a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                   LInstruction* instr) {
255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    const Runtime::Function* function = Runtime::FunctionForId(id);
256a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    CallRuntime(function, num_arguments, instr);
257a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
258a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
25944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  void CallRuntimeFromDeferred(Runtime::FunctionId id,
26044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                               int argc,
26144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                               LInstruction* instr);
26244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
263fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  enum R1State {
264fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    R1_UNINITIALIZED,
265fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org    R1_CONTAINS_TARGET
266fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  };
267fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org
268a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Generate a direct call to a known function.  Expects the function
269394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // to be in r1.
270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void CallKnownFunction(Handle<JSFunction> function,
27132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org                         int formal_parameter_count,
272a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                         int arity,
27340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org                         LInstruction* instr,
274fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org                         CallKind call_kind,
275fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org                         R1State r1_state);
276a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
277c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void LoadHeapObject(Register result, Handle<HeapObject> object);
278a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
27927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void RecordSafepointWithLazyDeopt(LInstruction* instr,
28027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                    SafepointMode safepoint_mode);
28144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
28227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void RegisterEnvironmentForDeoptimization(LEnvironment* environment,
28327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                            Safepoint::DeoptMode mode);
284c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  void DeoptimizeIf(Condition condition,
285aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org                    LEnvironment* environment,
286aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org                    Deoptimizer::BailoutType bailout_type);
287c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  void DeoptimizeIf(Condition condition, LEnvironment* environment);
288c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  void ApplyCheckIf(Condition condition, LBoundsCheck* check);
289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
290594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void AddToTranslation(LEnvironment* environment,
291594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        Translation* translation,
292a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                        LOperand* op,
29346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                        bool is_tagged,
294594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        bool is_uint32,
295594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        int* object_index_pointer,
296594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                        int* dematerialized_index_pointer);
2976ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org  void RegisterDependentCodeForEmbeddedMaps(Handle<Code> code);
298a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void PopulateDeoptimizationData(Handle<Code> code);
299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int DefineDeoptimizationLiteral(Handle<Object> literal);
300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
301a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void PopulateDeoptimizationLiteralsWithInlinedFunctions();
302a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
303a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Register ToRegister(int index) const;
304a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DwVfpRegister ToDoubleRegister(int index) const;
305a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
306e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  void EmitIntegerMathAbs(LMathAbs* instr);
307a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
308a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Support for recording safepoint and position information.
309378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  void RecordSafepoint(LPointerMap* pointers,
310378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org                       Safepoint::Kind kind,
311378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org                       int arguments,
31227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                       Safepoint::DeoptMode mode);
31327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void RecordSafepoint(LPointerMap* pointers, Safepoint::DeoptMode mode);
31427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void RecordSafepoint(Safepoint::DeoptMode mode);
315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void RecordSafepointWithRegisters(LPointerMap* pointers,
316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                    int arguments,
31727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                    Safepoint::DeoptMode mode);
318c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void RecordSafepointWithRegistersAndDoubles(LPointerMap* pointers,
319c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                                              int arguments,
32027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org                                              Safepoint::DeoptMode mode);
321a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void RecordPosition(int position);
322594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void RecordAndUpdatePosition(int position);
323a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
324a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  static Condition TokenToCondition(Token::Value op, bool is_unsigned);
32504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  void EmitGoto(int block);
3261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  template<class InstrType>
327c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  void EmitBranch(InstrType instr, Condition condition);
328c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  template<class InstrType>
329c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  void EmitFalseBranch(InstrType instr, Condition condition);
330a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  void EmitNumberUntagD(Register input,
331a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                        DwVfpRegister result,
332b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org                        bool allow_undefined_as_nan,
333f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com                        bool deoptimize_on_minus_zero,
33494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org                        LEnvironment* env,
33594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org                        NumberUntagDMode mode);
336a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
337a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Emits optimized code for typeof x == "y".  Modifies input register.
338a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Returns the condition on which a final split to
339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // true and false label should be made, to optimize fallthrough.
340394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  Condition EmitTypeofIs(Label* true_label,
341394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                         Label* false_label,
342394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                         Register input,
343394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                         Handle<String> type_name);
344a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3455f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // Emits optimized code for %_IsObject(x).  Preserves input register.
3465f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // Returns the condition on which a final split to
3475f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // true and false label should be made, to optimize fallthrough.
3485f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  Condition EmitIsObject(Register input,
3495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                         Register temp1,
3505f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                         Label* is_not_object,
3515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org                         Label* is_object);
3525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
3530ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  // Emits optimized code for %_IsString(x).  Preserves input register.
3540ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  // Returns the condition on which a final split to
3550ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  // true and false label should be made, to optimize fallthrough.
3560ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  Condition EmitIsString(Register input,
3570ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry                         Register temp1,
3581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                         Label* is_not_string,
3591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                         SmiCheck check_needed);
3600ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
361d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  // Emits optimized code for %_IsConstructCall().
362d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  // Caller should branch on equal condition.
363d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  void EmitIsConstructCall(Register temp1, Register temp2);
364d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
3651b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // Emits optimized code to deep-copy the contents of statically known
3661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  // object graphs (e.g. object literal boilerplate).
3671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  void EmitDeepCopy(Handle<JSObject> object,
3681b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    Register result,
3691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                    Register source,
37046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                    int* offset,
37146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                    AllocationSiteMode mode);
3721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
373efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // Emit optimized code for integer division.
374efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // Inputs are signed.
375efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // All registers are clobbered.
376efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // If 'remainder' is no_reg, it is not computed.
377efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  void EmitSignedIntegerDivisionByConstant(Register result,
378efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org                                           Register dividend,
379efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org                                           int32_t divisor,
380efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org                                           Register remainder,
381efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org                                           Register scratch,
382efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org                                           LEnvironment* environment);
383efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
38427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  void EnsureSpaceForLazyDeopt();
385e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  void DoLoadKeyedExternalArray(LLoadKeyed* instr);
386e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  void DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr);
387e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  void DoLoadKeyedFixedArray(LLoadKeyed* instr);
388e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  void DoStoreKeyedExternalArray(LStoreKeyed* instr);
389e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  void DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr);
390e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  void DoStoreKeyedFixedArray(LStoreKeyed* instr);
39127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org
3925a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  Zone* zone_;
39328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  LPlatformChunk* const chunk_;
394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  MacroAssembler* const masm_;
395a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  CompilationInfo* const info_;
396a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int current_block_;
398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int current_instruction_;
399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  const ZoneList<LInstruction*>* instructions_;
400a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<LEnvironment*> deoptimizations_;
401aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org  ZoneList<Deoptimizer::JumpTableEntry> deopt_jump_table_;
402a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<Handle<Object> > deoptimization_literals_;
403a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int inlined_function_count_;
404a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Scope* const scope_;
405a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Status status_;
406a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  TranslationBuffer translations_;
407a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ZoneList<LDeferredCode*> deferred_;
408a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int osr_pc_offset_;
40927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  int last_lazy_deopt_pc_;
410a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  bool frame_is_built_;
411a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
412a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Builder that keeps track of safepoints in the code. The table
413a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // itself is emitted at the end of the generated code.
414a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  SafepointTableBuilder safepoints_;
415a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
416c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Compiler from a set of parallel moves to a sequential list of moves.
417c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LGapResolver resolver_;
418c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
41944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Safepoint::Kind expected_safepoint_kind_;
42044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
421594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int old_position_;
422594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
42344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  class PushSafepointRegistersScope BASE_EMBEDDED {
42444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org   public:
42544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    PushSafepointRegistersScope(LCodeGen* codegen,
42644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                Safepoint::Kind kind)
42744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        : codegen_(codegen) {
428a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      ASSERT(codegen_->info()->is_calling());
42944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple);
43044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      codegen_->expected_safepoint_kind_ = kind;
43144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
43244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      switch (codegen_->expected_safepoint_kind_) {
43344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        case Safepoint::kWithRegisters:
43444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          codegen_->masm_->PushSafepointRegisters();
43544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          break;
43644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        case Safepoint::kWithRegistersAndDoubles:
43744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          codegen_->masm_->PushSafepointRegistersAndDoubles();
43844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          break;
43944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        default:
44044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          UNREACHABLE();
44144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      }
44244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    }
44344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
44444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    ~PushSafepointRegistersScope() {
44544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      Safepoint::Kind kind = codegen_->expected_safepoint_kind_;
44644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      ASSERT((kind & Safepoint::kWithRegisters) != 0);
44744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      switch (kind) {
44844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        case Safepoint::kWithRegisters:
44944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          codegen_->masm_->PopSafepointRegisters();
45044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          break;
45144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        case Safepoint::kWithRegistersAndDoubles:
45244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          codegen_->masm_->PopSafepointRegistersAndDoubles();
45344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          break;
45444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        default:
45544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org          UNREACHABLE();
45644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      }
45744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      codegen_->expected_safepoint_kind_ = Safepoint::kSimple;
45844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    }
45944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
46044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org   private:
46144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    LCodeGen* codegen_;
46244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  };
46344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  friend class LDeferredCode;
465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  friend class LEnvironment;
466a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  friend class SafepointGenerator;
467a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  DISALLOW_COPY_AND_ASSIGN(LCodeGen);
468a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
471a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass LDeferredCode: public ZoneObject {
472a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  explicit LDeferredCode(LCodeGen* codegen)
474c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      : codegen_(codegen),
475c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        external_exit_(NULL),
476c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com        instruction_index_(codegen->current_instruction_) {
477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    codegen->AddDeferredCode(this);
478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  virtual ~LDeferredCode() { }
481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  virtual void Generate() = 0;
482c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  virtual LInstruction* instr() = 0;
483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
484f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  void SetExit(Label* exit) { external_exit_ = exit; }
485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Label* entry() { return &entry_; }
486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; }
487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int instruction_index() const { return instruction_index_; }
488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org protected:
490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LCodeGen* codegen() const { return codegen_; }
491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  MacroAssembler* masm() const { return codegen_->masm(); }
492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private:
494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LCodeGen* codegen_;
495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Label entry_;
496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Label exit_;
497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Label* external_exit_;
498c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int instruction_index_;
499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} }  // namespace v8::internal
502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif  // V8_ARM_LITHIUM_CODEGEN_ARM_H_
504