Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Side by Side Diff: src/code-stubs.h

Issue 10701054: Enable stub generation using Hydrogen/Lithium (again) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: First pass at pre-VFP2 RA Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 // result in a traversable stack. 159 // result in a traversable stack.
160 virtual bool SometimesSetsUpAFrame() { return true; } 160 virtual bool SometimesSetsUpAFrame() { return true; }
161 161
162 // Lookup the code in the (possibly custom) cache. 162 // Lookup the code in the (possibly custom) cache.
163 bool FindCodeInCache(Code** code_out); 163 bool FindCodeInCache(Code** code_out);
164 164
165 protected: 165 protected:
166 static bool CanUseFPRegisters(); 166 static bool CanUseFPRegisters();
167 167
168 private: 168 private:
169 // Nonvirtual wrapper around the stub-specific Generate function. Call 169 friend class PlatformCodeStub;
170 // this function to set up the macro assembler and generate the code.
171 void GenerateCode(MacroAssembler* masm);
172 170
173 // Generates the assembler code for the stub. 171 // Generates the assembler code for the stub.
174 virtual void Generate(MacroAssembler* masm) = 0; 172 virtual Handle<Code> GenerateCode() = 0;
175 173
176 // Perform bookkeeping required after code generation when stub code is 174 // Perform bookkeeping required after code generation when stub code is
177 // initially generated. 175 // initially generated.
178 void RecordCodeGeneration(Code* code, MacroAssembler* masm); 176 void RecordCodeGeneration(Code* code, Isolate* isolate);
179 177
180 // Finish the code object after it has been generated. 178 // Finish the code object after it has been generated.
181 virtual void FinishCode(Handle<Code> code) { } 179 virtual void FinishCode(Handle<Code> code) { }
182 180
183 // Activate newly generated stub. Is called after 181 // Activate newly generated stub. Is called after
184 // registering stub in the stub cache. 182 // registering stub in the stub cache.
185 virtual void Activate(Code* code) { } 183 virtual void Activate(Code* code) { }
186 184
187 // Returns information for computing the number key. 185 // Returns information for computing the number key.
188 virtual Major MajorKey() = 0; 186 virtual Major MajorKey() = 0;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 } 221 }
224 222
225 class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; 223 class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {};
226 class MinorKeyBits: public BitField<uint32_t, 224 class MinorKeyBits: public BitField<uint32_t,
227 kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT 225 kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT
228 226
229 friend class BreakPointIterator; 227 friend class BreakPointIterator;
230 }; 228 };
231 229
232 230
231 class PlatformCodeStub : public CodeStub {
232 public:
233 // Retrieve the code for the stub. Generate the code if needed.
234 virtual Handle<Code> GenerateCode();
235
236 virtual int GetCodeKind() { return Code::STUB; }
237
238 protected:
239 // Generates the assembler code for the stub.
240 virtual void Generate(MacroAssembler* masm) = 0;
241 };
242
243
244 class HGraph;
245 class HydrogenCodeStub : public CodeStub {
246 public:
247 // Retrieve the code for the stub. Generate the code if needed.
248 virtual Handle<Code> GenerateCode();
249
250 virtual int GetCodeKind() { return Code::COMPILED_STUB; }
251
252 protected:
253 virtual void Generate(HGraph* graph) = 0;
254 };
255
256
233 // Helper interface to prepare to/restore after making runtime calls. 257 // Helper interface to prepare to/restore after making runtime calls.
234 class RuntimeCallHelper { 258 class RuntimeCallHelper {
235 public: 259 public:
236 virtual ~RuntimeCallHelper() {} 260 virtual ~RuntimeCallHelper() {}
237 261
238 virtual void BeforeCall(MacroAssembler* masm) const = 0; 262 virtual void BeforeCall(MacroAssembler* masm) const = 0;
239 263
240 virtual void AfterCall(MacroAssembler* masm) const = 0; 264 virtual void AfterCall(MacroAssembler* masm) const = 0;
241 265
242 protected: 266 protected:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 class NopRuntimeCallHelper : public RuntimeCallHelper { 304 class NopRuntimeCallHelper : public RuntimeCallHelper {
281 public: 305 public:
282 NopRuntimeCallHelper() {} 306 NopRuntimeCallHelper() {}
283 307
284 virtual void BeforeCall(MacroAssembler* masm) const {} 308 virtual void BeforeCall(MacroAssembler* masm) const {}
285 309
286 virtual void AfterCall(MacroAssembler* masm) const {} 310 virtual void AfterCall(MacroAssembler* masm) const {}
287 }; 311 };
288 312
289 313
290 class StackCheckStub : public CodeStub { 314 class StackCheckStub : public PlatformCodeStub {
291 public: 315 public:
292 StackCheckStub() { } 316 StackCheckStub() { }
293 317
294 void Generate(MacroAssembler* masm); 318 void Generate(MacroAssembler* masm);
295 319
296 private: 320 private:
297 Major MajorKey() { return StackCheck; } 321 Major MajorKey() { return StackCheck; }
298 int MinorKey() { return 0; } 322 int MinorKey() { return 0; }
299 }; 323 };
300 324
301 325
302 class InterruptStub : public CodeStub { 326 class InterruptStub : public PlatformCodeStub {
303 public: 327 public:
304 InterruptStub() { } 328 InterruptStub() { }
305 329
306 void Generate(MacroAssembler* masm); 330 void Generate(MacroAssembler* masm);
307 331
308 private: 332 private:
309 Major MajorKey() { return Interrupt; } 333 Major MajorKey() { return Interrupt; }
310 int MinorKey() { return 0; } 334 int MinorKey() { return 0; }
311 }; 335 };
312 336
313 337
314 class ToNumberStub: public CodeStub { 338 class ToNumberStub: public PlatformCodeStub {
315 public: 339 public:
316 ToNumberStub() { } 340 ToNumberStub() { }
317 341
318 void Generate(MacroAssembler* masm); 342 void Generate(MacroAssembler* masm);
319 343
320 private: 344 private:
321 Major MajorKey() { return ToNumber; } 345 Major MajorKey() { return ToNumber; }
322 int MinorKey() { return 0; } 346 int MinorKey() { return 0; }
323 }; 347 };
324 348
325 349
326 class FastNewClosureStub : public CodeStub { 350 class FastNewClosureStub : public PlatformCodeStub {
327 public: 351 public:
328 explicit FastNewClosureStub(LanguageMode language_mode) 352 explicit FastNewClosureStub(LanguageMode language_mode)
329 : language_mode_(language_mode) { } 353 : language_mode_(language_mode) { }
330 354
331 void Generate(MacroAssembler* masm); 355 void Generate(MacroAssembler* masm);
332 356
333 private: 357 private:
334 Major MajorKey() { return FastNewClosure; } 358 Major MajorKey() { return FastNewClosure; }
335 int MinorKey() { return language_mode_ == CLASSIC_MODE 359 int MinorKey() { return language_mode_ == CLASSIC_MODE
336 ? kNonStrictMode : kStrictMode; } 360 ? kNonStrictMode : kStrictMode; }
337 361
338 LanguageMode language_mode_; 362 LanguageMode language_mode_;
339 }; 363 };
340 364
341 365
342 class FastNewContextStub : public CodeStub { 366 class FastNewContextStub : public PlatformCodeStub {
343 public: 367 public:
344 static const int kMaximumSlots = 64; 368 static const int kMaximumSlots = 64;
345 369
346 explicit FastNewContextStub(int slots) : slots_(slots) { 370 explicit FastNewContextStub(int slots) : slots_(slots) {
347 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); 371 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots);
348 } 372 }
349 373
350 void Generate(MacroAssembler* masm); 374 void Generate(MacroAssembler* masm);
351 375
352 private: 376 private:
353 int slots_; 377 int slots_;
354 378
355 Major MajorKey() { return FastNewContext; } 379 Major MajorKey() { return FastNewContext; }
356 int MinorKey() { return slots_; } 380 int MinorKey() { return slots_; }
357 }; 381 };
358 382
359 383
360 class FastNewBlockContextStub : public CodeStub { 384 class FastNewBlockContextStub : public PlatformCodeStub {
361 public: 385 public:
362 static const int kMaximumSlots = 64; 386 static const int kMaximumSlots = 64;
363 387
364 explicit FastNewBlockContextStub(int slots) : slots_(slots) { 388 explicit FastNewBlockContextStub(int slots) : slots_(slots) {
365 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); 389 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots);
366 } 390 }
367 391
368 void Generate(MacroAssembler* masm); 392 void Generate(MacroAssembler* masm);
369 393
370 private: 394 private:
371 int slots_; 395 int slots_;
372 396
373 Major MajorKey() { return FastNewBlockContext; } 397 Major MajorKey() { return FastNewBlockContext; }
374 int MinorKey() { return slots_; } 398 int MinorKey() { return slots_; }
375 }; 399 };
376 400
377 401
378 class FastCloneShallowArrayStub : public CodeStub { 402 class FastCloneShallowArrayStub : public PlatformCodeStub {
379 public: 403 public:
380 // Maximum length of copied elements array. 404 // Maximum length of copied elements array.
381 static const int kMaximumClonedLength = 8; 405 static const int kMaximumClonedLength = 8;
382 406
383 enum Mode { 407 enum Mode {
384 CLONE_ELEMENTS, 408 CLONE_ELEMENTS,
385 CLONE_DOUBLE_ELEMENTS, 409 CLONE_DOUBLE_ELEMENTS,
386 COPY_ON_WRITE_ELEMENTS, 410 COPY_ON_WRITE_ELEMENTS,
387 CLONE_ANY_ELEMENTS 411 CLONE_ANY_ELEMENTS
388 }; 412 };
(...skipping 12 matching lines...) Expand all
401 int length_; 425 int length_;
402 426
403 Major MajorKey() { return FastCloneShallowArray; } 427 Major MajorKey() { return FastCloneShallowArray; }
404 int MinorKey() { 428 int MinorKey() {
405 ASSERT(mode_ == 0 || mode_ == 1 || mode_ == 2 || mode_ == 3); 429 ASSERT(mode_ == 0 || mode_ == 1 || mode_ == 2 || mode_ == 3);
406 return length_ * 4 + mode_; 430 return length_ * 4 + mode_;
407 } 431 }
408 }; 432 };
409 433
410 434
411 class FastCloneShallowObjectStub : public CodeStub { 435 class FastCloneShallowObjectStub : public PlatformCodeStub {
412 public: 436 public:
413 // Maximum number of properties in copied object. 437 // Maximum number of properties in copied object.
414 static const int kMaximumClonedProperties = 6; 438 static const int kMaximumClonedProperties = 6;
415 439
416 explicit FastCloneShallowObjectStub(int length) : length_(length) { 440 explicit FastCloneShallowObjectStub(int length) : length_(length) {
417 ASSERT_GE(length_, 0); 441 ASSERT_GE(length_, 0);
418 ASSERT_LE(length_, kMaximumClonedProperties); 442 ASSERT_LE(length_, kMaximumClonedProperties);
419 } 443 }
420 444
421 void Generate(MacroAssembler* masm); 445 void Generate(MacroAssembler* masm);
422 446
423 private: 447 private:
424 int length_; 448 int length_;
425 449
426 Major MajorKey() { return FastCloneShallowObject; } 450 Major MajorKey() { return FastCloneShallowObject; }
427 int MinorKey() { return length_; } 451 int MinorKey() { return length_; }
428 }; 452 };
429 453
430 454
431 class InstanceofStub: public CodeStub { 455 class InstanceofStub: public PlatformCodeStub {
432 public: 456 public:
433 enum Flags { 457 enum Flags {
434 kNoFlags = 0, 458 kNoFlags = 0,
435 kArgsInRegisters = 1 << 0, 459 kArgsInRegisters = 1 << 0,
436 kCallSiteInlineCheck = 1 << 1, 460 kCallSiteInlineCheck = 1 << 1,
437 kReturnTrueFalseObject = 1 << 2 461 kReturnTrueFalseObject = 1 << 2
438 }; 462 };
439 463
440 explicit InstanceofStub(Flags flags) : flags_(flags) { } 464 explicit InstanceofStub(Flags flags) : flags_(flags) { }
441 465
(...skipping 17 matching lines...) Expand all
459 bool ReturnTrueFalseObject() const { 483 bool ReturnTrueFalseObject() const {
460 return (flags_ & kReturnTrueFalseObject) != 0; 484 return (flags_ & kReturnTrueFalseObject) != 0;
461 } 485 }
462 486
463 virtual void PrintName(StringStream* stream); 487 virtual void PrintName(StringStream* stream);
464 488
465 Flags flags_; 489 Flags flags_;
466 }; 490 };
467 491
468 492
469 class MathPowStub: public CodeStub { 493 class MathPowStub: public PlatformCodeStub {
470 public: 494 public:
471 enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK}; 495 enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK};
472 496
473 explicit MathPowStub(ExponentType exponent_type) 497 explicit MathPowStub(ExponentType exponent_type)
474 : exponent_type_(exponent_type) { } 498 : exponent_type_(exponent_type) { }
475 virtual void Generate(MacroAssembler* masm); 499 virtual void Generate(MacroAssembler* masm);
476 500
477 private: 501 private:
478 virtual CodeStub::Major MajorKey() { return MathPow; } 502 virtual CodeStub::Major MajorKey() { return MathPow; }
479 virtual int MinorKey() { return exponent_type_; } 503 virtual int MinorKey() { return exponent_type_; }
480 504
481 ExponentType exponent_type_; 505 ExponentType exponent_type_;
482 }; 506 };
483 507
484 508
485 class ICCompareStub: public CodeStub { 509 class ICCompareStub: public PlatformCodeStub {
486 public: 510 public:
487 ICCompareStub(Token::Value op, CompareIC::State state) 511 ICCompareStub(Token::Value op, CompareIC::State state)
488 : op_(op), state_(state) { 512 : op_(op), state_(state) {
489 ASSERT(Token::IsCompareOp(op)); 513 ASSERT(Token::IsCompareOp(op));
490 } 514 }
491 515
492 virtual void Generate(MacroAssembler* masm); 516 virtual void Generate(MacroAssembler* masm);
493 517
494 void set_known_map(Handle<Map> map) { known_map_ = map; } 518 void set_known_map(Handle<Map> map) { known_map_ = map; }
495 519
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 CANT_BOTH_BE_NAN = 1 << 2 560 CANT_BOTH_BE_NAN = 1 << 2
537 }; 561 };
538 562
539 563
540 enum NaNInformation { 564 enum NaNInformation {
541 kBothCouldBeNaN, 565 kBothCouldBeNaN,
542 kCantBothBeNaN 566 kCantBothBeNaN
543 }; 567 };
544 568
545 569
546 class CompareStub: public CodeStub { 570 class CompareStub: public PlatformCodeStub {
547 public: 571 public:
548 CompareStub(Condition cc, 572 CompareStub(Condition cc,
549 bool strict, 573 bool strict,
550 CompareFlags flags, 574 CompareFlags flags,
551 Register lhs, 575 Register lhs,
552 Register rhs) : 576 Register rhs) :
553 cc_(cc), 577 cc_(cc),
554 strict_(strict), 578 strict_(strict),
555 never_nan_nan_((flags & CANT_BOTH_BE_NAN) != 0), 579 never_nan_nan_((flags & CANT_BOTH_BE_NAN) != 0),
556 include_number_compare_((flags & NO_NUMBER_COMPARE_IN_STUB) == 0), 580 include_number_compare_((flags & NO_NUMBER_COMPARE_IN_STUB) == 0),
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 Label* label, 642 Label* label,
619 Register object, 643 Register object,
620 Register scratch); 644 Register scratch);
621 645
622 // Unfortunately you have to run without snapshots to see most of these 646 // Unfortunately you have to run without snapshots to see most of these
623 // names in the profile since most compare stubs end up in the snapshot. 647 // names in the profile since most compare stubs end up in the snapshot.
624 virtual void PrintName(StringStream* stream); 648 virtual void PrintName(StringStream* stream);
625 }; 649 };
626 650
627 651
628 class CEntryStub : public CodeStub { 652 class CEntryStub : public PlatformCodeStub {
629 public: 653 public:
630 explicit CEntryStub(int result_size, 654 explicit CEntryStub(int result_size,
631 SaveFPRegsMode save_doubles = kDontSaveFPRegs) 655 SaveFPRegsMode save_doubles = kDontSaveFPRegs)
632 : result_size_(result_size), save_doubles_(save_doubles) { } 656 : result_size_(result_size), save_doubles_(save_doubles) { }
633 657
634 void Generate(MacroAssembler* masm); 658 void Generate(MacroAssembler* masm);
635 659
636 // The version of this stub that doesn't save doubles is generated ahead of 660 // The version of this stub that doesn't save doubles is generated ahead of
637 // time, so it's OK to call it from other stubs that can't cope with GC during 661 // time, so it's OK to call it from other stubs that can't cope with GC during
638 // their code generation. On machines that always have gp registers (x64) we 662 // their code generation. On machines that always have gp registers (x64) we
(...skipping 13 matching lines...) Expand all
652 const int result_size_; 676 const int result_size_;
653 SaveFPRegsMode save_doubles_; 677 SaveFPRegsMode save_doubles_;
654 678
655 Major MajorKey() { return CEntry; } 679 Major MajorKey() { return CEntry; }
656 int MinorKey(); 680 int MinorKey();
657 681
658 bool NeedsImmovableCode(); 682 bool NeedsImmovableCode();
659 }; 683 };
660 684
661 685
662 class JSEntryStub : public CodeStub { 686 class JSEntryStub : public PlatformCodeStub {
663 public: 687 public:
664 JSEntryStub() { } 688 JSEntryStub() { }
665 689
666 void Generate(MacroAssembler* masm) { GenerateBody(masm, false); } 690 void Generate(MacroAssembler* masm) { GenerateBody(masm, false); }
667 691
668 protected: 692 protected:
669 void GenerateBody(MacroAssembler* masm, bool is_construct); 693 void GenerateBody(MacroAssembler* masm, bool is_construct);
670 694
671 private: 695 private:
672 Major MajorKey() { return JSEntry; } 696 Major MajorKey() { return JSEntry; }
(...skipping 13 matching lines...) Expand all
686 710
687 private: 711 private:
688 int MinorKey() { return 1; } 712 int MinorKey() { return 1; }
689 713
690 virtual void PrintName(StringStream* stream) { 714 virtual void PrintName(StringStream* stream) {
691 stream->Add("JSConstructEntryStub"); 715 stream->Add("JSConstructEntryStub");
692 } 716 }
693 }; 717 };
694 718
695 719
696 class ArgumentsAccessStub: public CodeStub { 720 class ArgumentsAccessStub: public PlatformCodeStub {
697 public: 721 public:
698 enum Type { 722 enum Type {
699 READ_ELEMENT, 723 READ_ELEMENT,
700 NEW_NON_STRICT_FAST, 724 NEW_NON_STRICT_FAST,
701 NEW_NON_STRICT_SLOW, 725 NEW_NON_STRICT_SLOW,
702 NEW_STRICT 726 NEW_STRICT
703 }; 727 };
704 728
705 explicit ArgumentsAccessStub(Type type) : type_(type) { } 729 explicit ArgumentsAccessStub(Type type) : type_(type) { }
706 730
707 private: 731 private:
708 Type type_; 732 Type type_;
709 733
710 Major MajorKey() { return ArgumentsAccess; } 734 Major MajorKey() { return ArgumentsAccess; }
711 int MinorKey() { return type_; } 735 int MinorKey() { return type_; }
712 736
713 void Generate(MacroAssembler* masm); 737 void Generate(MacroAssembler* masm);
714 void GenerateReadElement(MacroAssembler* masm); 738 void GenerateReadElement(MacroAssembler* masm);
715 void GenerateNewStrict(MacroAssembler* masm); 739 void GenerateNewStrict(MacroAssembler* masm);
716 void GenerateNewNonStrictFast(MacroAssembler* masm); 740 void GenerateNewNonStrictFast(MacroAssembler* masm);
717 void GenerateNewNonStrictSlow(MacroAssembler* masm); 741 void GenerateNewNonStrictSlow(MacroAssembler* masm);
718 742
719 virtual void PrintName(StringStream* stream); 743 virtual void PrintName(StringStream* stream);
720 }; 744 };
721 745
722 746
723 class RegExpExecStub: public CodeStub { 747 class RegExpExecStub: public PlatformCodeStub {
724 public: 748 public:
725 RegExpExecStub() { } 749 RegExpExecStub() { }
726 750
727 private: 751 private:
728 Major MajorKey() { return RegExpExec; } 752 Major MajorKey() { return RegExpExec; }
729 int MinorKey() { return 0; } 753 int MinorKey() { return 0; }
730 754
731 void Generate(MacroAssembler* masm); 755 void Generate(MacroAssembler* masm);
732 }; 756 };
733 757
734 758
735 class RegExpConstructResultStub: public CodeStub { 759 class RegExpConstructResultStub: public PlatformCodeStub {
736 public: 760 public:
737 RegExpConstructResultStub() { } 761 RegExpConstructResultStub() { }
738 762
739 private: 763 private:
740 Major MajorKey() { return RegExpConstructResult; } 764 Major MajorKey() { return RegExpConstructResult; }
741 int MinorKey() { return 0; } 765 int MinorKey() { return 0; }
742 766
743 void Generate(MacroAssembler* masm); 767 void Generate(MacroAssembler* masm);
744 }; 768 };
745 769
746 770
747 class CallFunctionStub: public CodeStub { 771 class CallFunctionStub: public PlatformCodeStub {
748 public: 772 public:
749 CallFunctionStub(int argc, CallFunctionFlags flags) 773 CallFunctionStub(int argc, CallFunctionFlags flags)
750 : argc_(argc), flags_(flags) { } 774 : argc_(argc), flags_(flags) { }
751 775
752 void Generate(MacroAssembler* masm); 776 void Generate(MacroAssembler* masm);
753 777
754 virtual void FinishCode(Handle<Code> code) { 778 virtual void FinishCode(Handle<Code> code) {
755 code->set_has_function_cache(RecordCallTarget()); 779 code->set_has_function_cache(RecordCallTarget());
756 } 780 }
757 781
(...skipping 20 matching lines...) Expand all
778 bool ReceiverMightBeImplicit() { 802 bool ReceiverMightBeImplicit() {
779 return (flags_ & RECEIVER_MIGHT_BE_IMPLICIT) != 0; 803 return (flags_ & RECEIVER_MIGHT_BE_IMPLICIT) != 0;
780 } 804 }
781 805
782 bool RecordCallTarget() { 806 bool RecordCallTarget() {
783 return (flags_ & RECORD_CALL_TARGET) != 0; 807 return (flags_ & RECORD_CALL_TARGET) != 0;
784 } 808 }
785 }; 809 };
786 810
787 811
788 class CallConstructStub: public CodeStub { 812 class CallConstructStub: public PlatformCodeStub {
789 public: 813 public:
790 explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {} 814 explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {}
791 815
792 void Generate(MacroAssembler* masm); 816 void Generate(MacroAssembler* masm);
793 817
794 virtual void FinishCode(Handle<Code> code) { 818 virtual void FinishCode(Handle<Code> code) {
795 code->set_has_function_cache(RecordCallTarget()); 819 code->set_has_function_cache(RecordCallTarget());
796 } 820 }
797 821
798 private: 822 private:
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 } 993 }
970 994
971 private: 995 private:
972 MacroAssembler* masm_; 996 MacroAssembler* masm_;
973 bool previous_allow_; 997 bool previous_allow_;
974 998
975 DISALLOW_COPY_AND_ASSIGN(AllowStubCallsScope); 999 DISALLOW_COPY_AND_ASSIGN(AllowStubCallsScope);
976 }; 1000 };
977 1001
978 1002
979 class KeyedLoadElementStub : public CodeStub { 1003 class KeyedLoadDictionaryElementStub : public PlatformCodeStub {
980 public: 1004 public:
981 explicit KeyedLoadElementStub(ElementsKind elements_kind) 1005 explicit KeyedLoadDictionaryElementStub() {}
982 : elements_kind_(elements_kind)
983 { }
984 1006
985 Major MajorKey() { return KeyedLoadElement; } 1007 Major MajorKey() { return KeyedLoadElement; }
986 int MinorKey() { return elements_kind_; } 1008 int MinorKey() { return DICTIONARY_ELEMENTS; }
987 1009
988 void Generate(MacroAssembler* masm); 1010 void Generate(MacroAssembler* masm);
989 1011
990 private: 1012 private:
991 ElementsKind elements_kind_; 1013 DISALLOW_COPY_AND_ASSIGN(KeyedLoadDictionaryElementStub);
992
993 DISALLOW_COPY_AND_ASSIGN(KeyedLoadElementStub);
994 }; 1014 };
995 1015
996 1016
997 class KeyedStoreElementStub : public CodeStub { 1017 class KeyedLoadFastElementStub : public HydrogenCodeStub {
1018 public:
1019 explicit KeyedLoadFastElementStub(bool is_js_array,
1020 ElementsKind elements_kind) {
1021 bit_field_ = ElementsKindBits::encode(elements_kind);
1022 bit_field_ = IsJSArrayBits::update(bit_field_, is_js_array);
1023 }
1024
1025 virtual void Generate(HGraph* graph);
1026
1027 Major MajorKey() { return KeyedLoadElement; }
1028 int MinorKey() { return bit_field_; }
1029
1030 bool is_js_array() const {
1031 return IsJSArrayBits::decode(bit_field_);
1032 }
1033
1034 ElementsKind elements_kind() const {
1035 return ElementsKindBits::decode(bit_field_);
1036 }
1037
1038 private:
1039 class IsJSArrayBits: public BitField<bool, 8, 1> {};
1040 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {};
1041 uint32_t bit_field_;
1042
1043 DISALLOW_COPY_AND_ASSIGN(KeyedLoadFastElementStub);
1044 };
1045
1046
1047 class KeyedStoreElementStub : public PlatformCodeStub {
998 public: 1048 public:
999 KeyedStoreElementStub(bool is_js_array, 1049 KeyedStoreElementStub(bool is_js_array,
1000 ElementsKind elements_kind, 1050 ElementsKind elements_kind,
1001 KeyedAccessGrowMode grow_mode) 1051 KeyedAccessGrowMode grow_mode)
1002 : is_js_array_(is_js_array), 1052 : is_js_array_(is_js_array),
1003 elements_kind_(elements_kind), 1053 elements_kind_(elements_kind),
1004 grow_mode_(grow_mode), 1054 grow_mode_(grow_mode),
1005 fp_registers_(CanUseFPRegisters()) { } 1055 fp_registers_(CanUseFPRegisters()) { }
1006 1056
1007 Major MajorKey() { return KeyedStoreElement; } 1057 Major MajorKey() { return KeyedStoreElement; }
(...skipping 14 matching lines...) Expand all
1022 1072
1023 bool is_js_array_; 1073 bool is_js_array_;
1024 ElementsKind elements_kind_; 1074 ElementsKind elements_kind_;
1025 KeyedAccessGrowMode grow_mode_; 1075 KeyedAccessGrowMode grow_mode_;
1026 bool fp_registers_; 1076 bool fp_registers_;
1027 1077
1028 DISALLOW_COPY_AND_ASSIGN(KeyedStoreElementStub); 1078 DISALLOW_COPY_AND_ASSIGN(KeyedStoreElementStub);
1029 }; 1079 };
1030 1080
1031 1081
1032 class ToBooleanStub: public CodeStub { 1082 class ToBooleanStub: public PlatformCodeStub {
1033 public: 1083 public:
1034 enum Type { 1084 enum Type {
1035 UNDEFINED, 1085 UNDEFINED,
1036 BOOLEAN, 1086 BOOLEAN,
1037 NULL_TYPE, 1087 NULL_TYPE,
1038 SMI, 1088 SMI,
1039 SPEC_OBJECT, 1089 SPEC_OBJECT,
1040 STRING, 1090 STRING,
1041 HEAP_NUMBER, 1091 HEAP_NUMBER,
1042 NUMBER_OF_TYPES 1092 NUMBER_OF_TYPES
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 Type type, 1139 Type type,
1090 Heap::RootListIndex value, 1140 Heap::RootListIndex value,
1091 bool result); 1141 bool result);
1092 void GenerateTypeTransition(MacroAssembler* masm); 1142 void GenerateTypeTransition(MacroAssembler* masm);
1093 1143
1094 Register tos_; 1144 Register tos_;
1095 Types types_; 1145 Types types_;
1096 }; 1146 };
1097 1147
1098 1148
1099 class ElementsTransitionAndStoreStub : public CodeStub { 1149 class ElementsTransitionAndStoreStub : public PlatformCodeStub {
1100 public: 1150 public:
1101 ElementsTransitionAndStoreStub(ElementsKind from, 1151 ElementsTransitionAndStoreStub(ElementsKind from,
1102 ElementsKind to, 1152 ElementsKind to,
1103 bool is_jsarray, 1153 bool is_jsarray,
1104 StrictModeFlag strict_mode, 1154 StrictModeFlag strict_mode,
1105 KeyedAccessGrowMode grow_mode) 1155 KeyedAccessGrowMode grow_mode)
1106 : from_(from), 1156 : from_(from),
1107 to_(to), 1157 to_(to),
1108 is_jsarray_(is_jsarray), 1158 is_jsarray_(is_jsarray),
1109 strict_mode_(strict_mode), 1159 strict_mode_(strict_mode),
(...skipping 20 matching lines...) Expand all
1130 ElementsKind from_; 1180 ElementsKind from_;
1131 ElementsKind to_; 1181 ElementsKind to_;
1132 bool is_jsarray_; 1182 bool is_jsarray_;
1133 StrictModeFlag strict_mode_; 1183 StrictModeFlag strict_mode_;
1134 KeyedAccessGrowMode grow_mode_; 1184 KeyedAccessGrowMode grow_mode_;
1135 1185
1136 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub); 1186 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub);
1137 }; 1187 };
1138 1188
1139 1189
1140 class StoreArrayLiteralElementStub : public CodeStub { 1190 class StoreArrayLiteralElementStub : public PlatformCodeStub {
1141 public: 1191 public:
1142 StoreArrayLiteralElementStub() 1192 StoreArrayLiteralElementStub()
1143 : fp_registers_(CanUseFPRegisters()) { } 1193 : fp_registers_(CanUseFPRegisters()) { }
1144 1194
1145 private: 1195 private:
1146 class FPRegisters: public BitField<bool, 0, 1> {}; 1196 class FPRegisters: public BitField<bool, 0, 1> {};
1147 1197
1148 Major MajorKey() { return StoreArrayLiteralElement; } 1198 Major MajorKey() { return StoreArrayLiteralElement; }
1149 int MinorKey() { return FPRegisters::encode(fp_registers_); } 1199 int MinorKey() { return FPRegisters::encode(fp_registers_); }
1150 1200
1151 void Generate(MacroAssembler* masm); 1201 void Generate(MacroAssembler* masm);
1152 1202
1153 bool fp_registers_; 1203 bool fp_registers_;
1154 1204
1155 DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub); 1205 DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub);
1156 }; 1206 };
1157 1207
1158 1208
1159 class ProfileEntryHookStub : public CodeStub { 1209 class ProfileEntryHookStub : public PlatformCodeStub {
1160 public: 1210 public:
1161 explicit ProfileEntryHookStub() {} 1211 explicit ProfileEntryHookStub() {}
1162 1212
1163 // The profile entry hook function is not allowed to cause a GC. 1213 // The profile entry hook function is not allowed to cause a GC.
1164 virtual bool SometimesSetsUpAFrame() { return false; } 1214 virtual bool SometimesSetsUpAFrame() { return false; }
1165 1215
1166 // Generates a call to the entry hook if it's enabled. 1216 // Generates a call to the entry hook if it's enabled.
1167 static void MaybeCallEntryHook(MacroAssembler* masm); 1217 static void MaybeCallEntryHook(MacroAssembler* masm);
1168 1218
1169 // Sets or unsets the entry hook function. Returns true on success, 1219 // Sets or unsets the entry hook function. Returns true on success,
(...skipping 14 matching lines...) Expand all
1184 1234
1185 // The current function entry hook. 1235 // The current function entry hook.
1186 static FunctionEntryHook entry_hook_; 1236 static FunctionEntryHook entry_hook_;
1187 1237
1188 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); 1238 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub);
1189 }; 1239 };
1190 1240
1191 } } // namespace v8::internal 1241 } } // namespace v8::internal
1192 1242
1193 #endif // V8_CODE_STUBS_H_ 1243 #endif // V8_CODE_STUBS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698