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_X64_LITHIUM_CODEGEN_X64_H_ 29a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define V8_X64_LITHIUM_CODEGEN_X64_H_ 30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 31a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "x64/lithium-x64.h" 32a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 33c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#include "checks.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" 380ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org#include "x64/lithium-gap-resolver-x64.h" 39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 { 41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal { 42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Forward declarations. 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass LDeferredCode; 45c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgclass SafepointGenerator; 46c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 47a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass LCodeGen BASE_EMBEDDED { 48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public: 495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info) 505a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org : zone_(info->zone()), 5128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org chunk_(static_cast<LPlatformChunk*>(chunk)), 52c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org masm_(assembler), 53c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org info_(info), 54c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org current_block_(-1), 55c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org current_instruction_(-1), 56c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org instructions_(chunk->instructions()), 575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org deoptimizations_(4, info->zone()), 585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org jump_table_(4, info->zone()), 595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org deoptimization_literals_(8, info->zone()), 60c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org inlined_function_count_(0), 618f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org scope_(info->scope()), 62c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org status_(UNUSED), 635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org translations_(info->zone()), 645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org deferred_(8, info->zone()), 650ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org osr_pc_offset_(-1), 6627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org last_lazy_deopt_pc_(0), 67a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org frame_is_built_(false), 685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org safepoints_(info->zone()), 6944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org resolver_(this), 70594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org expected_safepoint_kind_(Safepoint::kSimple), 71594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org old_position_(RelocInfo::kNoPosition) { 72c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org PopulateDeoptimizationLiteralsWithInlinedFunctions(); 73c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 74a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 750ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Simple accessors. 760ee099beef2c2b38743d657b84a30b626d9178ecager@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_; } 820ee099beef2c2b38743d657b84a30b626d9178ecager@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 1010ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org // Support for converting LOperands to assembler types. 1020ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org Register ToRegister(LOperand* op) const; 1030ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org XMMRegister ToDoubleRegister(LOperand* op) const; 1040ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org bool IsInteger32Constant(LConstantOperand* op) const; 105a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org bool IsSmiConstant(LConstantOperand* op) const; 106fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org int32_t ToInteger32(LConstantOperand* op) const; 107c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Smi* ToSmi(LConstantOperand* op) const; 108394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com double ToDouble(LConstantOperand* op) const; 109d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ExternalReference ToExternalReference(LConstantOperand* op) const; 1100ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org bool IsTaggedConstant(LConstantOperand* op) const; 1110ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org Handle<Object> ToHandle(LConstantOperand* op) const; 1120ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org Operand ToOperand(LOperand* op) const; 1130ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Try to generate code for the entire chunk, but it may fail if the 115a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // chunk contains constructs we cannot handle. Returns true if the 116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // code generation attempt succeeded. 117c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool GenerateCode(); 118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 119a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Finish the code by setting stack height, safepoint, and bailout 120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // information on it. 121c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void FinishCode(Handle<Code> code); 122c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 123c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Deferred code support. 124c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void DoDeferredNumberTagD(LNumberTagD* instr); 12546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org void DoDeferredNumberTagU(LNumberTagU* instr); 126c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void DoDeferredTaggedToI(LTaggedToI* instr); 127e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org void DoDeferredMathAbsTaggedHeapNumber(LMathAbs* instr); 12804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org void DoDeferredStackCheck(LStackCheck* instr); 129bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com void DoDeferredRandom(LRandom* instr); 1303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr); 131b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org void DoDeferredStringCharFromCode(LStringCharFromCode* instr); 13294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org void DoDeferredAllocate(LAllocate* instr); 13327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, 13427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Label* map_check); 135594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void DoDeferredInstanceMigration(LCheckMaps* instr, Register object); 136f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com 137f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Parallel move support. 138c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void DoParallelMove(LParallelMove* move); 1398e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org void DoGap(LGap* instr); 140c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 141c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Emit frame translation commands for an environment. 142b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org void WriteTranslation(LEnvironment* environment, Translation* translation); 143c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 144c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Declare methods that deal with the individual node types. 145c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#define DECLARE_DO(type) void Do##type(L##type* node); 146c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) 147c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#undef DECLARE_DO 148c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 149c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private: 150c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org enum Status { 151c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org UNUSED, 152c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org GENERATING, 153c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org DONE, 154c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ABORTED 155c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org }; 156c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 157c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool is_unused() const { return status_ == UNUSED; } 158c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool is_generating() const { return status_ == GENERATING; } 159c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool is_done() const { return status_ == DONE; } 160c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool is_aborted() const { return status_ == ABORTED; } 161c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 162394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com StrictModeFlag strict_mode_flag() const { 1631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org return info()->is_classic_mode() ? kNonStrictMode : kStrictMode; 1643a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 1653a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 16628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org LPlatformChunk* chunk() const { return chunk_; } 167c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Scope* scope() const { return scope_; } 16832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org HGraph* graph() const { return chunk()->graph(); } 169c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 17032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int GetNextEmittedBlock() const; 171c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 172c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void EmitClassOfTest(Label* if_true, 173c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label* if_false, 174c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Handle<String> class_name, 175c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Register input, 176c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Register temporary, 177c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Register scratch); 178c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 179160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org int GetStackSlotCount() const { return chunk()->spill_slot_count(); } 180c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 181594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void Abort(BailoutReason reason); 182b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org void FPRINTF_CHECKING Comment(const char* format, ...); 183c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 1847028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); } 185c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 186c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Code generation passes. Returns true if code generation should 187c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // continue. 188c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool GeneratePrologue(); 189c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool GenerateBody(); 190c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool GenerateDeferredCode(); 1919ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org bool GenerateJumpTable(); 192c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org bool GenerateSafepointTable(); 193c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 19444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org enum SafepointMode { 19544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org RECORD_SIMPLE_SAFEPOINT, 19644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org RECORD_SAFEPOINT_WITH_REGISTERS 19744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org }; 19844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 19944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org void CallCodeGeneric(Handle<Code> code, 20044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org RelocInfo::Mode mode, 20144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org LInstruction* instr, 20244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org SafepointMode safepoint_mode, 20344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org int argc); 20444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 20544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 206c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void CallCode(Handle<Code> code, 207c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org RelocInfo::Mode mode, 208c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LInstruction* instr); 20944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 210ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org void CallRuntime(const Runtime::Function* function, 211c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int num_arguments, 212c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LInstruction* instr); 21344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 214c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void CallRuntime(Runtime::FunctionId id, 215c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int num_arguments, 216c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LInstruction* instr) { 217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const Runtime::Function* function = Runtime::FunctionForId(id); 218c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org CallRuntime(function, num_arguments, instr); 219c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 220c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 22144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org void CallRuntimeFromDeferred(Runtime::FunctionId id, 22244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org int argc, 22344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org LInstruction* instr); 22444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 225fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org enum RDIState { 226fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org RDI_UNINITIALIZED, 227fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org RDI_CONTAINS_TARGET 228fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org }; 229fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 230c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Generate a direct call to a known function. Expects the function 231394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // to be in rdi. 232c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void CallKnownFunction(Handle<JSFunction> function, 23332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org int formal_parameter_count, 234c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int arity, 23540cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org LInstruction* instr, 236fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org CallKind call_kind, 237fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org RDIState rdi_state); 238c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 23927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void RecordSafepointWithLazyDeopt(LInstruction* instr, 24027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org SafepointMode safepoint_mode, 24127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org int argc); 24227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void RegisterEnvironmentForDeoptimization(LEnvironment* environment, 24327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Safepoint::DeoptMode mode); 244aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org void DeoptimizeIf(Condition cc, 245aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org LEnvironment* environment, 246aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org Deoptimizer::BailoutType bailout_type); 247c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void DeoptimizeIf(Condition cc, LEnvironment* environment); 248fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org void ApplyCheckIf(Condition cc, LBoundsCheck* check); 249594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 250594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void AddToTranslation(LEnvironment* environment, 251594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org Translation* translation, 252c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LOperand* op, 25346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org bool is_tagged, 254594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org bool is_uint32, 255594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int* object_index_pointer, 256594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int* dematerialized_index_pointer); 2576ba1fd0b7bebfbcabc4ad3cdaf9b84aad9651962ulan@chromium.org void RegisterDependentCodeForEmbeddedMaps(Handle<Code> code); 258c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void PopulateDeoptimizationData(Handle<Code> code); 259c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int DefineDeoptimizationLiteral(Handle<Object> literal); 260c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 261c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void PopulateDeoptimizationLiteralsWithInlinedFunctions(); 262c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 263c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Register ToRegister(int index) const; 264c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org XMMRegister ToDoubleRegister(int index) const; 265717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org Operand BuildFastArrayOperand( 266b645116853c677aca8a316381b87441ba6004f67danno@chromium.org LOperand* elements_pointer, 2676d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org LOperand* key, 26883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org ElementsKind elements_kind, 2690e3f88bd850f46930aa95684377fab02a394ae41ulan@chromium.org uint32_t offset, 2700e3f88bd850f46930aa95684377fab02a394ae41ulan@chromium.org uint32_t additional_index = 0); 271c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org void EmitIntegerMathAbs(LMathAbs* instr); 273594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void EmitSmiMathAbs(LMathAbs* instr); 274c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 275c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Support for recording safepoint and position information. 276378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void RecordSafepoint(LPointerMap* pointers, 277378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Safepoint::Kind kind, 278378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int arguments, 27927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Safepoint::DeoptMode mode); 28027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void RecordSafepoint(LPointerMap* pointers, Safepoint::DeoptMode mode); 28127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org void RecordSafepoint(Safepoint::DeoptMode mode); 282c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void RecordSafepointWithRegisters(LPointerMap* pointers, 283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int arguments, 28427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Safepoint::DeoptMode mode); 285c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org void RecordPosition(int position); 286594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org void RecordAndUpdatePosition(int position); 287c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 288c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org static Condition TokenToCondition(Token::Value op, bool is_unsigned); 28904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org void EmitGoto(int block); 2901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org template<class InstrType> 2911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void EmitBranch(InstrType instr, Condition cc); 292c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org template<class InstrType> 293c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org void EmitFalseBranch(InstrType instr, Condition cc); 29494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org void EmitNumberUntagD( 29594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org Register input, 29694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org XMMRegister result, 297b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org bool allow_undefined_as_nan, 29894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org bool deoptimize_on_minus_zero, 29994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org LEnvironment* env, 30094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED); 301c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 302c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Emits optimized code for typeof x == "y". Modifies input register. 303c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Returns the condition on which a final split to 304c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // true and false label should be made, to optimize fallthrough. 305394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Condition EmitTypeofIs(Label* true_label, 306394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Label* false_label, 307394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Register input, 308394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<String> type_name); 309c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 310c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Emits optimized code for %_IsObject(x). Preserves input register. 311c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Returns the condition on which a final split to 312c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // true and false label should be made, to optimize fallthrough. 313c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Condition EmitIsObject(Register input, 314c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label* is_not_object, 315c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label* is_object); 316c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 3170ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry // Emits optimized code for %_IsString(x). Preserves input register. 3180ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry // Returns the condition on which a final split to 3190ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry // true and false label should be made, to optimize fallthrough. 3200ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry Condition EmitIsString(Register input, 3210ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry Register temp1, 3221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* is_not_string, 3231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SmiCheck check_needed); 3240ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry 325d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com // Emits optimized code for %_IsConstructCall(). 326d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com // Caller should branch on equal condition. 327d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com void EmitIsConstructCall(Register temp); 328d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 329160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // Emits code for pushing either a tagged constant, a (non-double) 330160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org // register, or a stack slot operand. 331160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org void EmitPushTaggedOperand(LOperand* operand); 3323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 3331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Emits optimized code to deep-copy the contents of statically known 3341b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // object graphs (e.g. object literal boilerplate). 3351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org void EmitDeepCopy(Handle<JSObject> object, 3361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org Register result, 3371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org Register source, 33846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org int* offset, 33946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org AllocationSiteMode mode); 3401b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org 34164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org void EnsureSpaceForLazyDeopt(int space_needed); 342e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org void DoLoadKeyedExternalArray(LLoadKeyed* instr); 343e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org void DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr); 344e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org void DoLoadKeyedFixedArray(LLoadKeyed* instr); 345e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org void DoStoreKeyedExternalArray(LStoreKeyed* instr); 346e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org void DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr); 347e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org void DoStoreKeyedFixedArray(LStoreKeyed* instr); 348d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#ifdef _MSC_VER 349d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // On windows, you may not access the stack more than one page below 350d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // the most recently mapped page. To make the allocated area randomly 351d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // accessible, we write an arbitrary value to each page in range 352d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org // rsp + offset - page_size .. rsp in turn. 353d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org void MakeSureStackPagesMapped(int offset); 354d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#endif 35527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 3565a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Zone* zone_; 35728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org LPlatformChunk* const chunk_; 358c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org MacroAssembler* const masm_; 359c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org CompilationInfo* const info_; 360c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 361c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int current_block_; 362c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int current_instruction_; 363c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org const ZoneList<LInstruction*>* instructions_; 364c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ZoneList<LEnvironment*> deoptimizations_; 365aefd6076246d134fe4e1bf0641f0a4d4e35a09c2danno@chromium.org ZoneList<Deoptimizer::JumpTableEntry> jump_table_; 366c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ZoneList<Handle<Object> > deoptimization_literals_; 367c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int inlined_function_count_; 368c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Scope* const scope_; 369c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Status status_; 370c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org TranslationBuffer translations_; 371c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org ZoneList<LDeferredCode*> deferred_; 372c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int osr_pc_offset_; 37327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org int last_lazy_deopt_pc_; 374a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool frame_is_built_; 375c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 376c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Builder that keeps track of safepoints in the code. The table 377c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // itself is emitted at the end of the generated code. 378c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org SafepointTableBuilder safepoints_; 379c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 380c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // Compiler from a set of parallel moves to a sequential list of moves. 381c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LGapResolver resolver_; 382c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 38344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Safepoint::Kind expected_safepoint_kind_; 38444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 385594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org int old_position_; 386594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 38744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org class PushSafepointRegistersScope BASE_EMBEDDED { 38844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org public: 38944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org explicit PushSafepointRegistersScope(LCodeGen* codegen) 39044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org : codegen_(codegen) { 391a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org ASSERT(codegen_->info()->is_calling()); 39244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple); 39344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org codegen_->masm_->PushSafepointRegisters(); 39444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org codegen_->expected_safepoint_kind_ = Safepoint::kWithRegisters; 39544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 39644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 39744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org ~PushSafepointRegistersScope() { 39844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kWithRegisters); 39944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org codegen_->masm_->PopSafepointRegisters(); 40044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org codegen_->expected_safepoint_kind_ = Safepoint::kSimple; 40144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 40244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 40344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org private: 40444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org LCodeGen* codegen_; 40544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org }; 40644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 407c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org friend class LDeferredCode; 408c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org friend class LEnvironment; 409c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org friend class SafepointGenerator; 410c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(LCodeGen); 411c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}; 412c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 413c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 414c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgclass LDeferredCode: public ZoneObject { 415c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public: 416c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org explicit LDeferredCode(LCodeGen* codegen) 417c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : codegen_(codegen), 418c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com external_exit_(NULL), 419c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com instruction_index_(codegen->current_instruction_) { 420c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org codegen->AddDeferredCode(this); 421c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 422c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 423c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org virtual ~LDeferredCode() { } 424c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org virtual void Generate() = 0; 425c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com virtual LInstruction* instr() = 0; 426c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 427f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com void SetExit(Label* exit) { external_exit_ = exit; } 428c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label* entry() { return &entry_; } 429c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; } 430c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int instruction_index() const { return instruction_index_; } 431c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 432c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org protected: 433c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LCodeGen* codegen() const { return codegen_; } 434c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org MacroAssembler* masm() const { return codegen_->masm(); } 435c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 436c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private: 437c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org LCodeGen* codegen_; 438c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label entry_; 439c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label exit_; 440c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org Label* external_exit_; 441c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int instruction_index_; 442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}; 443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} } // namespace v8::internal 445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif // V8_X64_LITHIUM_CODEGEN_X64_H_ 447