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
code-stubs-x64.h
Go to the documentation of this file.
1 // Copyright 2011 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_X64_CODE_STUBS_X64_H_
29 #define V8_X64_CODE_STUBS_X64_H_
30 
31 #include "ic-inl.h"
32 #include "type-info.h"
33 
34 namespace v8 {
35 namespace internal {
36 
37 
38 // Compute a transcendental math function natively, or call the
39 // TranscendentalCache runtime function.
40 class TranscendentalCacheStub: public CodeStub {
41  public:
42  enum ArgumentType {
43  TAGGED = 0,
45  };
46 
48  ArgumentType argument_type)
49  : type_(type), argument_type_(argument_type) {}
50  void Generate(MacroAssembler* masm);
51  static void GenerateOperation(MacroAssembler* masm,
53  private:
55  ArgumentType argument_type_;
56 
57  Major MajorKey() { return TranscendentalCache; }
58  int MinorKey() { return type_ | argument_type_; }
59  Runtime::FunctionId RuntimeFunction();
60 };
61 
62 
63 class StoreBufferOverflowStub: public CodeStub {
64  public:
66  : save_doubles_(save_fp) { }
67 
68  void Generate(MacroAssembler* masm);
69 
70  virtual bool IsPregenerated() { return true; }
72  virtual bool SometimesSetsUpAFrame() { return false; }
73 
74  private:
75  SaveFPRegsMode save_doubles_;
76 
77  Major MajorKey() { return StoreBufferOverflow; }
78  int MinorKey() { return (save_doubles_ == kSaveFPRegs) ? 1 : 0; }
79 };
80 
81 
82 // Flag that indicates how to generate code for the stub GenericBinaryOpStub.
85  NO_SMI_CODE_IN_STUB = 1 << 0 // Omit smi code in stub.
86 };
87 
88 
89 class UnaryOpStub: public CodeStub {
90  public:
92  UnaryOverwriteMode mode,
94  : op_(op),
95  mode_(mode),
96  operand_type_(operand_type) {
97  }
98 
99  private:
100  Token::Value op_;
101  UnaryOverwriteMode mode_;
102 
103  // Operand type information determined at runtime.
104  UnaryOpIC::TypeInfo operand_type_;
105 
106  virtual void PrintName(StringStream* stream);
107 
108  class ModeBits: public BitField<UnaryOverwriteMode, 0, 1> {};
109  class OpBits: public BitField<Token::Value, 1, 7> {};
110  class OperandTypeInfoBits: public BitField<UnaryOpIC::TypeInfo, 8, 3> {};
111 
112  Major MajorKey() { return UnaryOp; }
113  int MinorKey() {
114  return ModeBits::encode(mode_)
115  | OpBits::encode(op_)
116  | OperandTypeInfoBits::encode(operand_type_);
117  }
118 
119  // Note: A lot of the helper functions below will vanish when we use virtual
120  // function instead of switch more often.
121  void Generate(MacroAssembler* masm);
122 
123  void GenerateTypeTransition(MacroAssembler* masm);
124 
125  void GenerateSmiStub(MacroAssembler* masm);
126  void GenerateSmiStubSub(MacroAssembler* masm);
127  void GenerateSmiStubBitNot(MacroAssembler* masm);
128  void GenerateSmiCodeSub(MacroAssembler* masm,
129  Label* non_smi,
130  Label* slow,
131  Label::Distance non_smi_near = Label::kFar,
132  Label::Distance slow_near = Label::kFar);
133  void GenerateSmiCodeBitNot(MacroAssembler* masm,
134  Label* non_smi,
135  Label::Distance non_smi_near);
136 
137  void GenerateHeapNumberStub(MacroAssembler* masm);
138  void GenerateHeapNumberStubSub(MacroAssembler* masm);
139  void GenerateHeapNumberStubBitNot(MacroAssembler* masm);
140  void GenerateHeapNumberCodeSub(MacroAssembler* masm, Label* slow);
141  void GenerateHeapNumberCodeBitNot(MacroAssembler* masm, Label* slow);
142 
143  void GenerateGenericStub(MacroAssembler* masm);
144  void GenerateGenericStubSub(MacroAssembler* masm);
145  void GenerateGenericStubBitNot(MacroAssembler* masm);
146  void GenerateGenericCodeFallback(MacroAssembler* masm);
147 
148  virtual int GetCodeKind() { return Code::UNARY_OP_IC; }
149 
150  virtual InlineCacheState GetICState() {
151  return UnaryOpIC::ToState(operand_type_);
152  }
153 
154  virtual void FinishCode(Handle<Code> code) {
155  code->set_unary_op_type(operand_type_);
156  }
157 };
158 
159 
160 class BinaryOpStub: public CodeStub {
161  public:
163  : op_(op),
164  mode_(mode),
165  operands_type_(BinaryOpIC::UNINITIALIZED),
166  result_type_(BinaryOpIC::UNINITIALIZED) {
167  ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
168  }
169 
171  int key,
172  BinaryOpIC::TypeInfo operands_type,
174  : op_(OpBits::decode(key)),
175  mode_(ModeBits::decode(key)),
176  operands_type_(operands_type),
177  result_type_(result_type) { }
178 
179  private:
180  enum SmiCodeGenerateHeapNumberResults {
181  ALLOW_HEAPNUMBER_RESULTS,
182  NO_HEAPNUMBER_RESULTS
183  };
184 
185  Token::Value op_;
186  OverwriteMode mode_;
187 
188  // Operand type information determined at runtime.
189  BinaryOpIC::TypeInfo operands_type_;
190  BinaryOpIC::TypeInfo result_type_;
191 
192  virtual void PrintName(StringStream* stream);
193 
194  // Minor key encoding in 15 bits RRRTTTOOOOOOOMM.
195  class ModeBits: public BitField<OverwriteMode, 0, 2> {};
196  class OpBits: public BitField<Token::Value, 2, 7> {};
197  class OperandTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 9, 3> {};
198  class ResultTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 12, 3> {};
199 
200  Major MajorKey() { return BinaryOp; }
201  int MinorKey() {
202  return OpBits::encode(op_)
203  | ModeBits::encode(mode_)
204  | OperandTypeInfoBits::encode(operands_type_)
205  | ResultTypeInfoBits::encode(result_type_);
206  }
207 
208  void Generate(MacroAssembler* masm);
209  void GenerateGeneric(MacroAssembler* masm);
210  void GenerateSmiCode(MacroAssembler* masm,
211  Label* slow,
212  SmiCodeGenerateHeapNumberResults heapnumber_results);
213  void GenerateFloatingPointCode(MacroAssembler* masm,
214  Label* allocation_failure,
215  Label* non_numeric_failure);
216  void GenerateStringAddCode(MacroAssembler* masm);
217  void GenerateCallRuntimeCode(MacroAssembler* masm);
218  void GenerateLoadArguments(MacroAssembler* masm);
219  void GenerateReturn(MacroAssembler* masm);
220  void GenerateUninitializedStub(MacroAssembler* masm);
221  void GenerateSmiStub(MacroAssembler* masm);
222  void GenerateInt32Stub(MacroAssembler* masm);
223  void GenerateHeapNumberStub(MacroAssembler* masm);
224  void GenerateOddballStub(MacroAssembler* masm);
225  void GenerateStringStub(MacroAssembler* masm);
226  void GenerateBothStringStub(MacroAssembler* masm);
227  void GenerateGenericStub(MacroAssembler* masm);
228 
229  void GenerateHeapResultAllocation(MacroAssembler* masm, Label* alloc_failure);
230  void GenerateRegisterArgsPush(MacroAssembler* masm);
231  void GenerateTypeTransition(MacroAssembler* masm);
232  void GenerateTypeTransitionWithSavedArgs(MacroAssembler* masm);
233 
234  virtual int GetCodeKind() { return Code::BINARY_OP_IC; }
235 
236  virtual InlineCacheState GetICState() {
237  return BinaryOpIC::ToState(operands_type_);
238  }
239 
240  virtual void FinishCode(Handle<Code> code) {
241  code->set_binary_op_type(operands_type_);
242  code->set_binary_op_result_type(result_type_);
243  }
244 
245  friend class CodeGenerator;
246 };
247 
248 
249 class StringHelper : public AllStatic {
250  public:
251  // Generate code for copying characters using a simple loop. This should only
252  // be used in places where the number of characters is small and the
253  // additional setup and checking in GenerateCopyCharactersREP adds too much
254  // overhead. Copying of overlapping regions is not supported.
255  static void GenerateCopyCharacters(MacroAssembler* masm,
256  Register dest,
257  Register src,
258  Register count,
259  bool ascii);
260 
261  // Generate code for copying characters using the rep movs instruction.
262  // Copies rcx characters from rsi to rdi. Copying of overlapping regions is
263  // not supported.
264  static void GenerateCopyCharactersREP(MacroAssembler* masm,
265  Register dest, // Must be rdi.
266  Register src, // Must be rsi.
267  Register count, // Must be rcx.
268  bool ascii);
269 
270 
271  // Probe the symbol table for a two character string. If the string is
272  // not found by probing a jump to the label not_found is performed. This jump
273  // does not guarantee that the string is not in the symbol table. If the
274  // string is found the code falls through with the string in register rax.
275  static void GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
276  Register c1,
277  Register c2,
278  Register scratch1,
279  Register scratch2,
280  Register scratch3,
281  Register scratch4,
282  Label* not_found);
283 
284  // Generate string hash.
285  static void GenerateHashInit(MacroAssembler* masm,
286  Register hash,
287  Register character,
288  Register scratch);
289  static void GenerateHashAddCharacter(MacroAssembler* masm,
290  Register hash,
291  Register character,
292  Register scratch);
293  static void GenerateHashGetHash(MacroAssembler* masm,
294  Register hash,
295  Register scratch);
296 
297  private:
298  DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper);
299 };
300 
301 
302 // Flag that indicates how to generate code for the stub StringAddStub.
305  // Omit left string check in stub (left is definitely a string).
307  // Omit right string check in stub (right is definitely a string).
309  // Omit both string checks in stub.
312 };
313 
314 
315 class StringAddStub: public CodeStub {
316  public:
317  explicit StringAddStub(StringAddFlags flags) : flags_(flags) {}
318 
319  private:
320  Major MajorKey() { return StringAdd; }
321  int MinorKey() { return flags_; }
322 
323  void Generate(MacroAssembler* masm);
324 
325  void GenerateConvertArgument(MacroAssembler* masm,
326  int stack_offset,
327  Register arg,
328  Register scratch1,
329  Register scratch2,
330  Register scratch3,
331  Label* slow);
332 
333  const StringAddFlags flags_;
334 };
335 
336 
337 class SubStringStub: public CodeStub {
338  public:
340 
341  private:
342  Major MajorKey() { return SubString; }
343  int MinorKey() { return 0; }
344 
345  void Generate(MacroAssembler* masm);
346 };
347 
348 
349 class StringCompareStub: public CodeStub {
350  public:
352 
353  // Compares two flat ASCII strings and returns result in rax.
355  Register left,
356  Register right,
357  Register scratch1,
358  Register scratch2,
359  Register scratch3,
360  Register scratch4);
361 
362  // Compares two flat ASCII strings for equality and returns result
363  // in rax.
365  Register left,
366  Register right,
367  Register scratch1,
368  Register scratch2);
369 
370  private:
371  virtual Major MajorKey() { return StringCompare; }
372  virtual int MinorKey() { return 0; }
373  virtual void Generate(MacroAssembler* masm);
374 
375  static void GenerateAsciiCharsCompareLoop(
376  MacroAssembler* masm,
377  Register left,
378  Register right,
379  Register length,
380  Register scratch,
381  Label* chars_not_equal,
382  Label::Distance near_jump = Label::kFar);
383 };
384 
385 
386 class NumberToStringStub: public CodeStub {
387  public:
389 
390  // Generate code to do a lookup in the number string cache. If the number in
391  // the register object is found in the cache the generated code falls through
392  // with the result in the result register. The object and the result register
393  // can be the same. If the number is not found in the cache the code jumps to
394  // the label not_found with only the content of register object unchanged.
396  Register object,
397  Register result,
398  Register scratch1,
399  Register scratch2,
400  bool object_is_smi,
401  Label* not_found);
402 
403  private:
404  static void GenerateConvertHashCodeToIndex(MacroAssembler* masm,
405  Register hash,
406  Register mask);
407 
408  Major MajorKey() { return NumberToString; }
409  int MinorKey() { return 0; }
410 
411  void Generate(MacroAssembler* masm);
412 };
413 
414 
415 class StringDictionaryLookupStub: public CodeStub {
416  public:
418 
420  Register result,
421  Register index,
422  LookupMode mode)
423  : dictionary_(dictionary), result_(result), index_(index), mode_(mode) { }
424 
425  void Generate(MacroAssembler* masm);
426 
427  static void GenerateNegativeLookup(MacroAssembler* masm,
428  Label* miss,
429  Label* done,
430  Register properties,
432  Register r0);
433 
434  static void GeneratePositiveLookup(MacroAssembler* masm,
435  Label* miss,
436  Label* done,
437  Register elements,
438  Register name,
439  Register r0,
440  Register r1);
441 
442  virtual bool SometimesSetsUpAFrame() { return false; }
443 
444  private:
445  static const int kInlinedProbes = 4;
446  static const int kTotalProbes = 20;
447 
448  static const int kCapacityOffset =
451 
452  static const int kElementsStartOffset =
455 
456  Major MajorKey() { return StringDictionaryLookup; }
457 
458  int MinorKey() {
459  return DictionaryBits::encode(dictionary_.code()) |
460  ResultBits::encode(result_.code()) |
461  IndexBits::encode(index_.code()) |
462  LookupModeBits::encode(mode_);
463  }
464 
465  class DictionaryBits: public BitField<int, 0, 4> {};
466  class ResultBits: public BitField<int, 4, 4> {};
467  class IndexBits: public BitField<int, 8, 4> {};
468  class LookupModeBits: public BitField<LookupMode, 12, 1> {};
469 
470  Register dictionary_;
471  Register result_;
472  Register index_;
473  LookupMode mode_;
474 };
475 
476 
477 class RecordWriteStub: public CodeStub {
478  public:
480  Register value,
481  Register address,
482  RememberedSetAction remembered_set_action,
483  SaveFPRegsMode fp_mode)
484  : object_(object),
485  value_(value),
486  address_(address),
487  remembered_set_action_(remembered_set_action),
488  save_fp_regs_mode_(fp_mode),
489  regs_(object, // An input reg.
490  address, // An input reg.
491  value) { // One scratch reg.
492  }
493 
494  enum Mode {
496  INCREMENTAL,
498  };
499 
500  virtual bool IsPregenerated();
501  static void GenerateFixedRegStubsAheadOfTime();
502  virtual bool SometimesSetsUpAFrame() { return false; }
503 
504  static const byte kTwoByteNopInstruction = 0x3c; // Cmpb al, #imm8.
505  static const byte kTwoByteJumpInstruction = 0xeb; // Jmp #imm8.
506 
507  static const byte kFiveByteNopInstruction = 0x3d; // Cmpl eax, #imm32.
508  static const byte kFiveByteJumpInstruction = 0xe9; // Jmp #imm32.
509 
510  static Mode GetMode(Code* stub) {
511  byte first_instruction = stub->instruction_start()[0];
512  byte second_instruction = stub->instruction_start()[2];
513 
514  if (first_instruction == kTwoByteJumpInstruction) {
515  return INCREMENTAL;
516  }
517 
518  ASSERT(first_instruction == kTwoByteNopInstruction);
519 
520  if (second_instruction == kFiveByteJumpInstruction) {
521  return INCREMENTAL_COMPACTION;
522  }
523 
524  ASSERT(second_instruction == kFiveByteNopInstruction);
525 
526  return STORE_BUFFER_ONLY;
527  }
528 
529  static void Patch(Code* stub, Mode mode) {
530  switch (mode) {
531  case STORE_BUFFER_ONLY:
532  ASSERT(GetMode(stub) == INCREMENTAL ||
536  break;
537  case INCREMENTAL:
538  ASSERT(GetMode(stub) == STORE_BUFFER_ONLY);
540  break;
542  ASSERT(GetMode(stub) == STORE_BUFFER_ONLY);
545  break;
546  }
547  ASSERT(GetMode(stub) == mode);
549  }
550 
551  private:
552  // This is a helper class for freeing up 3 scratch registers, where the third
553  // is always rcx (needed for shift operations). The input is two registers
554  // that must be preserved and one scratch register provided by the caller.
555  class RegisterAllocation {
556  public:
557  RegisterAllocation(Register object,
558  Register address,
559  Register scratch0)
560  : object_orig_(object),
561  address_orig_(address),
562  scratch0_orig_(scratch0),
563  object_(object),
564  address_(address),
565  scratch0_(scratch0) {
566  ASSERT(!AreAliased(scratch0, object, address, no_reg));
567  scratch1_ = GetRegThatIsNotRcxOr(object_, address_, scratch0_);
568  if (scratch0.is(rcx)) {
569  scratch0_ = GetRegThatIsNotRcxOr(object_, address_, scratch1_);
570  }
571  if (object.is(rcx)) {
572  object_ = GetRegThatIsNotRcxOr(address_, scratch0_, scratch1_);
573  }
574  if (address.is(rcx)) {
575  address_ = GetRegThatIsNotRcxOr(object_, scratch0_, scratch1_);
576  }
577  ASSERT(!AreAliased(scratch0_, object_, address_, rcx));
578  }
579 
580  void Save(MacroAssembler* masm) {
581  ASSERT(!address_orig_.is(object_));
582  ASSERT(object_.is(object_orig_) || address_.is(address_orig_));
583  ASSERT(!AreAliased(object_, address_, scratch1_, scratch0_));
584  ASSERT(!AreAliased(object_orig_, address_, scratch1_, scratch0_));
585  ASSERT(!AreAliased(object_, address_orig_, scratch1_, scratch0_));
586  // We don't have to save scratch0_orig_ because it was given to us as
587  // a scratch register. But if we had to switch to a different reg then
588  // we should save the new scratch0_.
589  if (!scratch0_.is(scratch0_orig_)) masm->push(scratch0_);
590  if (!rcx.is(scratch0_orig_) &&
591  !rcx.is(object_orig_) &&
592  !rcx.is(address_orig_)) {
593  masm->push(rcx);
594  }
595  masm->push(scratch1_);
596  if (!address_.is(address_orig_)) {
597  masm->push(address_);
598  masm->movq(address_, address_orig_);
599  }
600  if (!object_.is(object_orig_)) {
601  masm->push(object_);
602  masm->movq(object_, object_orig_);
603  }
604  }
605 
606  void Restore(MacroAssembler* masm) {
607  // These will have been preserved the entire time, so we just need to move
608  // them back. Only in one case is the orig_ reg different from the plain
609  // one, since only one of them can alias with rcx.
610  if (!object_.is(object_orig_)) {
611  masm->movq(object_orig_, object_);
612  masm->pop(object_);
613  }
614  if (!address_.is(address_orig_)) {
615  masm->movq(address_orig_, address_);
616  masm->pop(address_);
617  }
618  masm->pop(scratch1_);
619  if (!rcx.is(scratch0_orig_) &&
620  !rcx.is(object_orig_) &&
621  !rcx.is(address_orig_)) {
622  masm->pop(rcx);
623  }
624  if (!scratch0_.is(scratch0_orig_)) masm->pop(scratch0_);
625  }
626 
627  // If we have to call into C then we need to save and restore all caller-
628  // saved registers that were not already preserved.
629 
630  // The three scratch registers (incl. rcx) will be restored by other means
631  // so we don't bother pushing them here. Rbx, rbp and r12-15 are callee
632  // save and don't need to be preserved.
633  void SaveCallerSaveRegisters(MacroAssembler* masm, SaveFPRegsMode mode) {
634  masm->PushCallerSaved(mode, scratch0_, scratch1_, rcx);
635  }
636 
637  inline void RestoreCallerSaveRegisters(MacroAssembler*masm,
638  SaveFPRegsMode mode) {
639  masm->PopCallerSaved(mode, scratch0_, scratch1_, rcx);
640  }
641 
642  inline Register object() { return object_; }
643  inline Register address() { return address_; }
644  inline Register scratch0() { return scratch0_; }
645  inline Register scratch1() { return scratch1_; }
646 
647  private:
648  Register object_orig_;
649  Register address_orig_;
650  Register scratch0_orig_;
651  Register object_;
652  Register address_;
653  Register scratch0_;
654  Register scratch1_;
655  // Third scratch register is always rcx.
656 
657  Register GetRegThatIsNotRcxOr(Register r1,
658  Register r2,
659  Register r3) {
660  for (int i = 0; i < Register::kNumAllocatableRegisters; i++) {
661  Register candidate = Register::FromAllocationIndex(i);
662  if (candidate.is(rcx)) continue;
663  if (candidate.is(r1)) continue;
664  if (candidate.is(r2)) continue;
665  if (candidate.is(r3)) continue;
666  return candidate;
667  }
668  UNREACHABLE();
669  return no_reg;
670  }
671  friend class RecordWriteStub;
672  };
673 
674  enum OnNoNeedToInformIncrementalMarker {
675  kReturnOnNoNeedToInformIncrementalMarker,
676  kUpdateRememberedSetOnNoNeedToInformIncrementalMarker
677  };
678 
679  void Generate(MacroAssembler* masm);
680  void GenerateIncremental(MacroAssembler* masm, Mode mode);
681  void CheckNeedsToInformIncrementalMarker(
682  MacroAssembler* masm,
683  OnNoNeedToInformIncrementalMarker on_no_need,
684  Mode mode);
685  void InformIncrementalMarker(MacroAssembler* masm, Mode mode);
686 
687  Major MajorKey() { return RecordWrite; }
688 
689  int MinorKey() {
690  return ObjectBits::encode(object_.code()) |
691  ValueBits::encode(value_.code()) |
692  AddressBits::encode(address_.code()) |
693  RememberedSetActionBits::encode(remembered_set_action_) |
694  SaveFPRegsModeBits::encode(save_fp_regs_mode_);
695  }
696 
697  void Activate(Code* code) {
698  code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code);
699  }
700 
701  class ObjectBits: public BitField<int, 0, 4> {};
702  class ValueBits: public BitField<int, 4, 4> {};
703  class AddressBits: public BitField<int, 8, 4> {};
704  class RememberedSetActionBits: public BitField<RememberedSetAction, 12, 1> {};
705  class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 13, 1> {};
706 
707  Register object_;
708  Register value_;
709  Register address_;
710  RememberedSetAction remembered_set_action_;
711  SaveFPRegsMode save_fp_regs_mode_;
712  Label slow_;
713  RegisterAllocation regs_;
714 };
715 
716 
717 } } // namespace v8::internal
718 
719 #endif // V8_X64_CODE_STUBS_X64_H_
static Mode GetMode(Code *stub)
static void Patch(Code *stub, Mode mode)
RecordWriteStub(Register object, Register value, Register address, RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode)
StringDictionaryLookupStub(Register dictionary, Register result, Register index, LookupMode mode)
const Register r3
virtual bool SometimesSetsUpAFrame()
static void GenerateFixedRegStubsAheadOfTime()
static void GenerateCopyCharacters(MacroAssembler *masm, Register dest, Register src, Register count, Register scratch, bool ascii)
UnaryOpStub(Token::Value op, UnaryOverwriteMode mode, UnaryOpIC::TypeInfo operand_type=UnaryOpIC::UNINITIALIZED)
static const byte kTwoByteNopInstruction
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
void Generate(MacroAssembler *masm)
static void GenerateHashGetHash(MacroAssembler *masm, Register hash)
Flag flags[]
Definition: flags.cc:1467
bool AreAliased(Register r1, Register r2, Register r3, Register r4)
#define ASSERT(condition)
Definition: checks.h:270
static void GenerateCompareFlatAsciiStrings(MacroAssembler *masm, Register left, Register right, Register scratch1, Register scratch2, Register scratch3, Register scratch4)
static void GenerateOperation(MacroAssembler *masm, TranscendentalCache::Type type)
const Register r2
BinaryOpStub(Token::Value op, OverwriteMode mode)
static State ToState(TypeInfo type_info)
Definition: ic.cc:2300
static void GenerateNegativeLookup(MacroAssembler *masm, Label *miss, Label *done, Register receiver, Register properties, Handle< String > name, Register scratch0)
Handle< String > SubString(Handle< String > str, int start, int end, PretenureFlag pretenure)
Definition: handles.cc:326
uint8_t byte
Definition: globals.h:171
#define UNREACHABLE()
Definition: checks.h:50
static void GenerateCopyCharactersREP(MacroAssembler *masm, Register dest, Register src, Register count, Register scratch, bool ascii)
static void GenerateFlatAsciiStringEquals(MacroAssembler *masm, Register left, Register right, Register scratch1, Register scratch2, Register scratch3)
byte * instruction_start()
Definition: objects-inl.h:4376
const int kPointerSize
Definition: globals.h:234
static Register FromAllocationIndex(int index)
Definition: assembler-arm.h:82
static const byte kTwoByteJumpInstruction
static const byte kFiveByteNopInstruction
static State ToState(TypeInfo type_info)
Definition: ic.cc:2231
static void GenerateHashAddCharacter(MacroAssembler *masm, Register hash, Register character)
const Register r0
static const int kHeaderSize
Definition: objects.h:2233
bool is(Register reg) const
const Register r1
void Generate(MacroAssembler *masm)
static void GeneratePositiveLookup(MacroAssembler *masm, Label *miss, Label *done, Register elements, Register name, Register r0, Register r1)
BinaryOpStub(int key, BinaryOpIC::TypeInfo operands_type, BinaryOpIC::TypeInfo result_type=BinaryOpIC::UNINITIALIZED)
static const int kNumAllocatableRegisters
Definition: assembler-arm.h:74
const Register rcx
TranscendentalCacheStub(TranscendentalCache::Type type, ArgumentType argument_type)
static void GenerateLookupNumberStringCache(MacroAssembler *masm, Register object, Register result, Register scratch1, Register scratch2, Register scratch3, bool object_is_smi, Label *not_found)
const Register no_reg
static void GenerateTwoCharacterSymbolTableProbe(MacroAssembler *masm, Register c1, Register c2, Register scratch1, Register scratch2, Register scratch3, Register scratch4, Register scratch5, Label *not_found)
static void FlushICache(void *start, size_t size)
static const byte kFiveByteJumpInstruction
static const int kTranscendentalTypeBits
Definition: heap.h:2526
StringAddStub(StringAddFlags flags)
StoreBufferOverflowStub(SaveFPRegsMode save_fp)
FlagType type() const
Definition: flags.cc:1358
static void GenerateHashInit(MacroAssembler *masm, Register hash, Register character)
void Generate(MacroAssembler *masm)