v8  3.25.30(node0.11.13)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
lithium-codegen-arm.h
Go to the documentation of this file.
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_ARM_LITHIUM_CODEGEN_ARM_H_
29 #define V8_ARM_LITHIUM_CODEGEN_ARM_H_
30 
31 #include "arm/lithium-arm.h"
32 
34 #include "deoptimizer.h"
35 #include "lithium-codegen.h"
36 #include "safepoint-table.h"
37 #include "scopes.h"
38 #include "v8utils.h"
39 
40 namespace v8 {
41 namespace internal {
42 
43 // Forward declarations.
44 class LDeferredCode;
45 class SafepointGenerator;
46 
47 class LCodeGen: public LCodeGenBase {
48  public:
50  : LCodeGenBase(chunk, assembler, info),
51  deoptimizations_(4, info->zone()),
52  deopt_jump_table_(4, info->zone()),
53  deoptimization_literals_(8, info->zone()),
54  inlined_function_count_(0),
55  scope_(info->scope()),
56  translations_(info->zone()),
57  deferred_(8, info->zone()),
58  osr_pc_offset_(-1),
59  frame_is_built_(false),
60  safepoints_(info->zone()),
61  resolver_(this),
62  expected_safepoint_kind_(Safepoint::kSimple) {
63  PopulateDeoptimizationLiteralsWithInlinedFunctions();
64  }
65 
66 
67  int LookupDestination(int block_id) const {
68  return chunk()->LookupDestination(block_id);
69  }
70 
71  bool IsNextEmittedBlock(int block_id) const {
72  return LookupDestination(block_id) == GetNextEmittedBlock();
73  }
74 
75  bool NeedsEagerFrame() const {
76  return GetStackSlotCount() > 0 ||
77  info()->is_non_deferred_calling() ||
78  !info()->IsStub() ||
79  info()->requires_frame();
80  }
81  bool NeedsDeferredFrame() const {
82  return !NeedsEagerFrame() && info()->is_deferred_calling();
83  }
84 
86  return frame_is_built_ ? kLRHasBeenSaved : kLRHasNotBeenSaved;
87  }
88 
89  // Support for converting LOperands to assembler types.
90  // LOperand must be a register.
91  Register ToRegister(LOperand* op) const;
92 
93  // LOperand is loaded into scratch, unless already a register.
95 
96  // LOperand must be a double register.
98 
99  // LOperand is loaded into dbl_scratch, unless already a double register.
101  SwVfpRegister flt_scratch,
102  DwVfpRegister dbl_scratch);
103  int32_t ToRepresentation(LConstantOperand* op, const Representation& r) const;
104  int32_t ToInteger32(LConstantOperand* op) const;
105  Smi* ToSmi(LConstantOperand* op) const;
106  double ToDouble(LConstantOperand* op) const;
108  MemOperand ToMemOperand(LOperand* op) const;
109  // Returns a MemOperand pointing to the high word of a DoubleStackSlot.
111 
112  bool IsInteger32(LConstantOperand* op) const;
113  bool IsSmi(LConstantOperand* op) const;
114  Handle<Object> ToHandle(LConstantOperand* op) const;
115 
116  // Try to generate code for the entire chunk, but it may fail if the
117  // chunk contains constructs we cannot handle. Returns true if the
118  // code generation attempt succeeded.
119  bool GenerateCode();
120 
121  // Finish the code by setting stack height, safepoint, and bailout
122  // information on it.
124 
125  // Deferred code support.
126  void DoDeferredNumberTagD(LNumberTagD* instr);
127 
130  LOperand* value,
131  LOperand* temp1,
132  LOperand* temp2,
133  IntegerSignedness signedness);
134 
135  void DoDeferredTaggedToI(LTaggedToI* instr);
136  void DoDeferredMathAbsTaggedHeapNumber(LMathAbs* instr);
137  void DoDeferredStackCheck(LStackCheck* instr);
138  void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
139  void DoDeferredStringCharFromCode(LStringCharFromCode* instr);
140  void DoDeferredAllocate(LAllocate* instr);
141  void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
142  Label* map_check);
143  void DoDeferredInstanceMigration(LCheckMaps* instr, Register object);
144 
145  // Parallel move support.
146  void DoParallelMove(LParallelMove* move);
147  void DoGap(LGap* instr);
148 
150  Register base,
151  bool key_is_constant,
152  int constant_key,
153  int element_size,
154  int shift_size,
155  int additional_index,
156  int additional_offset);
157 
158  // Emit frame translation commands for an environment.
159  void WriteTranslation(LEnvironment* environment, Translation* translation);
160 
161  // Declare methods that deal with the individual node types.
162 #define DECLARE_DO(type) void Do##type(L##type* node);
164 #undef DECLARE_DO
165 
166  private:
167  StrictMode strict_mode() const { return info()->strict_mode(); }
168 
169  Scope* scope() const { return scope_; }
170 
171  Register scratch0() { return r9; }
172  LowDwVfpRegister double_scratch0() { return kScratchDoubleReg; }
173 
174  LInstruction* GetNextInstruction();
175 
176  void EmitClassOfTest(Label* if_true,
177  Label* if_false,
178  Handle<String> class_name,
179  Register input,
180  Register temporary,
181  Register temporary2);
182 
183  int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
184 
185  void Abort(BailoutReason reason);
186 
187  void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
188 
189  void SaveCallerDoubles();
190  void RestoreCallerDoubles();
191 
192  // Code generation passes. Returns true if code generation should
193  // continue.
194  void GenerateBodyInstructionPre(LInstruction* instr) V8_OVERRIDE;
195  bool GeneratePrologue();
196  bool GenerateDeferredCode();
197  bool GenerateDeoptJumpTable();
198  bool GenerateSafepointTable();
199 
200  // Generates the custom OSR entrypoint and sets the osr_pc_offset.
201  void GenerateOsrPrologue();
202 
203  enum SafepointMode {
204  RECORD_SIMPLE_SAFEPOINT,
205  RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS
206  };
207 
208  void CallCode(
209  Handle<Code> code,
210  RelocInfo::Mode mode,
211  LInstruction* instr,
213 
214  void CallCodeGeneric(
215  Handle<Code> code,
216  RelocInfo::Mode mode,
217  LInstruction* instr,
218  SafepointMode safepoint_mode,
220 
221  void CallRuntime(const Runtime::Function* function,
222  int num_arguments,
223  LInstruction* instr,
224  SaveFPRegsMode save_doubles = kDontSaveFPRegs);
225 
226  void CallRuntime(Runtime::FunctionId id,
227  int num_arguments,
228  LInstruction* instr) {
229  const Runtime::Function* function = Runtime::FunctionForId(id);
230  CallRuntime(function, num_arguments, instr);
231  }
232 
233  void LoadContextFromDeferred(LOperand* context);
234  void CallRuntimeFromDeferred(Runtime::FunctionId id,
235  int argc,
236  LInstruction* instr,
237  LOperand* context);
238 
239  enum R1State {
240  R1_UNINITIALIZED,
241  R1_CONTAINS_TARGET
242  };
243 
244  // Generate a direct call to a known function. Expects the function
245  // to be in r1.
246  void CallKnownFunction(Handle<JSFunction> function,
248  int arity,
249  LInstruction* instr,
250  R1State r1_state);
251 
252  void RecordSafepointWithLazyDeopt(LInstruction* instr,
253  SafepointMode safepoint_mode);
254 
255  void RegisterEnvironmentForDeoptimization(LEnvironment* environment,
256  Safepoint::DeoptMode mode);
257  void DeoptimizeIf(Condition condition,
258  LEnvironment* environment,
259  Deoptimizer::BailoutType bailout_type);
260  void DeoptimizeIf(Condition condition, LEnvironment* environment);
261  void ApplyCheckIf(Condition condition, LBoundsCheck* check);
262 
263  void AddToTranslation(LEnvironment* environment,
264  Translation* translation,
265  LOperand* op,
266  bool is_tagged,
267  bool is_uint32,
268  int* object_index_pointer,
269  int* dematerialized_index_pointer);
270  void PopulateDeoptimizationData(Handle<Code> code);
271  int DefineDeoptimizationLiteral(Handle<Object> literal);
272 
273  void PopulateDeoptimizationLiteralsWithInlinedFunctions();
274 
275  Register ToRegister(int index) const;
276  DwVfpRegister ToDoubleRegister(int index) const;
277 
278  MemOperand BuildSeqStringOperand(Register string,
279  LOperand* index,
280  String::Encoding encoding);
281 
282  void EmitIntegerMathAbs(LMathAbs* instr);
283 
284  // Support for recording safepoint and position information.
285  void RecordSafepoint(LPointerMap* pointers,
286  Safepoint::Kind kind,
287  int arguments,
288  Safepoint::DeoptMode mode);
289  void RecordSafepoint(LPointerMap* pointers, Safepoint::DeoptMode mode);
290  void RecordSafepoint(Safepoint::DeoptMode mode);
291  void RecordSafepointWithRegisters(LPointerMap* pointers,
292  int arguments,
293  Safepoint::DeoptMode mode);
294  void RecordSafepointWithRegistersAndDoubles(LPointerMap* pointers,
295  int arguments,
296  Safepoint::DeoptMode mode);
297 
298  void RecordAndWritePosition(int position) V8_OVERRIDE;
299 
300  static Condition TokenToCondition(Token::Value op, bool is_unsigned);
301  void EmitGoto(int block);
302 
303  // EmitBranch expects to be the last instruction of a block.
304  template<class InstrType>
305  void EmitBranch(InstrType instr, Condition condition);
306  template<class InstrType>
307  void EmitFalseBranch(InstrType instr, Condition condition);
308  void EmitNumberUntagD(Register input,
309  DwVfpRegister result,
310  bool allow_undefined_as_nan,
311  bool deoptimize_on_minus_zero,
312  LEnvironment* env,
314 
315  // Emits optimized code for typeof x == "y". Modifies input register.
316  // Returns the condition on which a final split to
317  // true and false label should be made, to optimize fallthrough.
318  Condition EmitTypeofIs(Label* true_label,
319  Label* false_label,
320  Register input,
321  Handle<String> type_name);
322 
323  // Emits optimized code for %_IsObject(x). Preserves input register.
324  // Returns the condition on which a final split to
325  // true and false label should be made, to optimize fallthrough.
326  Condition EmitIsObject(Register input,
327  Register temp1,
328  Label* is_not_object,
329  Label* is_object);
330 
331  // Emits optimized code for %_IsString(x). Preserves input register.
332  // Returns the condition on which a final split to
333  // true and false label should be made, to optimize fallthrough.
334  Condition EmitIsString(Register input,
335  Register temp1,
336  Label* is_not_string,
337  SmiCheck check_needed);
338 
339  // Emits optimized code for %_IsConstructCall().
340  // Caller should branch on equal condition.
341  void EmitIsConstructCall(Register temp1, Register temp2);
342 
343  // Emits optimized code to deep-copy the contents of statically known
344  // object graphs (e.g. object literal boilerplate).
345  void EmitDeepCopy(Handle<JSObject> object,
346  Register result,
347  Register source,
348  int* offset,
350 
351  void EnsureSpaceForLazyDeopt(int space_needed) V8_OVERRIDE;
352  void DoLoadKeyedExternalArray(LLoadKeyed* instr);
353  void DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr);
354  void DoLoadKeyedFixedArray(LLoadKeyed* instr);
355  void DoStoreKeyedExternalArray(LStoreKeyed* instr);
356  void DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr);
357  void DoStoreKeyedFixedArray(LStoreKeyed* instr);
358 
359  ZoneList<LEnvironment*> deoptimizations_;
360  ZoneList<Deoptimizer::JumpTableEntry> deopt_jump_table_;
361  ZoneList<Handle<Object> > deoptimization_literals_;
362  int inlined_function_count_;
363  Scope* const scope_;
364  TranslationBuffer translations_;
365  ZoneList<LDeferredCode*> deferred_;
366  int osr_pc_offset_;
367  bool frame_is_built_;
368 
369  // Builder that keeps track of safepoints in the code. The table
370  // itself is emitted at the end of the generated code.
371  SafepointTableBuilder safepoints_;
372 
373  // Compiler from a set of parallel moves to a sequential list of moves.
374  LGapResolver resolver_;
375 
376  Safepoint::Kind expected_safepoint_kind_;
377 
378  class PushSafepointRegistersScope V8_FINAL BASE_EMBEDDED {
379  public:
380  PushSafepointRegistersScope(LCodeGen* codegen,
381  Safepoint::Kind kind)
382  : codegen_(codegen) {
383  ASSERT(codegen_->info()->is_calling());
384  ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple);
385  codegen_->expected_safepoint_kind_ = kind;
386 
387  switch (codegen_->expected_safepoint_kind_) {
388  case Safepoint::kWithRegisters:
389  codegen_->masm_->PushSafepointRegisters();
390  break;
391  case Safepoint::kWithRegistersAndDoubles:
392  codegen_->masm_->PushSafepointRegistersAndDoubles();
393  break;
394  default:
395  UNREACHABLE();
396  }
397  }
398 
399  ~PushSafepointRegistersScope() {
400  Safepoint::Kind kind = codegen_->expected_safepoint_kind_;
401  ASSERT((kind & Safepoint::kWithRegisters) != 0);
402  switch (kind) {
403  case Safepoint::kWithRegisters:
404  codegen_->masm_->PopSafepointRegisters();
405  break;
406  case Safepoint::kWithRegistersAndDoubles:
407  codegen_->masm_->PopSafepointRegistersAndDoubles();
408  break;
409  default:
410  UNREACHABLE();
411  }
412  codegen_->expected_safepoint_kind_ = Safepoint::kSimple;
413  }
414 
415  private:
416  LCodeGen* codegen_;
417  };
418 
419  friend class LDeferredCode;
420  friend class LEnvironment;
421  friend class SafepointGenerator;
423 };
424 
425 
426 class LDeferredCode : public ZoneObject {
427  public:
428  explicit LDeferredCode(LCodeGen* codegen)
429  : codegen_(codegen),
430  external_exit_(NULL),
431  instruction_index_(codegen->current_instruction_) {
432  codegen->AddDeferredCode(this);
433  }
434 
435  virtual ~LDeferredCode() {}
436  virtual void Generate() = 0;
437  virtual LInstruction* instr() = 0;
438 
439  void SetExit(Label* exit) { external_exit_ = exit; }
440  Label* entry() { return &entry_; }
441  Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; }
442  int instruction_index() const { return instruction_index_; }
443 
444  protected:
445  LCodeGen* codegen() const { return codegen_; }
446  MacroAssembler* masm() const { return codegen_->masm(); }
447 
448  private:
449  LCodeGen* codegen_;
450  Label entry_;
451  Label exit_;
452  Label* external_exit_;
453  int instruction_index_;
454 };
455 
456 } } // namespace v8::internal
457 
458 #endif // V8_ARM_LITHIUM_CODEGEN_ARM_H_
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter NULL
Definition: flags.cc:269
void FinishCode(Handle< Code > code)
MemOperand ToHighMemOperand(LOperand *op) const
void DoDeferredStringCharFromCode(LStringCharFromCode *instr)
void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal *instr, Label *map_check)
Smi * ToSmi(LConstantOperand *op) const
Register EmitLoadRegister(LOperand *op, Register scratch)
bool IsSmi(LConstantOperand *op) const
int int32_t
Definition: unicode.cc:47
static const Function * FunctionForId(FunctionId id)
Definition: runtime.cc:15154
void DoDeferredMathAbsTaggedHeapNumber(LMathAbs *instr)
#define ASSERT(condition)
Definition: checks.h:329
void DoDeferredStringCharCodeAt(LStringCharCodeAt *instr)
MacroAssembler * masm() const
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
Definition: lithium-arm.h:43
void DoDeferredStackCheck(LStackCheck *instr)
DwVfpRegister EmitLoadDoubleRegister(LOperand *op, SwVfpRegister flt_scratch, DwVfpRegister dbl_scratch)
int LookupDestination(int block_id) const
Operand ToOperand(LOperand *op)
#define UNREACHABLE()
Definition: checks.h:52
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function not JSFunction itself flushes the cache of optimized code for closures on every GC functions with arguments object maximum number of escape analysis fix point iterations allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms concurrent on stack replacement do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes number of stack frames inspected by the profiler percentage of ICs that must have type info to allow optimization extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long mode(MIPS only)") DEFINE_string(expose_natives_as
void DoDeferredNumberTagD(LNumberTagD *instr)
const Register r9
void check(i::Vector< const uint8_t > string)
#define kScratchDoubleReg
DwVfpRegister ToDoubleRegister(LOperand *op) const
void DoDeferredAllocate(LAllocate *instr)
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function not JSFunction itself flushes the cache of optimized code for closures on every GC functions with arguments object maximum number of escape analysis fix point iterations allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms concurrent on stack replacement do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes number of stack frames inspected by the profiler percentage of ICs that must have type info to allow optimization extra verbose compilation tracing generate extra code(assertions) for debugging") DEFINE_bool(code_comments
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: globals.h:359
int32_t ToInteger32(LConstantOperand *op) const
bool IsInteger32(LConstantOperand *op) const
Handle< Object > ToHandle(LConstantOperand *op) const
#define BASE_EMBEDDED
Definition: allocation.h:68
void DoDeferredInstanceMigration(LCheckMaps *instr, Register object)
void DoParallelMove(LParallelMove *move)
double ToDouble(LConstantOperand *op) const
bool NeedsDeferredFrame() const
#define V8_OVERRIDE
Definition: v8config.h:402
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function info
Definition: flags.cc:317
void WriteTranslation(LEnvironment *environment, Translation *translation)
virtual LInstruction * instr()=0
LinkRegisterStatus GetLinkRegisterState() const
int32_t ToRepresentation(LConstantOperand *op, const Representation &r) const
MemOperand PrepareKeyedOperand(Register key, Register base, bool key_is_constant, int constant_key, int element_size, int shift_size, int additional_index, int additional_offset)
kInstanceClassNameOffset kNeedsAccessCheckBit kRemovePrototypeBit kIsExpressionBit kAllowLazyCompilation kUsesArguments formal_parameter_count
Definition: objects-inl.h:5190
virtual void Generate()=0
Register ToRegister(LOperand *op) const
void DoDeferredTaggedToI(LTaggedToI *instr)
void DoDeferredNumberTagIU(LInstruction *instr, LOperand *value, LOperand *temp1, LOperand *temp2, IntegerSignedness signedness)
MemOperand ToMemOperand(LOperand *op) const
bool IsNextEmittedBlock(int block_id) const
LCodeGen(LChunk *chunk, MacroAssembler *assembler, CompilationInfo *info)
#define DECLARE_DO(type)