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