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