lithium-codegen-arm.h revision 44f0eee88ff00398ff7f715fab053374d808c90d
1b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met: 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions of source code must retain the above copyright 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions in binary form must reproduce the above 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// copyright notice, this list of conditions and the following 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// with the distribution. 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contributors may be used to endorse or promote products derived 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from this software without specific prior written permission. 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_ARM_LITHIUM_CODEGEN_ARM_H_ 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_ARM_LITHIUM_CODEGEN_ARM_H_ 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "arm/lithium-arm.h" 32e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#include "arm/lithium-gap-resolver-arm.h" 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "deoptimizer.h" 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "safepoint-table.h" 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "scopes.h" 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations. 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LDeferredCode; 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass SafepointGenerator; 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LCodeGen BASE_EMBEDDED { 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info) 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : chunk_(chunk), 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch masm_(assembler), 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch info_(info), 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_block_(-1), 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch current_instruction_(-1), 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch instructions_(chunk->instructions()), 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch deoptimizations_(4), 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch deoptimization_literals_(8), 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inlined_function_count_(0), 56e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch scope_(info->scope()), 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch status_(UNUSED), 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch deferred_(8), 59e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch osr_pc_offset_(-1), 60e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch resolver_(this) { 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch PopulateDeoptimizationLiteralsWithInlinedFunctions(); 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 64e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 65e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Simple accessors. 66e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch MacroAssembler* masm() const { return masm_; } 67e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch CompilationInfo* info() const { return info_; } 6844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate() const { return info_->isolate(); } 6944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Factory* factory() const { return isolate()->factory(); } 7044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap* heap() const { return isolate()->heap(); } 71e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 72e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Support for converting LOperands to assembler types. 73e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // LOperand must be a register. 74e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Register ToRegister(LOperand* op) const; 75e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 76e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // LOperand is loaded into scratch, unless already a register. 77e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Register EmitLoadRegister(LOperand* op, Register scratch); 78e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 79e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // LOperand must be a double register. 80e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch DoubleRegister ToDoubleRegister(LOperand* op) const; 81e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 82e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // LOperand is loaded into dbl_scratch, unless already a double register. 83e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch DoubleRegister EmitLoadDoubleRegister(LOperand* op, 84e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SwVfpRegister flt_scratch, 85e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch DoubleRegister dbl_scratch); 86e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int ToInteger32(LConstantOperand* op) const; 87e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Operand ToOperand(LOperand* op); 88e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch MemOperand ToMemOperand(LOperand* op) const; 89e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Returns a MemOperand pointing to the high word of a DoubleStackSlot. 90e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch MemOperand ToHighMemOperand(LOperand* op) const; 91e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Try to generate code for the entire chunk, but it may fail if the 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // chunk contains constructs we cannot handle. Returns true if the 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // code generation attempt succeeded. 95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool GenerateCode(); 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Finish the code by setting stack height, safepoint, and bailout 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // information on it. 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void FinishCode(Handle<Code> code); 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Deferred code support. 1021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block template<int T> 103e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void DoDeferredBinaryOpStub(LTemplateInstruction<1, 2, T>* instr, 104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Token::Value op); 105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoDeferredNumberTagD(LNumberTagD* instr); 106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoDeferredNumberTagI(LNumberTagI* instr); 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoDeferredTaggedToI(LTaggedToI* instr); 108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr); 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoDeferredStackCheck(LGoto* instr); 1101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr); 11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DoDeferredStringCharFromCode(LStringCharFromCode* instr); 1121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, 1131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Label* map_check); 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Parallel move support. 116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoParallelMove(LParallelMove* move); 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Emit frame translation commands for an environment. 119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void WriteTranslation(LEnvironment* environment, Translation* translation); 120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare methods that deal with the individual node types. 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_DO(type) void Do##type(L##type* node); 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_DO 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Status { 128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNUSED, 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GENERATING, 130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DONE, 131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ABORTED 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_unused() const { return status_ == UNUSED; } 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_generating() const { return status_ == GENERATING; } 136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_done() const { return status_ == DONE; } 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_aborted() const { return status_ == ABORTED; } 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 139e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int strict_mode_flag() const { 140e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return info()->is_strict() ? kStrictMode : kNonStrictMode; 141e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LChunk* chunk() const { return chunk_; } 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Scope* scope() const { return scope_; } 145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HGraph* graph() const { return chunk_->graph(); } 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1479fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block Register scratch0() { return r9; } 148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch DwVfpRegister double_scratch0() { return d0; } 1499fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int GetNextEmittedBlock(int block); 151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LInstruction* GetNextInstruction(); 152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EmitClassOfTest(Label* if_true, 154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label* if_false, 155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name, 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register input, 157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register temporary, 158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register temporary2); 159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int StackSlotCount() const { return chunk()->spill_slot_count(); } 161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ParameterCount() const { return scope()->num_parameters(); } 162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Abort(const char* format, ...); 164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Comment(const char* format, ...); 165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code); } 167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Code generation passes. Returns true if code generation should 169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // continue. 170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool GeneratePrologue(); 171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool GenerateBody(); 172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool GenerateDeferredCode(); 173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool GenerateSafepointTable(); 174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void CallCode(Handle<Code> code, 176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RelocInfo::Mode mode, 177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LInstruction* instr); 17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CallRuntime(const Runtime::Function* function, 179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int num_arguments, 180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LInstruction* instr); 181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void CallRuntime(Runtime::FunctionId id, 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int num_arguments, 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LInstruction* instr) { 18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function = Runtime::FunctionForId(id); 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CallRuntime(function, num_arguments, instr); 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Generate a direct call to a known function. Expects the function 189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // to be in edi. 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void CallKnownFunction(Handle<JSFunction> function, 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int arity, 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LInstruction* instr); 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void LoadHeapObject(Register result, Handle<HeapObject> object); 195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RegisterLazyDeoptimization(LInstruction* instr); 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RegisterEnvironmentForDeoptimization(LEnvironment* environment); 198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DeoptimizeIf(Condition cc, LEnvironment* environment); 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddToTranslation(Translation* translation, 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LOperand* op, 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_tagged); 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void PopulateDeoptimizationData(Handle<Code> code); 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int DefineDeoptimizationLiteral(Handle<Object> literal); 205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void PopulateDeoptimizationLiteralsWithInlinedFunctions(); 207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register ToRegister(int index) const; 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DoubleRegister ToDoubleRegister(int index) const; 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Specific math operations - used from DoUnaryMathOperation. 2121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void EmitIntegerMathAbs(LUnaryMathOperation* instr); 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoMathAbs(LUnaryMathOperation* instr); 214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoMathFloor(LUnaryMathOperation* instr); 215e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void DoMathRound(LUnaryMathOperation* instr); 216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void DoMathSqrt(LUnaryMathOperation* instr); 21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DoMathPowHalf(LUnaryMathOperation* instr); 218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void DoMathLog(LUnaryMathOperation* instr); 219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void DoMathCos(LUnaryMathOperation* instr); 220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void DoMathSin(LUnaryMathOperation* instr); 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Support for recording safepoint and position information. 2231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void RecordSafepoint(LPointerMap* pointers, 2241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Safepoint::Kind kind, 2251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int arguments, 2261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int deoptimization_index); 227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RecordSafepoint(LPointerMap* pointers, int deoptimization_index); 228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void RecordSafepoint(int deoptimization_index); 229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RecordSafepointWithRegisters(LPointerMap* pointers, 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int arguments, 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int deoptimization_index); 232b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void RecordSafepointWithRegistersAndDoubles(LPointerMap* pointers, 233b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int arguments, 234b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int deoptimization_index); 235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RecordPosition(int position); 23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block int LastSafepointEnd() { 23744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return static_cast<int>(safepoints_.GetPcAfterGap()); 23844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Condition TokenToCondition(Token::Value op, bool is_unsigned); 241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EmitGoto(int block, LDeferredCode* deferred_stack_check = NULL); 242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EmitBranch(int left_block, int right_block, Condition cc); 243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EmitCmpI(LOperand* left, LOperand* right); 244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EmitNumberUntagD(Register input, 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DoubleRegister result, 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LEnvironment* env); 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Emits optimized code for typeof x == "y". Modifies input register. 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Returns the condition on which a final split to 250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // true and false label should be made, to optimize fallthrough. 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Condition EmitTypeofIs(Label* true_label, Label* false_label, 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register input, Handle<String> type_name); 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Emits optimized code for %_IsObject(x). Preserves input register. 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Returns the condition on which a final split to 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // true and false label should be made, to optimize fallthrough. 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Condition EmitIsObject(Register input, 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register temp1, 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Register temp2, 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label* is_not_object, 261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label* is_object); 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Emits optimized code for %_IsConstructCall(). 2641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Caller should branch on equal condition. 2651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void EmitIsConstructCall(Register temp1, Register temp2); 2661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void EmitLoadField(Register result, 26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Register object, 26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Map> type, 27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name); 27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LChunk* const chunk_; 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MacroAssembler* const masm_; 274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CompilationInfo* const info_; 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int current_block_; 277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int current_instruction_; 278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const ZoneList<LInstruction*>* instructions_; 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<LEnvironment*> deoptimizations_; 280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<Handle<Object> > deoptimization_literals_; 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int inlined_function_count_; 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Scope* const scope_; 283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Status status_; 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranslationBuffer translations_; 285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<LDeferredCode*> deferred_; 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int osr_pc_offset_; 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Builder that keeps track of safepoints in the code. The table 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // itself is emitted at the end of the generated code. 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SafepointTableBuilder safepoints_; 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Compiler from a set of parallel moves to a sequential list of moves. 293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch LGapResolver resolver_; 294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class LDeferredCode; 296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class LEnvironment; 297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class SafepointGenerator; 298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DISALLOW_COPY_AND_ASSIGN(LCodeGen); 299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LDeferredCode: public ZoneObject { 303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit LDeferredCode(LCodeGen* codegen) 305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : codegen_(codegen), external_exit_(NULL) { 306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch codegen->AddDeferredCode(this); 307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~LDeferredCode() { } 310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void Generate() = 0; 311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetExit(Label *exit) { external_exit_ = exit; } 313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label* entry() { return &entry_; } 314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; } 315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LCodeGen* codegen() const { return codegen_; } 318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MacroAssembler* masm() const { return codegen_->masm(); } 319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch LCodeGen* codegen_; 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label entry_; 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label exit_; 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Label* external_exit_; 325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // V8_ARM_LITHIUM_CODEGEN_ARM_H_ 330