v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
lithium.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_LITHIUM_H_
29 #define V8_LITHIUM_H_
30 
31 #include "allocation.h"
32 #include "hydrogen.h"
33 #include "safepoint-table.h"
34 
35 namespace v8 {
36 namespace internal {
37 
38 #define LITHIUM_OPERAND_LIST(V) \
39  V(ConstantOperand, CONSTANT_OPERAND) \
40  V(StackSlot, STACK_SLOT) \
41  V(DoubleStackSlot, DOUBLE_STACK_SLOT) \
42  V(Register, REGISTER) \
43  V(DoubleRegister, DOUBLE_REGISTER)
44 
45 
46 class LOperand: public ZoneObject {
47  public:
48  enum Kind {
57  };
58 
59  LOperand() : value_(KindField::encode(INVALID)) { }
60 
61  Kind kind() const { return KindField::decode(value_); }
62  int index() const { return static_cast<int>(value_) >> kKindFieldWidth; }
63 #define LITHIUM_OPERAND_PREDICATE(name, type) \
64  bool Is##name() const { return kind() == type; }
69 #undef LITHIUM_OPERAND_PREDICATE
70  bool Equals(LOperand* other) const { return value_ == other->value_; }
71 
72  void PrintTo(StringStream* stream);
73  void ConvertTo(Kind kind, int index) {
74  value_ = KindField::encode(kind);
75  value_ |= index << kKindFieldWidth;
76  ASSERT(this->index() == index);
77  }
78 
79  // Calls SetUpCache()/TearDownCache() for each subclass.
80  static void SetUpCaches();
81  static void TearDownCaches();
82 
83  protected:
84  static const int kKindFieldWidth = 3;
85  class KindField : public BitField<Kind, 0, kKindFieldWidth> { };
86 
87  LOperand(Kind kind, int index) { ConvertTo(kind, index); }
88 
89  unsigned value_;
90 };
91 
92 
93 class LUnallocated: public LOperand {
94  public:
95  enum Policy {
97  ANY,
104  };
105 
106  // Lifetime of operand inside the instruction.
107  enum Lifetime {
108  // USED_AT_START operand is guaranteed to be live only at
109  // instruction start. Register allocator is free to assign the same register
110  // to some other operand used inside instruction (i.e. temporary or
111  // output).
113 
114  // USED_AT_END operand is treated as live until the end of
115  // instruction. This means that register allocator will not reuse it's
116  // register for any other operand inside instruction.
118  };
119 
121  Initialize(policy, 0, USED_AT_END);
122  }
123 
125  Initialize(policy, fixed_index, USED_AT_END);
126  }
127 
129  Initialize(policy, 0, lifetime);
130  }
131 
132  // The superclass has a KindField. Some policies have a signed fixed
133  // index in the upper bits.
134  static const int kPolicyWidth = 3;
135  static const int kLifetimeWidth = 1;
136  static const int kVirtualRegisterWidth = 18;
137 
138  static const int kPolicyShift = kKindFieldWidth;
141  static const int kFixedIndexShift =
143 
144  class PolicyField : public BitField<Policy, kPolicyShift, kPolicyWidth> { };
145 
147  : public BitField<Lifetime, kLifetimeShift, kLifetimeWidth> {
148  };
149 
151  : public BitField<unsigned,
152  kVirtualRegisterShift,
153  kVirtualRegisterWidth> {
154  };
155 
157  static const int kMaxFixedIndex = 63;
158  static const int kMinFixedIndex = -64;
159 
160  bool HasAnyPolicy() const {
161  return policy() == ANY;
162  }
163  bool HasFixedPolicy() const {
164  return policy() == FIXED_REGISTER ||
166  policy() == FIXED_SLOT;
167  }
168  bool HasRegisterPolicy() const {
170  }
171  bool HasSameAsInputPolicy() const {
172  return policy() == SAME_AS_FIRST_INPUT;
173  }
176  value_ = PolicyField::update(value_, policy);
177  }
178  int fixed_index() const {
179  return static_cast<int>(value_) >> kFixedIndexShift;
180  }
181 
182  int virtual_register() const {
184  }
185 
186  void set_virtual_register(unsigned id) {
188  }
189 
191  LUnallocated* result = new(zone) LUnallocated(ANY);
193  return result;
194  }
195 
196  static LUnallocated* cast(LOperand* op) {
197  ASSERT(op->IsUnallocated());
198  return reinterpret_cast<LUnallocated*>(op);
199  }
200 
201  bool IsUsedAtStart() {
203  }
204 
205  private:
206  void Initialize(Policy policy, int fixed_index, Lifetime lifetime) {
207  value_ |= PolicyField::encode(policy);
208  value_ |= LifetimeField::encode(lifetime);
209  value_ |= fixed_index << kFixedIndexShift;
210  ASSERT(this->fixed_index() == fixed_index);
211  }
212 };
213 
214 
215 class LMoveOperands BASE_EMBEDDED {
216  public:
217  LMoveOperands(LOperand* source, LOperand* destination)
218  : source_(source), destination_(destination) {
219  }
220 
221  LOperand* source() const { return source_; }
222  void set_source(LOperand* operand) { source_ = operand; }
223 
224  LOperand* destination() const { return destination_; }
225  void set_destination(LOperand* operand) { destination_ = operand; }
226 
227  // The gap resolver marks moves as "in-progress" by clearing the
228  // destination (but not the source).
229  bool IsPending() const {
230  return destination_ == NULL && source_ != NULL;
231  }
232 
233  // True if this move a move into the given destination operand.
234  bool Blocks(LOperand* operand) const {
235  return !IsEliminated() && source()->Equals(operand);
236  }
237 
238  // A move is redundant if it's been eliminated, if its source and
239  // destination are the same, or if its destination is unneeded.
240  bool IsRedundant() const {
241  return IsEliminated() || source_->Equals(destination_) || IsIgnored();
242  }
243 
244  bool IsIgnored() const {
245  return destination_ != NULL && destination_->IsIgnored();
246  }
247 
248  // We clear both operands to indicate move that's been eliminated.
249  void Eliminate() { source_ = destination_ = NULL; }
250  bool IsEliminated() const {
251  ASSERT(source_ != NULL || destination_ == NULL);
252  return source_ == NULL;
253  }
254 
255  private:
256  LOperand* source_;
257  LOperand* destination_;
258 };
259 
260 
261 class LConstantOperand: public LOperand {
262  public:
263  static LConstantOperand* Create(int index, Zone* zone) {
264  ASSERT(index >= 0);
265  if (index < kNumCachedOperands) return &cache[index];
266  return new(zone) LConstantOperand(index);
267  }
268 
270  ASSERT(op->IsConstantOperand());
271  return reinterpret_cast<LConstantOperand*>(op);
272  }
273 
274  static void SetUpCache();
275  static void TearDownCache();
276 
277  private:
278  static const int kNumCachedOperands = 128;
279  static LConstantOperand* cache;
280 
281  LConstantOperand() : LOperand() { }
282  explicit LConstantOperand(int index) : LOperand(CONSTANT_OPERAND, index) { }
283 };
284 
285 
286 class LArgument: public LOperand {
287  public:
288  explicit LArgument(int index) : LOperand(ARGUMENT, index) { }
289 
290  static LArgument* cast(LOperand* op) {
291  ASSERT(op->IsArgument());
292  return reinterpret_cast<LArgument*>(op);
293  }
294 };
295 
296 
297 class LStackSlot: public LOperand {
298  public:
299  static LStackSlot* Create(int index, Zone* zone) {
300  ASSERT(index >= 0);
301  if (index < kNumCachedOperands) return &cache[index];
302  return new(zone) LStackSlot(index);
303  }
304 
305  static LStackSlot* cast(LOperand* op) {
306  ASSERT(op->IsStackSlot());
307  return reinterpret_cast<LStackSlot*>(op);
308  }
309 
310  static void SetUpCache();
311  static void TearDownCache();
312 
313  private:
314  static const int kNumCachedOperands = 128;
315  static LStackSlot* cache;
316 
317  LStackSlot() : LOperand() { }
318  explicit LStackSlot(int index) : LOperand(STACK_SLOT, index) { }
319 };
320 
321 
322 class LDoubleStackSlot: public LOperand {
323  public:
324  static LDoubleStackSlot* Create(int index, Zone* zone) {
325  ASSERT(index >= 0);
326  if (index < kNumCachedOperands) return &cache[index];
327  return new(zone) LDoubleStackSlot(index);
328  }
329 
331  ASSERT(op->IsStackSlot());
332  return reinterpret_cast<LDoubleStackSlot*>(op);
333  }
334 
335  static void SetUpCache();
336  static void TearDownCache();
337 
338  private:
339  static const int kNumCachedOperands = 128;
340  static LDoubleStackSlot* cache;
341 
342  LDoubleStackSlot() : LOperand() { }
343  explicit LDoubleStackSlot(int index) : LOperand(DOUBLE_STACK_SLOT, index) { }
344 };
345 
346 
347 class LRegister: public LOperand {
348  public:
349  static LRegister* Create(int index, Zone* zone) {
350  ASSERT(index >= 0);
351  if (index < kNumCachedOperands) return &cache[index];
352  return new(zone) LRegister(index);
353  }
354 
355  static LRegister* cast(LOperand* op) {
356  ASSERT(op->IsRegister());
357  return reinterpret_cast<LRegister*>(op);
358  }
359 
360  static void SetUpCache();
361  static void TearDownCache();
362 
363  private:
364  static const int kNumCachedOperands = 16;
365  static LRegister* cache;
366 
367  LRegister() : LOperand() { }
368  explicit LRegister(int index) : LOperand(REGISTER, index) { }
369 };
370 
371 
372 class LDoubleRegister: public LOperand {
373  public:
374  static LDoubleRegister* Create(int index, Zone* zone) {
375  ASSERT(index >= 0);
376  if (index < kNumCachedOperands) return &cache[index];
377  return new(zone) LDoubleRegister(index);
378  }
379 
381  ASSERT(op->IsDoubleRegister());
382  return reinterpret_cast<LDoubleRegister*>(op);
383  }
384 
385  static void SetUpCache();
386  static void TearDownCache();
387 
388  private:
389  static const int kNumCachedOperands = 16;
390  static LDoubleRegister* cache;
391 
392  LDoubleRegister() : LOperand() { }
393  explicit LDoubleRegister(int index) : LOperand(DOUBLE_REGISTER, index) { }
394 };
395 
396 
397 class LParallelMove : public ZoneObject {
398  public:
399  explicit LParallelMove(Zone* zone) : move_operands_(4, zone) { }
400 
401  void AddMove(LOperand* from, LOperand* to, Zone* zone) {
402  move_operands_.Add(LMoveOperands(from, to), zone);
403  }
404 
405  bool IsRedundant() const;
406 
408  return &move_operands_;
409  }
410 
411  void PrintDataTo(StringStream* stream) const;
412 
413  private:
414  ZoneList<LMoveOperands> move_operands_;
415 };
416 
417 
418 class LPointerMap: public ZoneObject {
419  public:
420  explicit LPointerMap(int position, Zone* zone)
421  : pointer_operands_(8, zone),
422  untagged_operands_(0, zone),
423  position_(position),
424  lithium_position_(-1) { }
425 
427  for (int i = 0; i < untagged_operands_.length(); ++i) {
428  RemovePointer(untagged_operands_[i]);
429  }
430  untagged_operands_.Clear();
431  return &pointer_operands_;
432  }
433  int position() const { return position_; }
434  int lithium_position() const { return lithium_position_; }
435 
436  void set_lithium_position(int pos) {
437  ASSERT(lithium_position_ == -1);
438  lithium_position_ = pos;
439  }
440 
441  void RecordPointer(LOperand* op, Zone* zone);
442  void RemovePointer(LOperand* op);
443  void RecordUntagged(LOperand* op, Zone* zone);
444  void PrintTo(StringStream* stream);
445 
446  private:
447  ZoneList<LOperand*> pointer_operands_;
448  ZoneList<LOperand*> untagged_operands_;
449  int position_;
450  int lithium_position_;
451 };
452 
453 
454 class LEnvironment: public ZoneObject {
455  public:
458  int ast_id,
459  int parameter_count,
460  int argument_count,
461  int value_count,
463  Zone* zone)
464  : closure_(closure),
465  frame_type_(frame_type),
466  arguments_stack_height_(argument_count),
467  deoptimization_index_(Safepoint::kNoDeoptimizationIndex),
468  translation_index_(-1),
469  ast_id_(ast_id),
470  parameter_count_(parameter_count),
471  pc_offset_(-1),
472  values_(value_count, zone),
473  is_tagged_(value_count, closure->GetHeap()->isolate()->zone()),
474  spilled_registers_(NULL),
475  spilled_double_registers_(NULL),
476  outer_(outer),
477  zone_(zone) { }
478 
479  Handle<JSFunction> closure() const { return closure_; }
480  FrameType frame_type() const { return frame_type_; }
481  int arguments_stack_height() const { return arguments_stack_height_; }
482  int deoptimization_index() const { return deoptimization_index_; }
483  int translation_index() const { return translation_index_; }
484  int ast_id() const { return ast_id_; }
485  int parameter_count() const { return parameter_count_; }
486  int pc_offset() const { return pc_offset_; }
487  LOperand** spilled_registers() const { return spilled_registers_; }
489  return spilled_double_registers_;
490  }
491  const ZoneList<LOperand*>* values() const { return &values_; }
492  LEnvironment* outer() const { return outer_; }
493 
494  void AddValue(LOperand* operand, Representation representation) {
495  values_.Add(operand, zone());
496  if (representation.IsTagged()) {
497  is_tagged_.Add(values_.length() - 1);
498  }
499  }
500 
501  bool HasTaggedValueAt(int index) const {
502  return is_tagged_.Contains(index);
503  }
504 
506  int translation_index,
507  int pc_offset) {
509  deoptimization_index_ = deoptimization_index;
510  translation_index_ = translation_index;
511  pc_offset_ = pc_offset;
512  }
513  bool HasBeenRegistered() const {
514  return deoptimization_index_ != Safepoint::kNoDeoptimizationIndex;
515  }
516 
517  void SetSpilledRegisters(LOperand** registers,
518  LOperand** double_registers) {
519  spilled_registers_ = registers;
520  spilled_double_registers_ = double_registers;
521  }
522 
523  void PrintTo(StringStream* stream);
524 
525  Zone* zone() const { return zone_; }
526 
527  private:
528  Handle<JSFunction> closure_;
529  FrameType frame_type_;
530  int arguments_stack_height_;
531  int deoptimization_index_;
532  int translation_index_;
533  int ast_id_;
534  int parameter_count_;
535  int pc_offset_;
536  ZoneList<LOperand*> values_;
537  BitVector is_tagged_;
538 
539  // Allocation index indexed arrays of spill slot operands for registers
540  // that are also in spill slots at an OSR entry. NULL for environments
541  // that do not correspond to an OSR entry.
542  LOperand** spilled_registers_;
543  LOperand** spilled_double_registers_;
544 
545  LEnvironment* outer_;
546 
547  Zone* zone_;
548 };
549 
550 
551 // Iterates over the non-null, non-constant operands in an environment.
552 class ShallowIterator BASE_EMBEDDED {
553  public:
555  : env_(env),
556  limit_(env != NULL ? env->values()->length() : 0),
557  current_(0) {
558  SkipUninteresting();
559  }
560 
561  bool Done() { return current_ >= limit_; }
562 
564  ASSERT(!Done());
565  return env_->values()->at(current_);
566  }
567 
568  void Advance() {
569  ASSERT(!Done());
570  ++current_;
571  SkipUninteresting();
572  }
573 
574  LEnvironment* env() { return env_; }
575 
576  private:
577  bool ShouldSkip(LOperand* op) {
578  return op == NULL || op->IsConstantOperand() || op->IsArgument();
579  }
580 
581  // Skip until something interesting, beginning with and including current_.
582  void SkipUninteresting() {
583  while (current_ < limit_ && ShouldSkip(env_->values()->at(current_))) {
584  ++current_;
585  }
586  }
587 
588  LEnvironment* env_;
589  int limit_;
590  int current_;
591 };
592 
593 
594 // Iterator for non-null, non-constant operands incl. outer environments.
595 class DeepIterator BASE_EMBEDDED {
596  public:
597  explicit DeepIterator(LEnvironment* env)
598  : current_iterator_(env) {
599  SkipUninteresting();
600  }
601 
602  bool Done() { return current_iterator_.Done(); }
603 
605  ASSERT(!current_iterator_.Done());
606  return current_iterator_.Current();
607  }
608 
609  void Advance() {
610  current_iterator_.Advance();
611  SkipUninteresting();
612  }
613 
614  private:
615  void SkipUninteresting() {
616  while (current_iterator_.env() != NULL && current_iterator_.Done()) {
617  current_iterator_ = ShallowIterator(current_iterator_.env()->outer());
618  }
619  }
620 
621  ShallowIterator current_iterator_;
622 };
623 
624 
625 int ElementsKindToShiftSize(ElementsKind elements_kind);
626 
627 
628 } } // namespace v8::internal
629 
630 #endif // V8_LITHIUM_H_
static const int kFixedIndexShift
Definition: lithium.h:141
int index() const
Definition: lithium.h:62
static LUnallocated * cast(LOperand *op)
Definition: lithium.h:196
bool IsPending() const
Definition: lithium.h:229
const ZoneList< LMoveOperands > * move_operands() const
Definition: lithium.h:407
static LArgument * cast(LOperand *op)
Definition: lithium.h:290
static LConstantOperand * Create(int index, Zone *zone)
Definition: lithium.h:263
bool IsRedundant() const
Definition: lithium.h:240
void SetSpilledRegisters(LOperand **registers, LOperand **double_registers)
Definition: lithium.h:517
DeepIterator(LEnvironment *env)
Definition: lithium.h:597
const ZoneList< LOperand * > * GetNormalizedOperands()
Definition: lithium.h:426
static LDoubleRegister * cast(LOperand *op)
Definition: lithium.h:380
static void TearDownCaches()
Definition: lithium.cc:122
int lithium_position() const
Definition: lithium.h:434
LUnallocated(Policy policy)
Definition: lithium.h:120
LParallelMove(Zone *zone)
Definition: lithium.h:399
LEnvironment * outer() const
Definition: lithium.h:492
static const int kVirtualRegisterWidth
Definition: lithium.h:136
LEnvironment(Handle< JSFunction > closure, FrameType frame_type, int ast_id, int parameter_count, int argument_count, int value_count, LEnvironment *outer, Zone *zone)
Definition: lithium.h:456
LOperand(Kind kind, int index)
Definition: lithium.h:87
int current_
static const int kPolicyShift
Definition: lithium.h:138
void RemovePointer(LOperand *op)
Definition: lithium.cc:182
LUnallocated * CopyUnconstrained(Zone *zone)
Definition: lithium.h:190
#define ASSERT(condition)
Definition: checks.h:270
bool HasSameAsInputPolicy() const
Definition: lithium.h:171
static void SetUpCaches()
Definition: lithium.cc:115
bool HasRegisterPolicy() const
Definition: lithium.h:168
static LDoubleRegister * Create(int index, Zone *zone)
Definition: lithium.h:374
void PrintTo(StringStream *stream)
Definition: lithium.cc:203
static uint32_t update(uint32_t previous, Policyvalue)
Definition: utils.h:267
int position() const
Definition: lithium.h:433
bool Equals(LOperand *other) const
Definition: lithium.h:70
bool HasBeenRegistered() const
Definition: lithium.h:513
void RecordUntagged(LOperand *op, Zone *zone)
Definition: lithium.cc:195
int translation_index() const
Definition: lithium.h:483
LOperand * destination() const
Definition: lithium.h:224
bool Contains(int i) const
Definition: data-flow.h:122
void set_virtual_register(unsigned id)
Definition: lithium.h:186
static void TearDownCache()
#define LITHIUM_OPERAND_PREDICATE(name, type)
Definition: lithium.h:63
int virtual_register() const
Definition: lithium.h:182
static void SetUpCache()
void PrintTo(StringStream *stream)
Definition: lithium.cc:158
static const int kMaxVirtualRegisters
Definition: lithium.h:156
void set_source(LOperand *operand)
Definition: lithium.h:222
void ConvertTo(Kind kind, int index)
Definition: lithium.h:73
Policy policy() const
Definition: lithium.h:174
LMoveOperands(LOperand *source, LOperand *destination)
Definition: lithium.h:217
void AddMove(LOperand *from, LOperand *to, Zone *zone)
Definition: lithium.h:401
static const int kLifetimeWidth
Definition: lithium.h:135
static LDoubleStackSlot * Create(int index, Zone *zone)
Definition: lithium.h:324
void RecordPointer(LOperand *op, Zone *zone)
Definition: lithium.cc:174
const ZoneList< LOperand * > * values() const
Definition: lithium.h:491
static LConstantOperand * cast(LOperand *op)
Definition: lithium.h:269
Kind kind() const
Definition: lithium.h:61
bool IsRedundant() const
Definition: lithium.cc:129
bool Blocks(LOperand *operand) const
Definition: lithium.h:234
Handle< JSFunction > closure() const
Definition: lithium.h:479
static const int kPolicyWidth
Definition: lithium.h:134
static Kind decode(uint32_t value)
Definition: utils.h:272
LEnvironment * env()
Definition: lithium.h:574
static const int kVirtualRegisterShift
Definition: lithium.h:140
LArgument(int index)
Definition: lithium.h:288
bool IsIgnored() const
Definition: lithium.h:244
#define BASE_EMBEDDED
Definition: allocation.h:68
Zone * zone() const
Definition: lithium.h:525
void AddValue(LOperand *operand, Representation representation)
Definition: lithium.h:494
LPointerMap(int position, Zone *zone)
Definition: lithium.h:420
int ElementsKindToShiftSize(ElementsKind elements_kind)
Definition: lithium.cc:213
int deoptimization_index() const
Definition: lithium.h:482
static LStackSlot * Create(int index, Zone *zone)
Definition: lithium.h:299
LOperand ** spilled_double_registers() const
Definition: lithium.h:488
static const int kMaxFixedIndex
Definition: lithium.h:157
static LDoubleStackSlot * cast(LOperand *op)
Definition: lithium.h:330
int parameter_count() const
Definition: lithium.h:485
ShallowIterator(LEnvironment *env)
Definition: lithium.h:554
static const int kLifetimeShift
Definition: lithium.h:139
bool HasTaggedValueAt(int index) const
Definition: lithium.h:501
void PrintDataTo(StringStream *stream) const
Definition: lithium.cc:137
LOperand ** spilled_registers() const
Definition: lithium.h:487
int fixed_index() const
Definition: lithium.h:178
int pc_offset() const
Definition: lithium.h:486
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
Definition: flags.cc:274
void set_policy(Policy policy)
Definition: lithium.h:175
bool HasFixedPolicy() const
Definition: lithium.h:163
LOperand * source() const
Definition: lithium.h:221
static LRegister * Create(int index, Zone *zone)
Definition: lithium.h:349
bool IsEliminated() const
Definition: lithium.h:250
void Add(const T &element, AllocationPolicy allocator=AllocationPolicy())
Definition: list-inl.h:38
void Register(int deoptimization_index, int translation_index, int pc_offset)
Definition: lithium.h:505
bool HasAnyPolicy() const
Definition: lithium.h:160
FrameType frame_type() const
Definition: lithium.h:480
static LStackSlot * cast(LOperand *op)
Definition: lithium.h:305
static const int kMinFixedIndex
Definition: lithium.h:158
LUnallocated(Policy policy, int fixed_index)
Definition: lithium.h:124
LUnallocated(Policy policy, Lifetime lifetime)
Definition: lithium.h:128
static void SetUpCache()
#define LITHIUM_OPERAND_LIST(V)
Definition: lithium.h:38
void set_lithium_position(int pos)
Definition: lithium.h:436
void set_destination(LOperand *operand)
Definition: lithium.h:225
static LRegister * cast(LOperand *op)
Definition: lithium.h:355
static void TearDownCache()
void PrintTo(StringStream *stream)
Definition: lithium.cc:35
int arguments_stack_height() const
Definition: lithium.h:481
static const int kKindFieldWidth
Definition: lithium.h:84