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

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

Issue 530343005: Clean up code stubs and ensure distinct major keys. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 months 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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_CODE_STUBS_H_ 5 #ifndef V8_CODE_STUBS_H_
6 #define V8_CODE_STUBS_H_ 6 #define V8_CODE_STUBS_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/assembler.h" 9 #include "src/assembler.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
11 #include "src/globals.h" 11 #include "src/globals.h"
12 #include "src/ic/ic.h" 12 #include "src/ic/ic.h"
13 #include "src/interface-descriptors.h" 13 #include "src/interface-descriptors.h"
14 #include "src/macro-assembler.h" 14 #include "src/macro-assembler.h"
15 #include "src/ostreams.h" 15 #include "src/ostreams.h"
16 16
17 namespace v8 { 17 namespace v8 {
18 namespace internal { 18 namespace internal {
19 19
20 // List of code stubs used on all platforms. 20 // List of code stubs used on all platforms.
21 #define CODE_STUB_LIST_ALL_PLATFORMS(V) \ 21 #define CODE_STUB_LIST_ALL_PLATFORMS(V) \
22 /* PlatformCodeStubs */ \
23 V(ArgumentsAccess) \
24 V(ArrayConstructor) \
25 V(BinaryOpICWithAllocationSite) \
26 V(CallApiFunction) \
27 V(CallApiGetter) \
28 V(CallConstruct) \
22 V(CallFunction) \ 29 V(CallFunction) \
23 V(CallConstruct) \
24 V(BinaryOpIC) \
25 V(BinaryOpICWithAllocationSite) \
26 V(BinaryOpWithAllocationSite) \
27 V(StringAdd) \
28 V(SubString) \
29 V(StringCompare) \
30 V(Compare) \
31 V(CompareIC) \
32 V(CompareNilIC) \
33 V(MathPow) \
34 V(CallIC) \ 30 V(CallIC) \
35 V(CallIC_Array) \ 31 V(CallIC_Array) \
32 V(CEntry) \
33 V(CompareIC) \
34 V(DoubleToI) \
36 V(FunctionPrototype) \ 35 V(FunctionPrototype) \
36 V(Instanceof) \
37 V(InternalArrayConstructor) \
38 V(JSEntry) \
39 V(KeyedLoadICTrampoline) \
40 V(LoadICTrampoline) \
41 V(MathPow) \
42 V(ProfileEntryHook) \
37 V(RecordWrite) \ 43 V(RecordWrite) \
44 V(RegExpExec) \
45 V(StoreArrayLiteralElement) \
38 V(StoreBufferOverflow) \ 46 V(StoreBufferOverflow) \
39 V(RegExpExec) \ 47 V(StoreElement) \
40 V(Instanceof) \ 48 V(StringCompare) \
41 V(ConvertToDouble) \ 49 V(StubFailureTrampoline) \
42 V(WriteInt32ToHeapNumber) \ 50 V(SubString) \
43 V(StackCheck) \ 51 /* HydrogenCodeStubs */ \
44 V(Interrupt) \ 52 V(ArrayNArgumentsConstructor) \
53 V(ArrayNoArgumentConstructor) \
54 V(ArraySingleArgumentConstructor) \
55 V(BinaryOpIC) \
56 V(BinaryOpWithAllocationSite) \
57 V(CompareNilIC) \
58 V(CreateAllocationSite) \
59 V(ElementsTransitionAndStore) \
60 V(FastCloneShallowArray) \
61 V(FastCloneShallowObject) \
45 V(FastNewClosure) \ 62 V(FastNewClosure) \
46 V(FastNewContext) \ 63 V(FastNewContext) \
47 V(FastCloneShallowArray) \ 64 V(InternalArrayNArgumentsConstructor) \
48 V(FastCloneShallowObject) \ 65 V(InternalArrayNoArgumentConstructor) \
49 V(CreateAllocationSite) \ 66 V(InternalArraySingleArgumentConstructor) \
67 V(KeyedLoadGeneric) \
68 V(LoadDictionaryElement) \
69 V(LoadFastElement) \
70 V(NameDictionaryLookup) \
71 V(NumberToString) \
72 V(RegExpConstructResult) \
73 V(StoreFastElement) \
74 V(StringAdd) \
50 V(ToBoolean) \ 75 V(ToBoolean) \
51 V(ToNumber) \ 76 V(ToNumber) \
52 V(ArgumentsAccess) \
53 V(RegExpConstructResult) \
54 V(NumberToString) \
55 V(DoubleToI) \
56 V(CEntry) \
57 V(JSEntry) \
58 V(LoadElement) \
59 V(KeyedLoadGeneric) \
60 V(ArrayNoArgumentConstructor) \
61 V(ArraySingleArgumentConstructor) \
62 V(ArrayNArgumentsConstructor) \
63 V(InternalArrayNoArgumentConstructor) \
64 V(InternalArraySingleArgumentConstructor) \
65 V(InternalArrayNArgumentsConstructor) \
66 V(StoreElement) \
67 V(DebuggerStatement) \
68 V(NameDictionaryLookup) \
69 V(ElementsTransitionAndStore) \
70 V(TransitionElementsKind) \ 77 V(TransitionElementsKind) \
71 V(StoreArrayLiteralElement) \ 78 V(VectorKeyedLoad) \
72 V(StubFailureTrampoline) \
73 V(ArrayConstructor) \
74 V(InternalArrayConstructor) \
75 V(ProfileEntryHook) \
76 V(StoreGlobal) \
77 V(CallApiFunction) \
78 V(CallApiGetter) \
79 V(LoadICTrampoline) \
80 V(VectorLoad) \ 79 V(VectorLoad) \
81 V(KeyedLoadICTrampoline) \
82 V(VectorKeyedLoad) \
83 /* IC Handler stubs */ \ 80 /* IC Handler stubs */ \
81 V(LoadConstant) \
84 V(LoadField) \ 82 V(LoadField) \
85 V(StoreField) \ 83 V(StoreField) \
86 V(LoadConstant) \ 84 V(StoreGlobal) \
87 V(StringLength) 85 V(StringLength)
88 86
89 // List of code stubs only used on ARM 32 bits platforms. 87 // List of code stubs only used on ARM 32 bits platforms.
90 #if V8_TARGET_ARCH_ARM 88 #if V8_TARGET_ARCH_ARM
91 #define CODE_STUB_LIST_ARM(V) \ 89 #define CODE_STUB_LIST_ARM(V) \
92 V(GetProperty) \ 90 V(DirectCEntry) \
93 V(SetProperty) \ 91 V(WriteInt32ToHeapNumber)
94 V(InvokeBuiltin) \ 92
95 V(DirectCEntry)
96 #else 93 #else
97 #define CODE_STUB_LIST_ARM(V) 94 #define CODE_STUB_LIST_ARM(V)
98 #endif 95 #endif
99 96
100 // List of code stubs only used on ARM 64 bits platforms. 97 // List of code stubs only used on ARM 64 bits platforms.
101 #if V8_TARGET_ARCH_ARM64 98 #if V8_TARGET_ARCH_ARM64
102 #define CODE_STUB_LIST_ARM64(V) \ 99 #define CODE_STUB_LIST_ARM64(V) \
103 V(GetProperty) \ 100 V(DirectCEntry) \
104 V(SetProperty) \ 101 V(RestoreRegistersState) \
105 V(InvokeBuiltin) \ 102 V(StoreRegistersState)
106 V(DirectCEntry) \ 103
107 V(StoreRegistersState) \
108 V(RestoreRegistersState)
109 #else 104 #else
110 #define CODE_STUB_LIST_ARM64(V) 105 #define CODE_STUB_LIST_ARM64(V)
111 #endif 106 #endif
112 107
113 // List of code stubs only used on MIPS platforms. 108 // List of code stubs only used on MIPS platforms.
114 #if V8_TARGET_ARCH_MIPS 109 #if V8_TARGET_ARCH_MIPS
115 #define CODE_STUB_LIST_MIPS(V) \ 110 #define CODE_STUB_LIST_MIPS(V) \
116 V(RegExpCEntry) \ 111 V(RegExpCEntry) \
117 V(DirectCEntry) \ 112 V(DirectCEntry) \
118 V(StoreRegistersState) \ 113 V(StoreRegistersState) \
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 virtual void InitializeInterfaceDescriptor( 514 virtual void InitializeInterfaceDescriptor(
520 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 515 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
521 516
522 static void InstallDescriptors(Isolate* isolate) { 517 static void InstallDescriptors(Isolate* isolate) {
523 ToNumberStub stub(isolate); 518 ToNumberStub stub(isolate);
524 stub.InitializeInterfaceDescriptor( 519 stub.InitializeInterfaceDescriptor(
525 isolate->code_stub_interface_descriptor(CodeStub::ToNumber)); 520 isolate->code_stub_interface_descriptor(CodeStub::ToNumber));
526 } 521 }
527 522
528 private: 523 private:
529 virtual Major MajorKey() const OVERRIDE { return ToNumber; } 524 virtual inline Major MajorKey() const FINAL OVERRIDE;
525
526 DISALLOW_COPY_AND_ASSIGN(ToNumberStub);
530 }; 527 };
531 528
532 529
533 class NumberToStringStub FINAL : public HydrogenCodeStub { 530 class NumberToStringStub FINAL : public HydrogenCodeStub {
534 public: 531 public:
535 explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} 532 explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {}
536 533
537 virtual Handle<Code> GenerateCode() OVERRIDE; 534 virtual Handle<Code> GenerateCode() OVERRIDE;
538 535
539 virtual void InitializeInterfaceDescriptor( 536 virtual void InitializeInterfaceDescriptor(
540 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 537 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
541 538
542 static void InstallDescriptors(Isolate* isolate); 539 static void InstallDescriptors(Isolate* isolate);
543 540
544 // Parameters accessed via CodeStubGraphBuilder::GetParameter() 541 // Parameters accessed via CodeStubGraphBuilder::GetParameter()
545 static const int kNumber = 0; 542 static const int kNumber = 0;
546 543
547 private: 544 private:
548 virtual Major MajorKey() const OVERRIDE { return NumberToString; } 545 virtual inline Major MajorKey() const FINAL OVERRIDE;
546
547 DISALLOW_COPY_AND_ASSIGN(NumberToStringStub);
549 }; 548 };
550 549
551 550
552 class FastNewClosureStub : public HydrogenCodeStub { 551 class FastNewClosureStub : public HydrogenCodeStub {
553 public: 552 public:
554 FastNewClosureStub(Isolate* isolate, StrictMode strict_mode, 553 FastNewClosureStub(Isolate* isolate, StrictMode strict_mode,
555 bool is_generator) 554 bool is_generator)
556 : HydrogenCodeStub(isolate) { 555 : HydrogenCodeStub(isolate) {
557 set_sub_minor_key(StrictModeBits::encode(strict_mode) | 556 set_sub_minor_key(StrictModeBits::encode(strict_mode) |
558 IsGeneratorBits::encode(is_generator)); 557 IsGeneratorBits::encode(is_generator));
559 } 558 }
560 559
561 virtual Handle<Code> GenerateCode() OVERRIDE; 560 virtual Handle<Code> GenerateCode() OVERRIDE;
562 561
563 virtual void InitializeInterfaceDescriptor( 562 virtual void InitializeInterfaceDescriptor(
564 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 563 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
565 564
566 static void InstallDescriptors(Isolate* isolate); 565 static void InstallDescriptors(Isolate* isolate);
567 566
568 StrictMode strict_mode() const { 567 StrictMode strict_mode() const {
569 return StrictModeBits::decode(sub_minor_key()); 568 return StrictModeBits::decode(sub_minor_key());
570 } 569 }
571 570
572 bool is_generator() const { return IsGeneratorBits::decode(sub_minor_key()); } 571 bool is_generator() const { return IsGeneratorBits::decode(sub_minor_key()); }
573 572
574 private: 573 private:
575 virtual Major MajorKey() const OVERRIDE { return FastNewClosure; } 574 virtual inline Major MajorKey() const FINAL OVERRIDE;
576 575
577 class StrictModeBits : public BitField<StrictMode, 0, 1> {}; 576 class StrictModeBits : public BitField<StrictMode, 0, 1> {};
578 class IsGeneratorBits : public BitField<bool, 1, 1> {}; 577 class IsGeneratorBits : public BitField<bool, 1, 1> {};
579 578
580 DISALLOW_COPY_AND_ASSIGN(FastNewClosureStub); 579 DISALLOW_COPY_AND_ASSIGN(FastNewClosureStub);
581 }; 580 };
582 581
583 582
584 class FastNewContextStub FINAL : public HydrogenCodeStub { 583 class FastNewContextStub FINAL : public HydrogenCodeStub {
585 public: 584 public:
(...skipping 10 matching lines...) Expand all
596 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 595 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
597 596
598 static void InstallDescriptors(Isolate* isolate); 597 static void InstallDescriptors(Isolate* isolate);
599 598
600 int slots() const { return SlotsBits::decode(sub_minor_key()); } 599 int slots() const { return SlotsBits::decode(sub_minor_key()); }
601 600
602 // Parameters accessed via CodeStubGraphBuilder::GetParameter() 601 // Parameters accessed via CodeStubGraphBuilder::GetParameter()
603 static const int kFunction = 0; 602 static const int kFunction = 0;
604 603
605 private: 604 private:
606 virtual Major MajorKey() const OVERRIDE { return FastNewContext; } 605 virtual inline Major MajorKey() const FINAL OVERRIDE;
607 606
608 class SlotsBits : public BitField<int, 0, 8> {}; 607 class SlotsBits : public BitField<int, 0, 8> {};
609 608
610 DISALLOW_COPY_AND_ASSIGN(FastNewContextStub); 609 DISALLOW_COPY_AND_ASSIGN(FastNewContextStub);
611 }; 610 };
612 611
613 612
614 class FastCloneShallowArrayStub : public HydrogenCodeStub { 613 class FastCloneShallowArrayStub : public HydrogenCodeStub {
615 public: 614 public:
616 FastCloneShallowArrayStub(Isolate* isolate, 615 FastCloneShallowArrayStub(Isolate* isolate,
617 AllocationSiteMode allocation_site_mode) 616 AllocationSiteMode allocation_site_mode)
618 : HydrogenCodeStub(isolate) { 617 : HydrogenCodeStub(isolate) {
619 set_sub_minor_key(AllocationSiteModeBits::encode(allocation_site_mode)); 618 set_sub_minor_key(AllocationSiteModeBits::encode(allocation_site_mode));
620 } 619 }
621 620
622 AllocationSiteMode allocation_site_mode() const { 621 AllocationSiteMode allocation_site_mode() const {
623 return AllocationSiteModeBits::decode(sub_minor_key()); 622 return AllocationSiteModeBits::decode(sub_minor_key());
624 } 623 }
625 624
626 virtual Handle<Code> GenerateCode(); 625 virtual Handle<Code> GenerateCode();
627 626
628 virtual void InitializeInterfaceDescriptor( 627 virtual void InitializeInterfaceDescriptor(
629 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 628 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
630 629
631 static void InstallDescriptors(Isolate* isolate); 630 static void InstallDescriptors(Isolate* isolate);
632 631
633 private: 632 private:
634 virtual Major MajorKey() const OVERRIDE { return FastCloneShallowArray; } 633 virtual inline Major MajorKey() const FINAL OVERRIDE;
635 634
636 class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; 635 class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {};
637 636
638 DISALLOW_COPY_AND_ASSIGN(FastCloneShallowArrayStub); 637 DISALLOW_COPY_AND_ASSIGN(FastCloneShallowArrayStub);
639 }; 638 };
640 639
641 640
642 class FastCloneShallowObjectStub : public HydrogenCodeStub { 641 class FastCloneShallowObjectStub : public HydrogenCodeStub {
643 public: 642 public:
644 // Maximum number of properties in copied object. 643 // Maximum number of properties in copied object.
645 static const int kMaximumClonedProperties = 6; 644 static const int kMaximumClonedProperties = 6;
646 645
647 FastCloneShallowObjectStub(Isolate* isolate, int length) 646 FastCloneShallowObjectStub(Isolate* isolate, int length)
648 : HydrogenCodeStub(isolate) { 647 : HydrogenCodeStub(isolate) {
649 DCHECK_GE(length, 0); 648 DCHECK_GE(length, 0);
650 DCHECK_LE(length, kMaximumClonedProperties); 649 DCHECK_LE(length, kMaximumClonedProperties);
651 set_sub_minor_key(LengthBits::encode(length)); 650 set_sub_minor_key(LengthBits::encode(length));
652 } 651 }
653 652
654 int length() const { return LengthBits::decode(sub_minor_key()); } 653 int length() const { return LengthBits::decode(sub_minor_key()); }
655 654
656 virtual Handle<Code> GenerateCode() OVERRIDE; 655 virtual Handle<Code> GenerateCode() OVERRIDE;
657 656
658 virtual void InitializeInterfaceDescriptor( 657 virtual void InitializeInterfaceDescriptor(
659 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 658 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
660 659
661 private: 660 private:
662 virtual Major MajorKey() const OVERRIDE { return FastCloneShallowObject; } 661 virtual inline Major MajorKey() const FINAL OVERRIDE;
663 662
664 class LengthBits : public BitField<int, 0, 4> {}; 663 class LengthBits : public BitField<int, 0, 4> {};
665 664
666 DISALLOW_COPY_AND_ASSIGN(FastCloneShallowObjectStub); 665 DISALLOW_COPY_AND_ASSIGN(FastCloneShallowObjectStub);
667 }; 666 };
668 667
669 668
670 class CreateAllocationSiteStub : public HydrogenCodeStub { 669 class CreateAllocationSiteStub : public HydrogenCodeStub {
671 public: 670 public:
672 explicit CreateAllocationSiteStub(Isolate* isolate) 671 explicit CreateAllocationSiteStub(Isolate* isolate)
673 : HydrogenCodeStub(isolate) { } 672 : HydrogenCodeStub(isolate) { }
674 673
675 virtual Handle<Code> GenerateCode() OVERRIDE; 674 virtual Handle<Code> GenerateCode() OVERRIDE;
676 675
677 static void GenerateAheadOfTime(Isolate* isolate); 676 static void GenerateAheadOfTime(Isolate* isolate);
678 677
679 virtual void InitializeInterfaceDescriptor( 678 virtual void InitializeInterfaceDescriptor(
680 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 679 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
681 680
682 private: 681 private:
683 virtual Major MajorKey() const OVERRIDE { return CreateAllocationSite; } 682 virtual inline Major MajorKey() const FINAL OVERRIDE;
684 683
685 DISALLOW_COPY_AND_ASSIGN(CreateAllocationSiteStub); 684 DISALLOW_COPY_AND_ASSIGN(CreateAllocationSiteStub);
686 }; 685 };
687 686
688 687
689 class InstanceofStub: public PlatformCodeStub { 688 class InstanceofStub: public PlatformCodeStub {
690 public: 689 public:
691 enum Flags { 690 enum Flags {
692 kNoFlags = 0, 691 kNoFlags = 0,
693 kArgsInRegisters = 1 << 0, 692 kArgsInRegisters = 1 << 0,
694 kCallSiteInlineCheck = 1 << 1, 693 kCallSiteInlineCheck = 1 << 1,
695 kReturnTrueFalseObject = 1 << 2 694 kReturnTrueFalseObject = 1 << 2
696 }; 695 };
697 696
698 InstanceofStub(Isolate* isolate, Flags flags) : PlatformCodeStub(isolate) { 697 InstanceofStub(Isolate* isolate, Flags flags) : PlatformCodeStub(isolate) {
699 minor_key_ = FlagBits::encode(flags); 698 minor_key_ = FlagBits::encode(flags);
700 } 699 }
701 700
702 void Generate(MacroAssembler* masm); 701 void Generate(MacroAssembler* masm);
703 702
704 static Register left() { return InstanceofDescriptor::left(); } 703 static Register left() { return InstanceofDescriptor::left(); }
705 static Register right() { return InstanceofDescriptor::right(); } 704 static Register right() { return InstanceofDescriptor::right(); }
706 705
707 virtual void InitializeInterfaceDescriptor( 706 virtual void InitializeInterfaceDescriptor(
708 CodeStubInterfaceDescriptor* descriptor); 707 CodeStubInterfaceDescriptor* descriptor);
709 708
710 private: 709 private:
711 virtual Major MajorKey() const OVERRIDE { return Instanceof; } 710 virtual inline Major MajorKey() const FINAL OVERRIDE;
712 711
713 Flags flags() const { return FlagBits::decode(minor_key_); } 712 Flags flags() const { return FlagBits::decode(minor_key_); }
714 713
715 bool HasArgsInRegisters() const { return (flags() & kArgsInRegisters) != 0; } 714 bool HasArgsInRegisters() const { return (flags() & kArgsInRegisters) != 0; }
716 715
717 bool HasCallSiteInlineCheck() const { 716 bool HasCallSiteInlineCheck() const {
718 return (flags() & kCallSiteInlineCheck) != 0; 717 return (flags() & kCallSiteInlineCheck) != 0;
719 } 718 }
720 719
721 bool ReturnTrueFalseObject() const { 720 bool ReturnTrueFalseObject() const {
(...skipping 18 matching lines...) Expand all
740 class ArrayConstructorStub: public PlatformCodeStub { 739 class ArrayConstructorStub: public PlatformCodeStub {
741 public: 740 public:
742 enum ArgumentCountKey { ANY, NONE, ONE, MORE_THAN_ONE }; 741 enum ArgumentCountKey { ANY, NONE, ONE, MORE_THAN_ONE };
743 ArrayConstructorStub(Isolate* isolate, int argument_count); 742 ArrayConstructorStub(Isolate* isolate, int argument_count);
744 743
745 explicit ArrayConstructorStub(Isolate* isolate); 744 explicit ArrayConstructorStub(Isolate* isolate);
746 745
747 void Generate(MacroAssembler* masm); 746 void Generate(MacroAssembler* masm);
748 747
749 private: 748 private:
750 virtual Major MajorKey() const OVERRIDE { return ArrayConstructor; } 749 virtual inline Major MajorKey() const FINAL OVERRIDE;
751 750
752 ArgumentCountKey argument_count() const { 751 ArgumentCountKey argument_count() const {
753 return ArgumentCountBits::decode(minor_key_); 752 return ArgumentCountBits::decode(minor_key_);
754 } 753 }
755 754
756 void GenerateDispatchToArrayStub(MacroAssembler* masm, 755 void GenerateDispatchToArrayStub(MacroAssembler* masm,
757 AllocationSiteOverrideMode mode); 756 AllocationSiteOverrideMode mode);
758 757
759 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 758 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT
760 759
761 class ArgumentCountBits : public BitField<ArgumentCountKey, 0, 2> {}; 760 class ArgumentCountBits : public BitField<ArgumentCountKey, 0, 2> {};
762 761
763 DISALLOW_COPY_AND_ASSIGN(ArrayConstructorStub); 762 DISALLOW_COPY_AND_ASSIGN(ArrayConstructorStub);
764 }; 763 };
765 764
766 765
767 class InternalArrayConstructorStub: public PlatformCodeStub { 766 class InternalArrayConstructorStub: public PlatformCodeStub {
768 public: 767 public:
769 explicit InternalArrayConstructorStub(Isolate* isolate); 768 explicit InternalArrayConstructorStub(Isolate* isolate);
770 769
771 void Generate(MacroAssembler* masm); 770 void Generate(MacroAssembler* masm);
772 771
773 private: 772 private:
774 virtual Major MajorKey() const OVERRIDE { 773 virtual inline Major MajorKey() const FINAL OVERRIDE;
775 return InternalArrayConstructor;
776 }
777 774
778 void GenerateCase(MacroAssembler* masm, ElementsKind kind); 775 void GenerateCase(MacroAssembler* masm, ElementsKind kind);
779 776
780 DISALLOW_COPY_AND_ASSIGN(InternalArrayConstructorStub); 777 DISALLOW_COPY_AND_ASSIGN(InternalArrayConstructorStub);
781 }; 778 };
782 779
783 780
784 class MathPowStub: public PlatformCodeStub { 781 class MathPowStub: public PlatformCodeStub {
785 public: 782 public:
786 enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK }; 783 enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK };
787 784
788 MathPowStub(Isolate* isolate, ExponentType exponent_type) 785 MathPowStub(Isolate* isolate, ExponentType exponent_type)
789 : PlatformCodeStub(isolate) { 786 : PlatformCodeStub(isolate) {
790 minor_key_ = ExponentTypeBits::encode(exponent_type); 787 minor_key_ = ExponentTypeBits::encode(exponent_type);
791 } 788 }
792 789
793 virtual void Generate(MacroAssembler* masm); 790 virtual void Generate(MacroAssembler* masm);
794 791
795 private: 792 private:
796 virtual Major MajorKey() const OVERRIDE { return MathPow; } 793 virtual inline Major MajorKey() const FINAL OVERRIDE;
797 794
798 ExponentType exponent_type() const { 795 ExponentType exponent_type() const {
799 return ExponentTypeBits::decode(minor_key_); 796 return ExponentTypeBits::decode(minor_key_);
800 } 797 }
801 798
802 class ExponentTypeBits : public BitField<ExponentType, 0, 2> {}; 799 class ExponentTypeBits : public BitField<ExponentType, 0, 2> {};
803 800
804 DISALLOW_COPY_AND_ASSIGN(MathPowStub); 801 DISALLOW_COPY_AND_ASSIGN(MathPowStub);
805 }; 802 };
806 803
(...skipping 26 matching lines...) Expand all
833 int arg_count() const { return state().arg_count(); } 830 int arg_count() const { return state().arg_count(); }
834 831
835 CallIC::State state() const { 832 CallIC::State state() const {
836 return CallIC::State(static_cast<ExtraICState>(minor_key_)); 833 return CallIC::State(static_cast<ExtraICState>(minor_key_));
837 } 834 }
838 835
839 // Code generation helpers. 836 // Code generation helpers.
840 void GenerateMiss(MacroAssembler* masm, IC::UtilityId id); 837 void GenerateMiss(MacroAssembler* masm, IC::UtilityId id);
841 838
842 private: 839 private:
843 virtual Major MajorKey() const OVERRIDE { return CallIC; } 840 virtual inline Major MajorKey() const FINAL OVERRIDE;
844 841
845 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 842 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT
846 843
847 DISALLOW_COPY_AND_ASSIGN(CallICStub); 844 DISALLOW_COPY_AND_ASSIGN(CallICStub);
848 }; 845 };
849 846
850 847
851 class CallIC_ArrayStub: public CallICStub { 848 class CallIC_ArrayStub: public CallICStub {
852 public: 849 public:
853 CallIC_ArrayStub(Isolate* isolate, const CallIC::State& state_in) 850 CallIC_ArrayStub(Isolate* isolate, const CallIC::State& state_in)
854 : CallICStub(isolate, state_in) {} 851 : CallICStub(isolate, state_in) {}
855 852
856 virtual void Generate(MacroAssembler* masm); 853 virtual void Generate(MacroAssembler* masm);
857 854
858 virtual InlineCacheState GetICState() const FINAL OVERRIDE { 855 virtual InlineCacheState GetICState() const FINAL OVERRIDE {
859 return MONOMORPHIC; 856 return MONOMORPHIC;
860 } 857 }
861 858
862 private: 859 private:
860 virtual inline Major MajorKey() const FINAL OVERRIDE;
861
863 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 862 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT
864 863
865 virtual Major MajorKey() const OVERRIDE { return CallIC_Array; }
866
867 DISALLOW_COPY_AND_ASSIGN(CallIC_ArrayStub); 864 DISALLOW_COPY_AND_ASSIGN(CallIC_ArrayStub);
868 }; 865 };
869 866
870 867
871 // TODO(verwaest): Translate to hydrogen code stub. 868 // TODO(verwaest): Translate to hydrogen code stub.
872 class FunctionPrototypeStub : public PlatformCodeStub { 869 class FunctionPrototypeStub : public PlatformCodeStub {
873 public: 870 public:
874 explicit FunctionPrototypeStub(Isolate* isolate) 871 explicit FunctionPrototypeStub(Isolate* isolate)
875 : PlatformCodeStub(isolate) {} 872 : PlatformCodeStub(isolate) {}
876 virtual void Generate(MacroAssembler* masm); 873 virtual void Generate(MacroAssembler* masm);
877 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } 874 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
878 875
879 private: 876 private:
880 virtual Major MajorKey() const OVERRIDE { return FunctionPrototype; } 877 virtual inline Major MajorKey() const FINAL OVERRIDE;
881 878
882 DISALLOW_COPY_AND_ASSIGN(FunctionPrototypeStub); 879 DISALLOW_COPY_AND_ASSIGN(FunctionPrototypeStub);
883 }; 880 };
884 881
885 882
886 class HandlerStub : public HydrogenCodeStub { 883 class HandlerStub : public HydrogenCodeStub {
887 public: 884 public:
888 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } 885 virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
889 virtual ExtraICState GetExtraICState() const { return kind(); } 886 virtual ExtraICState GetExtraICState() const { return kind(); }
890 virtual InlineCacheState GetICState() const { return MONOMORPHIC; } 887 virtual InlineCacheState GetICState() const { return MONOMORPHIC; }
(...skipping 23 matching lines...) Expand all
914 int property_index_key = LoadFieldByIndexBits::decode(sub_minor_key()); 911 int property_index_key = LoadFieldByIndexBits::decode(sub_minor_key());
915 return FieldIndex::FromFieldAccessStubKey(property_index_key); 912 return FieldIndex::FromFieldAccessStubKey(property_index_key);
916 } 913 }
917 914
918 protected: 915 protected:
919 explicit LoadFieldStub(Isolate* isolate); 916 explicit LoadFieldStub(Isolate* isolate);
920 virtual Code::Kind kind() const { return Code::LOAD_IC; } 917 virtual Code::Kind kind() const { return Code::LOAD_IC; }
921 virtual Code::StubType GetStubType() { return Code::FAST; } 918 virtual Code::StubType GetStubType() { return Code::FAST; }
922 919
923 private: 920 private:
924 virtual Major MajorKey() const OVERRIDE { return LoadField; } 921 virtual inline Major MajorKey() const FINAL OVERRIDE;
925 922
926 class LoadFieldByIndexBits : public BitField<int, 0, 13> {}; 923 class LoadFieldByIndexBits : public BitField<int, 0, 13> {};
927 924
928 DISALLOW_COPY_AND_ASSIGN(LoadFieldStub); 925 DISALLOW_COPY_AND_ASSIGN(LoadFieldStub);
929 }; 926 };
930 927
931 928
932 class LoadConstantStub : public HandlerStub { 929 class LoadConstantStub : public HandlerStub {
933 public: 930 public:
934 LoadConstantStub(Isolate* isolate, int constant_index) 931 LoadConstantStub(Isolate* isolate, int constant_index)
935 : HandlerStub(isolate) { 932 : HandlerStub(isolate) {
936 set_sub_minor_key(ConstantIndexBits::encode(constant_index)); 933 set_sub_minor_key(ConstantIndexBits::encode(constant_index));
937 } 934 }
938 935
939 virtual Handle<Code> GenerateCode() OVERRIDE; 936 virtual Handle<Code> GenerateCode() OVERRIDE;
940 937
941 int constant_index() const { 938 int constant_index() const {
942 return ConstantIndexBits::decode(sub_minor_key()); 939 return ConstantIndexBits::decode(sub_minor_key());
943 } 940 }
944 941
945 protected: 942 protected:
946 explicit LoadConstantStub(Isolate* isolate); 943 explicit LoadConstantStub(Isolate* isolate);
947 virtual Code::Kind kind() const { return Code::LOAD_IC; } 944 virtual Code::Kind kind() const { return Code::LOAD_IC; }
948 virtual Code::StubType GetStubType() { return Code::FAST; } 945 virtual Code::StubType GetStubType() { return Code::FAST; }
949 946
950 private: 947 private:
951 virtual Major MajorKey() const OVERRIDE { return LoadConstant; } 948 virtual inline Major MajorKey() const FINAL OVERRIDE;
952 949
953 class ConstantIndexBits : public BitField<int, 0, kSubMinorKeyBits> {}; 950 class ConstantIndexBits : public BitField<int, 0, kSubMinorKeyBits> {};
954 951
955 DISALLOW_COPY_AND_ASSIGN(LoadConstantStub); 952 DISALLOW_COPY_AND_ASSIGN(LoadConstantStub);
956 }; 953 };
957 954
958 955
959 class StringLengthStub: public HandlerStub { 956 class StringLengthStub: public HandlerStub {
960 public: 957 public:
961 explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {} 958 explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {}
962 virtual Handle<Code> GenerateCode() OVERRIDE; 959 virtual Handle<Code> GenerateCode() OVERRIDE;
963 960
964 protected: 961 protected:
965 virtual Code::Kind kind() const { return Code::LOAD_IC; } 962 virtual Code::Kind kind() const { return Code::LOAD_IC; }
966 virtual Code::StubType GetStubType() { return Code::FAST; } 963 virtual Code::StubType GetStubType() { return Code::FAST; }
967 964
968 private: 965 private:
969 virtual Major MajorKey() const OVERRIDE { return StringLength; } 966 virtual inline Major MajorKey() const FINAL OVERRIDE;
970 967
971 DISALLOW_COPY_AND_ASSIGN(StringLengthStub); 968 DISALLOW_COPY_AND_ASSIGN(StringLengthStub);
972 }; 969 };
973 970
974 971
975 class StoreFieldStub : public HandlerStub { 972 class StoreFieldStub : public HandlerStub {
976 public: 973 public:
977 StoreFieldStub(Isolate* isolate, FieldIndex index, 974 StoreFieldStub(Isolate* isolate, FieldIndex index,
978 Representation representation) 975 Representation representation)
979 : HandlerStub(isolate) { 976 : HandlerStub(isolate) {
(...skipping 16 matching lines...) Expand all
996 } 993 }
997 994
998 static void InstallDescriptors(Isolate* isolate); 995 static void InstallDescriptors(Isolate* isolate);
999 996
1000 protected: 997 protected:
1001 explicit StoreFieldStub(Isolate* isolate); 998 explicit StoreFieldStub(Isolate* isolate);
1002 virtual Code::Kind kind() const { return Code::STORE_IC; } 999 virtual Code::Kind kind() const { return Code::STORE_IC; }
1003 virtual Code::StubType GetStubType() { return Code::FAST; } 1000 virtual Code::StubType GetStubType() { return Code::FAST; }
1004 1001
1005 private: 1002 private:
1006 virtual Major MajorKey() const OVERRIDE { return StoreField; } 1003 virtual inline Major MajorKey() const FINAL OVERRIDE;
1007 1004
1008 class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; 1005 class StoreFieldByIndexBits : public BitField<int, 0, 13> {};
1009 class RepresentationBits : public BitField<uint8_t, 13, 4> {}; 1006 class RepresentationBits : public BitField<uint8_t, 13, 4> {};
1010 1007
1011 DISALLOW_COPY_AND_ASSIGN(StoreFieldStub); 1008 DISALLOW_COPY_AND_ASSIGN(StoreFieldStub);
1012 }; 1009 };
1013 1010
1014 1011
1015 class StoreGlobalStub : public HandlerStub { 1012 class StoreGlobalStub : public HandlerStub {
1016 public: 1013 public:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 Representation representation() { 1051 Representation representation() {
1055 return Representation::FromKind( 1052 return Representation::FromKind(
1056 RepresentationBits::decode(sub_minor_key())); 1053 RepresentationBits::decode(sub_minor_key()));
1057 } 1054 }
1058 1055
1059 void set_representation(Representation r) { 1056 void set_representation(Representation r) {
1060 set_sub_minor_key(RepresentationBits::update(sub_minor_key(), r.kind())); 1057 set_sub_minor_key(RepresentationBits::update(sub_minor_key(), r.kind()));
1061 } 1058 }
1062 1059
1063 private: 1060 private:
1064 virtual Major MajorKey() const OVERRIDE { return StoreGlobal; } 1061 virtual inline Major MajorKey() const FINAL OVERRIDE;
1065 1062
1066 class IsConstantBits: public BitField<bool, 0, 1> {}; 1063 class IsConstantBits: public BitField<bool, 0, 1> {};
1067 class RepresentationBits: public BitField<Representation::Kind, 1, 8> {}; 1064 class RepresentationBits: public BitField<Representation::Kind, 1, 8> {};
1068 class CheckGlobalBits: public BitField<bool, 9, 1> {}; 1065 class CheckGlobalBits: public BitField<bool, 9, 1> {};
1069 1066
1070 DISALLOW_COPY_AND_ASSIGN(StoreGlobalStub); 1067 DISALLOW_COPY_AND_ASSIGN(StoreGlobalStub);
1071 }; 1068 };
1072 1069
1073 1070
1074 class CallApiFunctionStub : public PlatformCodeStub { 1071 class CallApiFunctionStub : public PlatformCodeStub {
1075 public: 1072 public:
1076 CallApiFunctionStub(Isolate* isolate, 1073 CallApiFunctionStub(Isolate* isolate,
1077 bool is_store, 1074 bool is_store,
1078 bool call_data_undefined, 1075 bool call_data_undefined,
1079 int argc) : PlatformCodeStub(isolate) { 1076 int argc) : PlatformCodeStub(isolate) {
1080 minor_key_ = IsStoreBits::encode(is_store) | 1077 minor_key_ = IsStoreBits::encode(is_store) |
1081 CallDataUndefinedBits::encode(call_data_undefined) | 1078 CallDataUndefinedBits::encode(call_data_undefined) |
1082 ArgumentBits::encode(argc); 1079 ArgumentBits::encode(argc);
1083 DCHECK(!is_store || argc == 1); 1080 DCHECK(!is_store || argc == 1);
1084 } 1081 }
1085 1082
1086 private: 1083 private:
1084 virtual inline Major MajorKey() const FINAL OVERRIDE;
1085
1087 virtual void Generate(MacroAssembler* masm) OVERRIDE; 1086 virtual void Generate(MacroAssembler* masm) OVERRIDE;
1088 virtual Major MajorKey() const OVERRIDE { return CallApiFunction; }
1089 1087
1090 bool is_store() const { return IsStoreBits::decode(minor_key_); } 1088 bool is_store() const { return IsStoreBits::decode(minor_key_); }
1091 bool call_data_undefined() const { 1089 bool call_data_undefined() const {
1092 return CallDataUndefinedBits::decode(minor_key_); 1090 return CallDataUndefinedBits::decode(minor_key_);
1093 } 1091 }
1094 int argc() const { return ArgumentBits::decode(minor_key_); } 1092 int argc() const { return ArgumentBits::decode(minor_key_); }
1095 1093
1096 class IsStoreBits: public BitField<bool, 0, 1> {}; 1094 class IsStoreBits: public BitField<bool, 0, 1> {};
1097 class CallDataUndefinedBits: public BitField<bool, 1, 1> {}; 1095 class CallDataUndefinedBits: public BitField<bool, 1, 1> {};
1098 class ArgumentBits: public BitField<int, 2, Code::kArgumentsBits> {}; 1096 class ArgumentBits: public BitField<int, 2, Code::kArgumentsBits> {};
1099 STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits); 1097 STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits);
1100 1098
1101 DISALLOW_COPY_AND_ASSIGN(CallApiFunctionStub); 1099 DISALLOW_COPY_AND_ASSIGN(CallApiFunctionStub);
1102 }; 1100 };
1103 1101
1104 1102
1105 class CallApiGetterStub : public PlatformCodeStub { 1103 class CallApiGetterStub : public PlatformCodeStub {
1106 public: 1104 public:
1107 explicit CallApiGetterStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 1105 explicit CallApiGetterStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
1108 1106
1109 private: 1107 private:
1110 virtual void Generate(MacroAssembler* masm) OVERRIDE; 1108 virtual void Generate(MacroAssembler* masm) OVERRIDE;
1111 virtual Major MajorKey() const OVERRIDE { return CallApiGetter; } 1109 virtual inline Major MajorKey() const FINAL OVERRIDE;
1112 1110
1113 DISALLOW_COPY_AND_ASSIGN(CallApiGetterStub); 1111 DISALLOW_COPY_AND_ASSIGN(CallApiGetterStub);
1114 }; 1112 };
1115 1113
1116 1114
1117 class BinaryOpICStub : public HydrogenCodeStub { 1115 class BinaryOpICStub : public HydrogenCodeStub {
1118 public: 1116 public:
1119 BinaryOpICStub(Isolate* isolate, Token::Value op, 1117 BinaryOpICStub(Isolate* isolate, Token::Value op,
1120 OverwriteMode mode = NO_OVERWRITE) 1118 OverwriteMode mode = NO_OVERWRITE)
1121 : HydrogenCodeStub(isolate, UNINITIALIZED) { 1119 : HydrogenCodeStub(isolate, UNINITIALIZED) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 return BinaryOpIC::State(isolate(), GetExtraICState()); 1151 return BinaryOpIC::State(isolate(), GetExtraICState());
1154 } 1152 }
1155 1153
1156 virtual void PrintState(OStream& os) const FINAL OVERRIDE; // NOLINT 1154 virtual void PrintState(OStream& os) const FINAL OVERRIDE; // NOLINT
1157 1155
1158 // Parameters accessed via CodeStubGraphBuilder::GetParameter() 1156 // Parameters accessed via CodeStubGraphBuilder::GetParameter()
1159 static const int kLeft = 0; 1157 static const int kLeft = 0;
1160 static const int kRight = 1; 1158 static const int kRight = 1;
1161 1159
1162 private: 1160 private:
1163 virtual Major MajorKey() const OVERRIDE { return BinaryOpIC; } 1161 virtual inline Major MajorKey() const FINAL OVERRIDE;
1164 1162
1165 static void GenerateAheadOfTime(Isolate* isolate, 1163 static void GenerateAheadOfTime(Isolate* isolate,
1166 const BinaryOpIC::State& state); 1164 const BinaryOpIC::State& state);
1167 1165
1168 DISALLOW_COPY_AND_ASSIGN(BinaryOpICStub); 1166 DISALLOW_COPY_AND_ASSIGN(BinaryOpICStub);
1169 }; 1167 };
1170 1168
1171 1169
1172 // TODO(bmeurer): Merge this into the BinaryOpICStub once we have proper tail 1170 // TODO(bmeurer): Merge this into the BinaryOpICStub once we have proper tail
1173 // call support for stubs in Hydrogen. 1171 // call support for stubs in Hydrogen.
(...skipping 22 matching lines...) Expand all
1196 } 1194 }
1197 1195
1198 virtual ExtraICState GetExtraICState() const OVERRIDE { 1196 virtual ExtraICState GetExtraICState() const OVERRIDE {
1199 return static_cast<ExtraICState>(minor_key_); 1197 return static_cast<ExtraICState>(minor_key_);
1200 } 1198 }
1201 1199
1202 virtual void Generate(MacroAssembler* masm) OVERRIDE; 1200 virtual void Generate(MacroAssembler* masm) OVERRIDE;
1203 1201
1204 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 1202 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT
1205 1203
1206 virtual Major MajorKey() const OVERRIDE { 1204 private:
1207 return BinaryOpICWithAllocationSite; 1205 virtual inline Major MajorKey() const FINAL OVERRIDE;
1208 }
1209 1206
1210 private:
1211 BinaryOpIC::State state() const { 1207 BinaryOpIC::State state() const {
1212 return BinaryOpIC::State(isolate(), static_cast<ExtraICState>(minor_key_)); 1208 return BinaryOpIC::State(isolate(), static_cast<ExtraICState>(minor_key_));
1213 } 1209 }
1214 1210
1215 static void GenerateAheadOfTime(Isolate* isolate, 1211 static void GenerateAheadOfTime(Isolate* isolate,
1216 const BinaryOpIC::State& state); 1212 const BinaryOpIC::State& state);
1217 1213
1218 DISALLOW_COPY_AND_ASSIGN(BinaryOpICWithAllocationSiteStub); 1214 DISALLOW_COPY_AND_ASSIGN(BinaryOpICWithAllocationSiteStub);
1219 }; 1215 };
1220 1216
(...skipping 13 matching lines...) Expand all
1234 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 1230 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
1235 1231
1236 static void InstallDescriptors(Isolate* isolate); 1232 static void InstallDescriptors(Isolate* isolate);
1237 1233
1238 virtual Code::Kind GetCodeKind() const FINAL OVERRIDE { 1234 virtual Code::Kind GetCodeKind() const FINAL OVERRIDE {
1239 return Code::STUB; 1235 return Code::STUB;
1240 } 1236 }
1241 1237
1242 virtual Handle<Code> GenerateCode() OVERRIDE; 1238 virtual Handle<Code> GenerateCode() OVERRIDE;
1243 1239
1244 virtual Major MajorKey() const OVERRIDE { 1240 virtual inline Major MajorKey() const FINAL OVERRIDE;
1245 return BinaryOpWithAllocationSite;
1246 }
1247 1241
1248 // Parameters accessed via CodeStubGraphBuilder::GetParameter() 1242 // Parameters accessed via CodeStubGraphBuilder::GetParameter()
1249 static const int kAllocationSite = 0; 1243 static const int kAllocationSite = 0;
1250 static const int kLeft = 1; 1244 static const int kLeft = 1;
1251 static const int kRight = 2; 1245 static const int kRight = 2;
1252 }; 1246 };
1253 1247
1254 1248
1255 enum StringAddFlags { 1249 enum StringAddFlags {
1256 // Omit both parameter checks. 1250 // Omit both parameter checks.
(...skipping 29 matching lines...) Expand all
1286 virtual void InitializeInterfaceDescriptor( 1280 virtual void InitializeInterfaceDescriptor(
1287 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 1281 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
1288 1282
1289 static void InstallDescriptors(Isolate* isolate); 1283 static void InstallDescriptors(Isolate* isolate);
1290 1284
1291 // Parameters accessed via CodeStubGraphBuilder::GetParameter() 1285 // Parameters accessed via CodeStubGraphBuilder::GetParameter()
1292 static const int kLeft = 0; 1286 static const int kLeft = 0;
1293 static const int kRight = 1; 1287 static const int kRight = 1;
1294 1288
1295 private: 1289 private:
1296 virtual Major MajorKey() const OVERRIDE { return StringAdd; } 1290 virtual inline Major MajorKey() const FINAL OVERRIDE;
1297 1291
1298 class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {}; 1292 class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {};
1299 class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {}; 1293 class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {};
1300 1294
1301 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT 1295 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT
1302 1296
1303 DISALLOW_COPY_AND_ASSIGN(StringAddStub); 1297 DISALLOW_COPY_AND_ASSIGN(StringAddStub);
1304 }; 1298 };
1305 1299
1306 1300
1307 class ICCompareStub: public PlatformCodeStub { 1301 class CompareICStub : public PlatformCodeStub {
1308 public: 1302 public:
1309 ICCompareStub(Isolate* isolate, Token::Value op, CompareIC::State left, 1303 CompareICStub(Isolate* isolate, Token::Value op, CompareIC::State left,
1310 CompareIC::State right, CompareIC::State state) 1304 CompareIC::State right, CompareIC::State state)
1311 : PlatformCodeStub(isolate) { 1305 : PlatformCodeStub(isolate) {
1312 DCHECK(Token::IsCompareOp(op)); 1306 DCHECK(Token::IsCompareOp(op));
1313 minor_key_ = OpBits::encode(op - Token::EQ) | LeftStateBits::encode(left) | 1307 minor_key_ = OpBits::encode(op - Token::EQ) | LeftStateBits::encode(left) |
1314 RightStateBits::encode(right) | StateBits::encode(state); 1308 RightStateBits::encode(right) | StateBits::encode(state);
1315 } 1309 }
1316 1310
1317 virtual void Generate(MacroAssembler* masm); 1311 virtual void Generate(MacroAssembler* masm);
1318 1312
1319 void set_known_map(Handle<Map> map) { known_map_ = map; } 1313 void set_known_map(Handle<Map> map) { known_map_ = map; }
1320 1314
1321 explicit ICCompareStub(uint32_t stub_key) : PlatformCodeStub(stub_key) { 1315 explicit CompareICStub(uint32_t stub_key) : PlatformCodeStub(stub_key) {
1322 DCHECK_EQ(MajorKeyFromKey(stub_key), MajorKey()); 1316 DCHECK_EQ(MajorKeyFromKey(stub_key), MajorKey());
1323 } 1317 }
1324 1318
1325 virtual InlineCacheState GetICState() const; 1319 virtual InlineCacheState GetICState() const;
1326 1320
1327 Token::Value op() const { 1321 Token::Value op() const {
1328 return static_cast<Token::Value>(Token::EQ + OpBits::decode(minor_key_)); 1322 return static_cast<Token::Value>(Token::EQ + OpBits::decode(minor_key_));
1329 } 1323 }
1330 1324
1331 CompareIC::State left() const { return LeftStateBits::decode(minor_key_); } 1325 CompareIC::State left() const { return LeftStateBits::decode(minor_key_); }
1332 CompareIC::State right() const { return RightStateBits::decode(minor_key_); } 1326 CompareIC::State right() const { return RightStateBits::decode(minor_key_); }
1333 CompareIC::State state() const { return StateBits::decode(minor_key_); } 1327 CompareIC::State state() const { return StateBits::decode(minor_key_); }
1334 1328
1335 private: 1329 private:
1336 virtual Major MajorKey() const OVERRIDE { return CompareIC; } 1330 virtual inline Major MajorKey() const FINAL OVERRIDE;
1337 1331
1338 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_IC; } 1332 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_IC; }
1339 1333
1340 void GenerateSmis(MacroAssembler* masm); 1334 void GenerateSmis(MacroAssembler* masm);
1341 void GenerateNumbers(MacroAssembler* masm); 1335 void GenerateNumbers(MacroAssembler* masm);
1342 void GenerateInternalizedStrings(MacroAssembler* masm); 1336 void GenerateInternalizedStrings(MacroAssembler* masm);
1343 void GenerateStrings(MacroAssembler* masm); 1337 void GenerateStrings(MacroAssembler* masm);
1344 void GenerateUniqueNames(MacroAssembler* masm); 1338 void GenerateUniqueNames(MacroAssembler* masm);
1345 void GenerateObjects(MacroAssembler* masm); 1339 void GenerateObjects(MacroAssembler* masm);
1346 void GenerateMiss(MacroAssembler* masm); 1340 void GenerateMiss(MacroAssembler* masm);
1347 void GenerateKnownObjects(MacroAssembler* masm); 1341 void GenerateKnownObjects(MacroAssembler* masm);
1348 void GenerateGeneric(MacroAssembler* masm); 1342 void GenerateGeneric(MacroAssembler* masm);
1349 1343
1350 bool strict() const { return op() == Token::EQ_STRICT; } 1344 bool strict() const { return op() == Token::EQ_STRICT; }
1351 Condition GetCondition() const { return CompareIC::ComputeCondition(op()); } 1345 Condition GetCondition() const { return CompareIC::ComputeCondition(op()); }
1352 1346
1353 virtual void AddToSpecialCache(Handle<Code> new_object); 1347 virtual void AddToSpecialCache(Handle<Code> new_object);
1354 virtual bool FindCodeInSpecialCache(Code** code_out); 1348 virtual bool FindCodeInSpecialCache(Code** code_out);
1355 virtual bool UseSpecialCache() { return state() == CompareIC::KNOWN_OBJECT; } 1349 virtual bool UseSpecialCache() { return state() == CompareIC::KNOWN_OBJECT; }
1356 1350
1357 class OpBits : public BitField<int, 0, 3> {}; 1351 class OpBits : public BitField<int, 0, 3> {};
1358 class LeftStateBits : public BitField<CompareIC::State, 3, 4> {}; 1352 class LeftStateBits : public BitField<CompareIC::State, 3, 4> {};
1359 class RightStateBits : public BitField<CompareIC::State, 7, 4> {}; 1353 class RightStateBits : public BitField<CompareIC::State, 7, 4> {};
1360 class StateBits : public BitField<CompareIC::State, 11, 4> {}; 1354 class StateBits : public BitField<CompareIC::State, 11, 4> {};
1361 1355
1362 Handle<Map> known_map_; 1356 Handle<Map> known_map_;
1363 1357
1364 DISALLOW_COPY_AND_ASSIGN(ICCompareStub); 1358 DISALLOW_COPY_AND_ASSIGN(CompareICStub);
1365 }; 1359 };
1366 1360
1367 1361
1368 class CompareNilICStub : public HydrogenCodeStub { 1362 class CompareNilICStub : public HydrogenCodeStub {
1369 public: 1363 public:
1370 Type* GetType(Zone* zone, Handle<Map> map = Handle<Map>()); 1364 Type* GetType(Zone* zone, Handle<Map> map = Handle<Map>());
1371 Type* GetInputType(Zone* zone, Handle<Map> map); 1365 Type* GetInputType(Zone* zone, Handle<Map> map);
1372 1366
1373 CompareNilICStub(Isolate* isolate, NilValue nil) : HydrogenCodeStub(isolate) { 1367 CompareNilICStub(Isolate* isolate, NilValue nil) : HydrogenCodeStub(isolate) {
1374 set_sub_minor_key(NilValueBits::encode(nil)); 1368 set_sub_minor_key(NilValueBits::encode(nil));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1424 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 1418 virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT
1425 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT 1419 virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT
1426 1420
1427 private: 1421 private:
1428 CompareNilICStub(Isolate* isolate, NilValue nil, 1422 CompareNilICStub(Isolate* isolate, NilValue nil,
1429 InitializationState init_state) 1423 InitializationState init_state)
1430 : HydrogenCodeStub(isolate, init_state) { 1424 : HydrogenCodeStub(isolate, init_state) {
1431 set_sub_minor_key(NilValueBits::encode(nil)); 1425 set_sub_minor_key(NilValueBits::encode(nil));
1432 } 1426 }
1433 1427
1434 virtual Major MajorKey() const OVERRIDE { return CompareNilIC; } 1428 virtual inline Major MajorKey() const FINAL OVERRIDE;
1435 1429
1436 enum CompareNilType { 1430 enum CompareNilType {
1437 UNDEFINED, 1431 UNDEFINED,
1438 NULL_TYPE, 1432 NULL_TYPE,
1439 MONOMORPHIC_MAP, 1433 MONOMORPHIC_MAP,
1440 GENERIC, 1434 GENERIC,
1441 NUMBER_OF_TYPES 1435 NUMBER_OF_TYPES
1442 }; 1436 };
1443 1437
1444 // At most 6 different types can be distinguished, because the Code object 1438 // At most 6 different types can be distinguished, because the Code object
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 1475
1482 void Generate(MacroAssembler* masm); 1476 void Generate(MacroAssembler* masm);
1483 1477
1484 // The version of this stub that doesn't save doubles is generated ahead of 1478 // The version of this stub that doesn't save doubles is generated ahead of
1485 // time, so it's OK to call it from other stubs that can't cope with GC during 1479 // time, so it's OK to call it from other stubs that can't cope with GC during
1486 // their code generation. On machines that always have gp registers (x64) we 1480 // their code generation. On machines that always have gp registers (x64) we
1487 // can generate both variants ahead of time. 1481 // can generate both variants ahead of time.
1488 static void GenerateAheadOfTime(Isolate* isolate); 1482 static void GenerateAheadOfTime(Isolate* isolate);
1489 1483
1490 private: 1484 private:
1491 virtual Major MajorKey() const OVERRIDE { return CEntry; } 1485 virtual inline Major MajorKey() const FINAL OVERRIDE;
1492 1486
1493 bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); } 1487 bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); }
1494 #ifdef _WIN64 1488 #ifdef _WIN64
1495 int result_size() const { return ResultSizeBits::decode(minor_key_); } 1489 int result_size() const { return ResultSizeBits::decode(minor_key_); }
1496 #endif // _WIN64 1490 #endif // _WIN64
1497 1491
1498 bool NeedsImmovableCode(); 1492 bool NeedsImmovableCode();
1499 1493
1500 class SaveDoublesBits : public BitField<bool, 0, 1> {}; 1494 class SaveDoublesBits : public BitField<bool, 0, 1> {};
1501 class ResultSizeBits : public BitField<int, 1, 3> {}; 1495 class ResultSizeBits : public BitField<int, 1, 3> {};
1502 1496
1503 DISALLOW_COPY_AND_ASSIGN(CEntryStub); 1497 DISALLOW_COPY_AND_ASSIGN(CEntryStub);
1504 }; 1498 };
1505 1499
1506 1500
1507 class JSEntryStub : public PlatformCodeStub { 1501 class JSEntryStub : public PlatformCodeStub {
1508 public: 1502 public:
1509 explicit JSEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) { } 1503 explicit JSEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
1510 1504
1511 void Generate(MacroAssembler* masm) { GenerateBody(masm, false); } 1505 void Generate(MacroAssembler* masm) { GenerateBody(masm, false); }
1512 1506
1513 protected: 1507 protected:
1514 void GenerateBody(MacroAssembler* masm, bool is_construct); 1508 void GenerateBody(MacroAssembler* masm, bool is_construct);
1515 1509
1516 private: 1510 private:
1517 virtual Major MajorKey() const OVERRIDE { return JSEntry; } 1511 virtual inline Major MajorKey() const FINAL OVERRIDE;
1518 1512
1519 virtual void FinishCode(Handle<Code> code); 1513 virtual void FinishCode(Handle<Code> code);
1520 1514
1521 int handler_offset_; 1515 int handler_offset_;
1522 1516
1523 DISALLOW_COPY_AND_ASSIGN(JSEntryStub); 1517 DISALLOW_COPY_AND_ASSIGN(JSEntryStub);
1524 }; 1518 };
1525 1519
1526 1520
1527 class JSConstructEntryStub : public JSEntryStub { 1521 class JSConstructEntryStub : public JSEntryStub {
(...skipping 20 matching lines...) Expand all
1548 NEW_SLOPPY_FAST, 1542 NEW_SLOPPY_FAST,
1549 NEW_SLOPPY_SLOW, 1543 NEW_SLOPPY_SLOW,
1550 NEW_STRICT 1544 NEW_STRICT
1551 }; 1545 };
1552 1546
1553 ArgumentsAccessStub(Isolate* isolate, Type type) : PlatformCodeStub(isolate) { 1547 ArgumentsAccessStub(Isolate* isolate, Type type) : PlatformCodeStub(isolate) {
1554 minor_key_ = TypeBits::encode(type); 1548 minor_key_ = TypeBits::encode(type);
1555 } 1549 }
1556 1550
1557 private: 1551 private:
1558 virtual Major MajorKey() const OVERRIDE { return ArgumentsAccess; } 1552 virtual inline Major MajorKey() const FINAL OVERRIDE;
1559 1553
1560 Type type() const { return TypeBits::decode(minor_key_); } 1554 Type type() const { return TypeBits::decode(minor_key_); }
1561 1555
1562 void Generate(MacroAssembler* masm); 1556 void Generate(MacroAssembler* masm);
1563 void GenerateReadElement(MacroAssembler* masm); 1557 void GenerateReadElement(MacroAssembler* masm);
1564 void GenerateNewStrict(MacroAssembler* masm); 1558 void GenerateNewStrict(MacroAssembler* masm);
1565 void GenerateNewSloppyFast(MacroAssembler* masm); 1559 void GenerateNewSloppyFast(MacroAssembler* masm);
1566 void GenerateNewSloppySlow(MacroAssembler* masm); 1560 void GenerateNewSloppySlow(MacroAssembler* masm);
1567 1561
1568 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 1562 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT
1569 1563
1570 class TypeBits : public BitField<Type, 0, 2> {}; 1564 class TypeBits : public BitField<Type, 0, 2> {};
1571 1565
1572 DISALLOW_COPY_AND_ASSIGN(ArgumentsAccessStub); 1566 DISALLOW_COPY_AND_ASSIGN(ArgumentsAccessStub);
1573 }; 1567 };
1574 1568
1575 1569
1576 class RegExpExecStub: public PlatformCodeStub { 1570 class RegExpExecStub: public PlatformCodeStub {
1577 public: 1571 public:
1578 explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { } 1572 explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
1579 1573
1580 private: 1574 private:
1581 virtual Major MajorKey() const OVERRIDE { return RegExpExec; } 1575 virtual inline Major MajorKey() const FINAL OVERRIDE;
1582 1576
1583 void Generate(MacroAssembler* masm); 1577 void Generate(MacroAssembler* masm);
1584 1578
1585 DISALLOW_COPY_AND_ASSIGN(RegExpExecStub); 1579 DISALLOW_COPY_AND_ASSIGN(RegExpExecStub);
1586 }; 1580 };
1587 1581
1588 1582
1589 class RegExpConstructResultStub FINAL : public HydrogenCodeStub { 1583 class RegExpConstructResultStub FINAL : public HydrogenCodeStub {
1590 public: 1584 public:
1591 explicit RegExpConstructResultStub(Isolate* isolate) 1585 explicit RegExpConstructResultStub(Isolate* isolate)
1592 : HydrogenCodeStub(isolate) { } 1586 : HydrogenCodeStub(isolate) { }
1593 1587
1594 virtual Handle<Code> GenerateCode() OVERRIDE; 1588 virtual Handle<Code> GenerateCode() OVERRIDE;
1595 1589
1596 virtual void InitializeInterfaceDescriptor( 1590 virtual void InitializeInterfaceDescriptor(
1597 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 1591 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
1598 1592
1599 virtual Major MajorKey() const OVERRIDE { return RegExpConstructResult; } 1593 virtual inline Major MajorKey() const FINAL OVERRIDE;
1600 1594
1601 static void InstallDescriptors(Isolate* isolate); 1595 static void InstallDescriptors(Isolate* isolate);
1602 1596
1603 // Parameters accessed via CodeStubGraphBuilder::GetParameter() 1597 // Parameters accessed via CodeStubGraphBuilder::GetParameter()
1604 static const int kLength = 0; 1598 static const int kLength = 0;
1605 static const int kIndex = 1; 1599 static const int kIndex = 1;
1606 static const int kInput = 2; 1600 static const int kInput = 2;
1607 1601
1608 private: 1602 private:
1609 DISALLOW_COPY_AND_ASSIGN(RegExpConstructResultStub); 1603 DISALLOW_COPY_AND_ASSIGN(RegExpConstructResultStub);
(...skipping 11 matching lines...) Expand all
1621 void Generate(MacroAssembler* masm); 1615 void Generate(MacroAssembler* masm);
1622 1616
1623 static int ExtractArgcFromMinorKey(int minor_key) { 1617 static int ExtractArgcFromMinorKey(int minor_key) {
1624 return ArgcBits::decode(minor_key); 1618 return ArgcBits::decode(minor_key);
1625 } 1619 }
1626 1620
1627 virtual void InitializeInterfaceDescriptor( 1621 virtual void InitializeInterfaceDescriptor(
1628 CodeStubInterfaceDescriptor* descriptor); 1622 CodeStubInterfaceDescriptor* descriptor);
1629 1623
1630 private: 1624 private:
1631 virtual Major MajorKey() const OVERRIDE { return CallFunction; } 1625 virtual inline Major MajorKey() const FINAL OVERRIDE;
1632 1626
1633 int argc() const { return ArgcBits::decode(minor_key_); } 1627 int argc() const { return ArgcBits::decode(minor_key_); }
1634 int flags() const { return FlagBits::decode(minor_key_); } 1628 int flags() const { return FlagBits::decode(minor_key_); }
1635 1629
1636 bool CallAsMethod() const { 1630 bool CallAsMethod() const {
1637 return flags() == CALL_AS_METHOD || flags() == WRAP_AND_CALL; 1631 return flags() == CALL_AS_METHOD || flags() == WRAP_AND_CALL;
1638 } 1632 }
1639 1633
1640 bool NeedsChecks() const { return flags() != WRAP_AND_CALL; } 1634 bool NeedsChecks() const { return flags() != WRAP_AND_CALL; }
1641 1635
(...skipping 18 matching lines...) Expand all
1660 void Generate(MacroAssembler* masm); 1654 void Generate(MacroAssembler* masm);
1661 1655
1662 virtual void FinishCode(Handle<Code> code) { 1656 virtual void FinishCode(Handle<Code> code) {
1663 code->set_has_function_cache(RecordCallTarget()); 1657 code->set_has_function_cache(RecordCallTarget());
1664 } 1658 }
1665 1659
1666 virtual void InitializeInterfaceDescriptor( 1660 virtual void InitializeInterfaceDescriptor(
1667 CodeStubInterfaceDescriptor* descriptor); 1661 CodeStubInterfaceDescriptor* descriptor);
1668 1662
1669 private: 1663 private:
1670 virtual Major MajorKey() const OVERRIDE { return CallConstruct; } 1664 virtual inline Major MajorKey() const FINAL OVERRIDE;
1671 1665
1672 CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); } 1666 CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); }
1673 1667
1674 bool RecordCallTarget() const { 1668 bool RecordCallTarget() const {
1675 return (flags() & RECORD_CONSTRUCTOR_TARGET) != 0; 1669 return (flags() & RECORD_CONSTRUCTOR_TARGET) != 0;
1676 } 1670 }
1677 1671
1678 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 1672 virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT
1679 1673
1680 class FlagBits : public BitField<CallConstructorFlags, 0, 1> {}; 1674 class FlagBits : public BitField<CallConstructorFlags, 0, 1> {};
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1853 StringCharCodeAtGenerator char_code_at_generator_; 1847 StringCharCodeAtGenerator char_code_at_generator_;
1854 StringCharFromCodeGenerator char_from_code_generator_; 1848 StringCharFromCodeGenerator char_from_code_generator_;
1855 1849
1856 DISALLOW_COPY_AND_ASSIGN(StringCharAtGenerator); 1850 DISALLOW_COPY_AND_ASSIGN(StringCharAtGenerator);
1857 }; 1851 };
1858 1852
1859 1853
1860 class LoadDictionaryElementStub : public HydrogenCodeStub { 1854 class LoadDictionaryElementStub : public HydrogenCodeStub {
1861 public: 1855 public:
1862 explicit LoadDictionaryElementStub(Isolate* isolate) 1856 explicit LoadDictionaryElementStub(Isolate* isolate)
1863 : HydrogenCodeStub(isolate) { 1857 : HydrogenCodeStub(isolate) {}
1864 set_sub_minor_key(DICTIONARY_ELEMENTS);
1865 }
1866 1858
1867 virtual Handle<Code> GenerateCode() OVERRIDE; 1859 virtual Handle<Code> GenerateCode() OVERRIDE;
1868 1860
1869 virtual void InitializeInterfaceDescriptor( 1861 virtual void InitializeInterfaceDescriptor(
1870 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 1862 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
1871 1863
1872 private: 1864 private:
1873 virtual Major MajorKey() const OVERRIDE { return LoadElement; } 1865 virtual inline Major MajorKey() const FINAL OVERRIDE;
1874 1866
1875 DISALLOW_COPY_AND_ASSIGN(LoadDictionaryElementStub); 1867 DISALLOW_COPY_AND_ASSIGN(LoadDictionaryElementStub);
1876 }; 1868 };
1877 1869
1878 1870
1879 class LoadDictionaryElementPlatformStub : public PlatformCodeStub {
1880 public:
1881 explicit LoadDictionaryElementPlatformStub(Isolate* isolate)
1882 : PlatformCodeStub(isolate) {
1883 minor_key_ = DICTIONARY_ELEMENTS;
1884 }
1885
1886 void Generate(MacroAssembler* masm);
1887
1888 private:
1889 virtual Major MajorKey() const OVERRIDE { return LoadElement; }
1890
1891 DISALLOW_COPY_AND_ASSIGN(LoadDictionaryElementPlatformStub);
1892 };
1893
1894
1895 class KeyedLoadGenericStub : public HydrogenCodeStub { 1871 class KeyedLoadGenericStub : public HydrogenCodeStub {
1896 public: 1872 public:
1897 explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} 1873 explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {}
1898 1874
1899 virtual Handle<Code> GenerateCode() OVERRIDE; 1875 virtual Handle<Code> GenerateCode() OVERRIDE;
1900 1876
1901 virtual void InitializeInterfaceDescriptor( 1877 virtual void InitializeInterfaceDescriptor(
1902 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 1878 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
1903 1879
1904 static void InstallDescriptors(Isolate* isolate); 1880 static void InstallDescriptors(Isolate* isolate);
1905 1881
1906 virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } 1882 virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; }
1907 virtual InlineCacheState GetICState() const { return GENERIC; } 1883 virtual InlineCacheState GetICState() const { return GENERIC; }
1908 1884
1909 private: 1885 private:
1910 virtual Major MajorKey() const OVERRIDE { return KeyedLoadGeneric; } 1886 virtual inline Major MajorKey() const FINAL OVERRIDE;
1911 1887
1912 DISALLOW_COPY_AND_ASSIGN(KeyedLoadGenericStub); 1888 DISALLOW_COPY_AND_ASSIGN(KeyedLoadGenericStub);
1913 }; 1889 };
1914 1890
1915 1891
1916 class LoadICTrampolineStub : public PlatformCodeStub { 1892 class LoadICTrampolineStub : public PlatformCodeStub {
1917 public: 1893 public:
1918 LoadICTrampolineStub(Isolate* isolate, const LoadIC::State& state) 1894 LoadICTrampolineStub(Isolate* isolate, const LoadIC::State& state)
1919 : PlatformCodeStub(isolate) { 1895 : PlatformCodeStub(isolate) {
1920 minor_key_ = state.GetExtraICState(); 1896 minor_key_ = state.GetExtraICState();
1921 } 1897 }
1922 1898
1923 virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; } 1899 virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; }
1924 1900
1925 virtual InlineCacheState GetICState() const FINAL OVERRIDE { 1901 virtual InlineCacheState GetICState() const FINAL OVERRIDE {
1926 return GENERIC; 1902 return GENERIC;
1927 } 1903 }
1928 1904
1929 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 1905 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE {
1930 return static_cast<ExtraICState>(minor_key_); 1906 return static_cast<ExtraICState>(minor_key_);
1931 } 1907 }
1932 1908
1933 virtual Major MajorKey() const OVERRIDE { return LoadICTrampoline; } 1909 virtual inline Major MajorKey() const FINAL OVERRIDE;
1934 1910
1935 private: 1911 private:
1936 LoadIC::State state() const { 1912 LoadIC::State state() const {
1937 return LoadIC::State(static_cast<ExtraICState>(minor_key_)); 1913 return LoadIC::State(static_cast<ExtraICState>(minor_key_));
1938 } 1914 }
1939 1915
1940 virtual void Generate(MacroAssembler* masm); 1916 virtual void Generate(MacroAssembler* masm);
1941 1917
1942 DISALLOW_COPY_AND_ASSIGN(LoadICTrampolineStub); 1918 DISALLOW_COPY_AND_ASSIGN(LoadICTrampolineStub);
1943 }; 1919 };
1944 1920
1945 1921
1946 class KeyedLoadICTrampolineStub : public LoadICTrampolineStub { 1922 class KeyedLoadICTrampolineStub : public LoadICTrampolineStub {
1947 public: 1923 public:
1948 explicit KeyedLoadICTrampolineStub(Isolate* isolate) 1924 explicit KeyedLoadICTrampolineStub(Isolate* isolate)
1949 : LoadICTrampolineStub(isolate, LoadIC::State(0)) {} 1925 : LoadICTrampolineStub(isolate, LoadIC::State(0)) {}
1950 1926
1951 virtual Code::Kind GetCodeKind() const OVERRIDE { 1927 virtual Code::Kind GetCodeKind() const OVERRIDE {
1952 return Code::KEYED_LOAD_IC; 1928 return Code::KEYED_LOAD_IC;
1953 } 1929 }
1954 1930
1955 virtual Major MajorKey() const OVERRIDE { return KeyedLoadICTrampoline; } 1931 virtual inline Major MajorKey() const FINAL OVERRIDE;
1956 1932
1957 private: 1933 private:
1958 virtual void Generate(MacroAssembler* masm); 1934 virtual void Generate(MacroAssembler* masm);
1959 1935
1960 DISALLOW_COPY_AND_ASSIGN(KeyedLoadICTrampolineStub); 1936 DISALLOW_COPY_AND_ASSIGN(KeyedLoadICTrampolineStub);
1961 }; 1937 };
1962 1938
1963 1939
1964 class VectorLoadStub : public HydrogenCodeStub { 1940 class VectorLoadStub : public HydrogenCodeStub {
1965 public: 1941 public:
(...skipping 13 matching lines...) Expand all
1979 1955
1980 virtual InlineCacheState GetICState() const FINAL OVERRIDE { 1956 virtual InlineCacheState GetICState() const FINAL OVERRIDE {
1981 return GENERIC; 1957 return GENERIC;
1982 } 1958 }
1983 1959
1984 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 1960 virtual ExtraICState GetExtraICState() const FINAL OVERRIDE {
1985 return static_cast<ExtraICState>(sub_minor_key()); 1961 return static_cast<ExtraICState>(sub_minor_key());
1986 } 1962 }
1987 1963
1988 private: 1964 private:
1989 virtual Major MajorKey() const OVERRIDE { return VectorLoad; } 1965 virtual inline Major MajorKey() const FINAL OVERRIDE;
1990 1966
1991 LoadIC::State state() const { return LoadIC::State(GetExtraICState()); } 1967 LoadIC::State state() const { return LoadIC::State(GetExtraICState()); }
1992 1968
1993 DISALLOW_COPY_AND_ASSIGN(VectorLoadStub); 1969 DISALLOW_COPY_AND_ASSIGN(VectorLoadStub);
1994 }; 1970 };
1995 1971
1996 1972
1997 class VectorKeyedLoadStub : public VectorLoadStub { 1973 class VectorKeyedLoadStub : public VectorLoadStub {
1998 public: 1974 public:
1999 explicit VectorKeyedLoadStub(Isolate* isolate) 1975 explicit VectorKeyedLoadStub(Isolate* isolate)
2000 : VectorLoadStub(isolate, LoadIC::State(0)) {} 1976 : VectorLoadStub(isolate, LoadIC::State(0)) {}
2001 1977
2002 virtual Handle<Code> GenerateCode() OVERRIDE; 1978 virtual Handle<Code> GenerateCode() OVERRIDE;
2003 1979
2004 virtual void InitializeInterfaceDescriptor( 1980 virtual void InitializeInterfaceDescriptor(
2005 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 1981 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2006 1982
2007 static void InstallDescriptors(Isolate* isolate); 1983 static void InstallDescriptors(Isolate* isolate);
2008 1984
2009 virtual Code::Kind GetCodeKind() const OVERRIDE { 1985 virtual Code::Kind GetCodeKind() const OVERRIDE {
2010 return Code::KEYED_LOAD_IC; 1986 return Code::KEYED_LOAD_IC;
2011 } 1987 }
2012 1988
2013 virtual Major MajorKey() const OVERRIDE { return VectorKeyedLoad; } 1989 private:
1990 virtual inline Major MajorKey() const FINAL OVERRIDE;
2014 1991
2015 private:
2016 DISALLOW_COPY_AND_ASSIGN(VectorKeyedLoadStub); 1992 DISALLOW_COPY_AND_ASSIGN(VectorKeyedLoadStub);
2017 }; 1993 };
2018 1994
2019 1995
2020 class DoubleToIStub : public PlatformCodeStub { 1996 class DoubleToIStub : public PlatformCodeStub {
2021 public: 1997 public:
2022 DoubleToIStub(Isolate* isolate, Register source, Register destination, 1998 DoubleToIStub(Isolate* isolate, Register source, Register destination,
2023 int offset, bool is_truncating, bool skip_fastpath = false) 1999 int offset, bool is_truncating, bool skip_fastpath = false)
2024 : PlatformCodeStub(isolate) { 2000 : PlatformCodeStub(isolate) {
2025 minor_key_ = SourceRegisterBits::encode(source.code()) | 2001 minor_key_ = SourceRegisterBits::encode(source.code()) |
2026 DestinationRegisterBits::encode(destination.code()) | 2002 DestinationRegisterBits::encode(destination.code()) |
2027 OffsetBits::encode(offset) | 2003 OffsetBits::encode(offset) |
2028 IsTruncatingBits::encode(is_truncating) | 2004 IsTruncatingBits::encode(is_truncating) |
2029 SkipFastPathBits::encode(skip_fastpath) | 2005 SkipFastPathBits::encode(skip_fastpath) |
2030 SSE3Bits::encode(CpuFeatures::IsSupported(SSE3) ? 1 : 0); 2006 SSE3Bits::encode(CpuFeatures::IsSupported(SSE3) ? 1 : 0);
2031 } 2007 }
2032 2008
2033 void Generate(MacroAssembler* masm); 2009 void Generate(MacroAssembler* masm);
2034 2010
2035 virtual bool SometimesSetsUpAFrame() { return false; } 2011 virtual bool SometimesSetsUpAFrame() { return false; }
2036 2012
2037 private: 2013 private:
2038 virtual Major MajorKey() const OVERRIDE { return DoubleToI; } 2014 virtual inline Major MajorKey() const FINAL OVERRIDE;
2039 2015
2040 Register source() const { 2016 Register source() const {
2041 return Register::from_code(SourceRegisterBits::decode(minor_key_)); 2017 return Register::from_code(SourceRegisterBits::decode(minor_key_));
2042 } 2018 }
2043 Register destination() const { 2019 Register destination() const {
2044 return Register::from_code(DestinationRegisterBits::decode(minor_key_)); 2020 return Register::from_code(DestinationRegisterBits::decode(minor_key_));
2045 } 2021 }
2046 bool is_truncating() const { return IsTruncatingBits::decode(minor_key_); } 2022 bool is_truncating() const { return IsTruncatingBits::decode(minor_key_); }
2047 bool skip_fastpath() const { return SkipFastPathBits::decode(minor_key_); } 2023 bool skip_fastpath() const { return SkipFastPathBits::decode(minor_key_); }
2048 int offset() const { return OffsetBits::decode(minor_key_); } 2024 int offset() const { return OffsetBits::decode(minor_key_); }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2083 } 2059 }
2084 2060
2085 virtual Handle<Code> GenerateCode() OVERRIDE; 2061 virtual Handle<Code> GenerateCode() OVERRIDE;
2086 2062
2087 static void InstallDescriptors(Isolate* isolate); 2063 static void InstallDescriptors(Isolate* isolate);
2088 2064
2089 virtual void InitializeInterfaceDescriptor( 2065 virtual void InitializeInterfaceDescriptor(
2090 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2066 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2091 2067
2092 private: 2068 private:
2093 virtual Major MajorKey() const OVERRIDE { return LoadElement; } 2069 virtual inline Major MajorKey() const FINAL OVERRIDE;
2094 2070
2095 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; 2071 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {};
2096 class IsJSArrayBits: public BitField<bool, 8, 1> {}; 2072 class IsJSArrayBits: public BitField<bool, 8, 1> {};
2097 2073
2098 DISALLOW_COPY_AND_ASSIGN(LoadFastElementStub); 2074 DISALLOW_COPY_AND_ASSIGN(LoadFastElementStub);
2099 }; 2075 };
2100 2076
2101 2077
2102 class StoreFastElementStub : public HydrogenCodeStub { 2078 class StoreFastElementStub : public HydrogenCodeStub {
2103 public: 2079 public:
(...skipping 14 matching lines...) Expand all
2118 KeyedAccessStoreMode store_mode() const { 2094 KeyedAccessStoreMode store_mode() const {
2119 return StoreModeBits::decode(sub_minor_key()); 2095 return StoreModeBits::decode(sub_minor_key());
2120 } 2096 }
2121 2097
2122 virtual Handle<Code> GenerateCode() OVERRIDE; 2098 virtual Handle<Code> GenerateCode() OVERRIDE;
2123 2099
2124 virtual void InitializeInterfaceDescriptor( 2100 virtual void InitializeInterfaceDescriptor(
2125 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2101 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2126 2102
2127 private: 2103 private:
2128 virtual Major MajorKey() const OVERRIDE { return StoreElement; } 2104 virtual inline Major MajorKey() const FINAL OVERRIDE;
2129 2105
2130 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; 2106 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {};
2131 class StoreModeBits: public BitField<KeyedAccessStoreMode, 8, 4> {}; 2107 class StoreModeBits: public BitField<KeyedAccessStoreMode, 8, 4> {};
2132 class IsJSArrayBits: public BitField<bool, 12, 1> {}; 2108 class IsJSArrayBits: public BitField<bool, 12, 1> {};
2133 2109
2134 DISALLOW_COPY_AND_ASSIGN(StoreFastElementStub); 2110 DISALLOW_COPY_AND_ASSIGN(StoreFastElementStub);
2135 }; 2111 };
2136 2112
2137 2113
2138 class TransitionElementsKindStub : public HydrogenCodeStub { 2114 class TransitionElementsKindStub : public HydrogenCodeStub {
(...skipping 14 matching lines...) Expand all
2153 ElementsKind to_kind() const { return ToKindBits::decode(sub_minor_key()); } 2129 ElementsKind to_kind() const { return ToKindBits::decode(sub_minor_key()); }
2154 2130
2155 bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); } 2131 bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); }
2156 2132
2157 virtual Handle<Code> GenerateCode() OVERRIDE; 2133 virtual Handle<Code> GenerateCode() OVERRIDE;
2158 2134
2159 virtual void InitializeInterfaceDescriptor( 2135 virtual void InitializeInterfaceDescriptor(
2160 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2136 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2161 2137
2162 private: 2138 private:
2163 virtual Major MajorKey() const OVERRIDE { return TransitionElementsKind; } 2139 virtual inline Major MajorKey() const FINAL OVERRIDE;
2164 2140
2165 class FromKindBits: public BitField<ElementsKind, 8, 8> {}; 2141 class FromKindBits: public BitField<ElementsKind, 8, 8> {};
2166 class ToKindBits: public BitField<ElementsKind, 0, 8> {}; 2142 class ToKindBits: public BitField<ElementsKind, 0, 8> {};
2167 class IsJSArrayBits: public BitField<bool, 16, 1> {}; 2143 class IsJSArrayBits: public BitField<bool, 16, 1> {};
2168 2144
2169 DISALLOW_COPY_AND_ASSIGN(TransitionElementsKindStub); 2145 DISALLOW_COPY_AND_ASSIGN(TransitionElementsKindStub);
2170 }; 2146 };
2171 2147
2172 2148
2173 class ArrayConstructorStubBase : public HydrogenCodeStub { 2149 class ArrayConstructorStubBase : public HydrogenCodeStub {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2223 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) 2199 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE)
2224 : ArrayConstructorStubBase(isolate, kind, override_mode) { 2200 : ArrayConstructorStubBase(isolate, kind, override_mode) {
2225 } 2201 }
2226 2202
2227 virtual Handle<Code> GenerateCode() OVERRIDE; 2203 virtual Handle<Code> GenerateCode() OVERRIDE;
2228 2204
2229 virtual void InitializeInterfaceDescriptor( 2205 virtual void InitializeInterfaceDescriptor(
2230 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2206 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2231 2207
2232 private: 2208 private:
2233 virtual Major MajorKey() const OVERRIDE { 2209 virtual inline Major MajorKey() const FINAL OVERRIDE;
2234 return ArrayNoArgumentConstructor;
2235 }
2236 2210
2237 virtual void PrintName(OStream& os) const OVERRIDE { // NOLINT 2211 virtual void PrintName(OStream& os) const OVERRIDE { // NOLINT
2238 BasePrintName(os, "ArrayNoArgumentConstructorStub"); 2212 BasePrintName(os, "ArrayNoArgumentConstructorStub");
2239 } 2213 }
2240 2214
2241 DISALLOW_COPY_AND_ASSIGN(ArrayNoArgumentConstructorStub); 2215 DISALLOW_COPY_AND_ASSIGN(ArrayNoArgumentConstructorStub);
2242 }; 2216 };
2243 2217
2244 2218
2245 class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { 2219 class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase {
2246 public: 2220 public:
2247 ArraySingleArgumentConstructorStub( 2221 ArraySingleArgumentConstructorStub(
2248 Isolate* isolate, 2222 Isolate* isolate,
2249 ElementsKind kind, 2223 ElementsKind kind,
2250 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) 2224 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE)
2251 : ArrayConstructorStubBase(isolate, kind, override_mode) { 2225 : ArrayConstructorStubBase(isolate, kind, override_mode) {
2252 } 2226 }
2253 2227
2254 virtual Handle<Code> GenerateCode() OVERRIDE; 2228 virtual Handle<Code> GenerateCode() OVERRIDE;
2255 2229
2256 virtual void InitializeInterfaceDescriptor( 2230 virtual void InitializeInterfaceDescriptor(
2257 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2231 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2258 2232
2259 private: 2233 private:
2260 virtual Major MajorKey() const OVERRIDE { 2234 virtual inline Major MajorKey() const FINAL OVERRIDE;
2261 return ArraySingleArgumentConstructor;
2262 }
2263 2235
2264 virtual void PrintName(OStream& os) const { // NOLINT 2236 virtual void PrintName(OStream& os) const { // NOLINT
2265 BasePrintName(os, "ArraySingleArgumentConstructorStub"); 2237 BasePrintName(os, "ArraySingleArgumentConstructorStub");
2266 } 2238 }
2267 2239
2268 DISALLOW_COPY_AND_ASSIGN(ArraySingleArgumentConstructorStub); 2240 DISALLOW_COPY_AND_ASSIGN(ArraySingleArgumentConstructorStub);
2269 }; 2241 };
2270 2242
2271 2243
2272 class ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase { 2244 class ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase {
2273 public: 2245 public:
2274 ArrayNArgumentsConstructorStub( 2246 ArrayNArgumentsConstructorStub(
2275 Isolate* isolate, 2247 Isolate* isolate,
2276 ElementsKind kind, 2248 ElementsKind kind,
2277 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) 2249 AllocationSiteOverrideMode override_mode = DONT_OVERRIDE)
2278 : ArrayConstructorStubBase(isolate, kind, override_mode) { 2250 : ArrayConstructorStubBase(isolate, kind, override_mode) {
2279 } 2251 }
2280 2252
2281 virtual Handle<Code> GenerateCode() OVERRIDE; 2253 virtual Handle<Code> GenerateCode() OVERRIDE;
2282 2254
2283 virtual void InitializeInterfaceDescriptor( 2255 virtual void InitializeInterfaceDescriptor(
2284 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2256 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2285 2257
2286 private: 2258 private:
2287 virtual Major MajorKey() const OVERRIDE { 2259 virtual inline Major MajorKey() const FINAL OVERRIDE;
2288 return ArrayNArgumentsConstructor;
2289 }
2290 2260
2291 virtual void PrintName(OStream& os) const { // NOLINT 2261 virtual void PrintName(OStream& os) const { // NOLINT
2292 BasePrintName(os, "ArrayNArgumentsConstructorStub"); 2262 BasePrintName(os, "ArrayNArgumentsConstructorStub");
2293 } 2263 }
2294 2264
2295 DISALLOW_COPY_AND_ASSIGN(ArrayNArgumentsConstructorStub); 2265 DISALLOW_COPY_AND_ASSIGN(ArrayNArgumentsConstructorStub);
2296 }; 2266 };
2297 2267
2298 2268
2299 class InternalArrayConstructorStubBase : public HydrogenCodeStub { 2269 class InternalArrayConstructorStubBase : public HydrogenCodeStub {
(...skipping 26 matching lines...) Expand all
2326 InternalArrayNoArgumentConstructorStub(Isolate* isolate, 2296 InternalArrayNoArgumentConstructorStub(Isolate* isolate,
2327 ElementsKind kind) 2297 ElementsKind kind)
2328 : InternalArrayConstructorStubBase(isolate, kind) { } 2298 : InternalArrayConstructorStubBase(isolate, kind) { }
2329 2299
2330 virtual Handle<Code> GenerateCode() OVERRIDE; 2300 virtual Handle<Code> GenerateCode() OVERRIDE;
2331 2301
2332 virtual void InitializeInterfaceDescriptor( 2302 virtual void InitializeInterfaceDescriptor(
2333 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2303 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2334 2304
2335 private: 2305 private:
2336 virtual Major MajorKey() const OVERRIDE { 2306 virtual inline Major MajorKey() const FINAL OVERRIDE;
2337 return InternalArrayNoArgumentConstructor;
2338 }
2339 2307
2340 DISALLOW_COPY_AND_ASSIGN(InternalArrayNoArgumentConstructorStub); 2308 DISALLOW_COPY_AND_ASSIGN(InternalArrayNoArgumentConstructorStub);
2341 }; 2309 };
2342 2310
2343 2311
2344 class InternalArraySingleArgumentConstructorStub : public 2312 class InternalArraySingleArgumentConstructorStub : public
2345 InternalArrayConstructorStubBase { 2313 InternalArrayConstructorStubBase {
2346 public: 2314 public:
2347 InternalArraySingleArgumentConstructorStub(Isolate* isolate, 2315 InternalArraySingleArgumentConstructorStub(Isolate* isolate,
2348 ElementsKind kind) 2316 ElementsKind kind)
2349 : InternalArrayConstructorStubBase(isolate, kind) { } 2317 : InternalArrayConstructorStubBase(isolate, kind) { }
2350 2318
2351 virtual Handle<Code> GenerateCode() OVERRIDE; 2319 virtual Handle<Code> GenerateCode() OVERRIDE;
2352 2320
2353 virtual void InitializeInterfaceDescriptor( 2321 virtual void InitializeInterfaceDescriptor(
2354 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2322 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2355 2323
2356 private: 2324 private:
2357 virtual Major MajorKey() const OVERRIDE { 2325 virtual inline Major MajorKey() const FINAL OVERRIDE;
2358 return InternalArraySingleArgumentConstructor;
2359 }
2360 2326
2361 DISALLOW_COPY_AND_ASSIGN(InternalArraySingleArgumentConstructorStub); 2327 DISALLOW_COPY_AND_ASSIGN(InternalArraySingleArgumentConstructorStub);
2362 }; 2328 };
2363 2329
2364 2330
2365 class InternalArrayNArgumentsConstructorStub : public 2331 class InternalArrayNArgumentsConstructorStub : public
2366 InternalArrayConstructorStubBase { 2332 InternalArrayConstructorStubBase {
2367 public: 2333 public:
2368 InternalArrayNArgumentsConstructorStub(Isolate* isolate, ElementsKind kind) 2334 InternalArrayNArgumentsConstructorStub(Isolate* isolate, ElementsKind kind)
2369 : InternalArrayConstructorStubBase(isolate, kind) { } 2335 : InternalArrayConstructorStubBase(isolate, kind) { }
2370 2336
2371 virtual Handle<Code> GenerateCode() OVERRIDE; 2337 virtual Handle<Code> GenerateCode() OVERRIDE;
2372 2338
2373 virtual void InitializeInterfaceDescriptor( 2339 virtual void InitializeInterfaceDescriptor(
2374 CodeStubInterfaceDescriptor* descriptor) OVERRIDE; 2340 CodeStubInterfaceDescriptor* descriptor) OVERRIDE;
2375 2341
2376 private: 2342 private:
2377 virtual Major MajorKey() const OVERRIDE { 2343 virtual inline Major MajorKey() const FINAL OVERRIDE;
2378 return InternalArrayNArgumentsConstructor;
2379 }
2380 2344
2381 DISALLOW_COPY_AND_ASSIGN(InternalArrayNArgumentsConstructorStub); 2345 DISALLOW_COPY_AND_ASSIGN(InternalArrayNArgumentsConstructorStub);
2382 }; 2346 };
2383 2347
2384 2348
2385 class StoreElementStub : public PlatformCodeStub { 2349 class StoreElementStub : public PlatformCodeStub {
2386 public: 2350 public:
2387 StoreElementStub(Isolate* isolate, ElementsKind elements_kind) 2351 StoreElementStub(Isolate* isolate, ElementsKind elements_kind)
2388 : PlatformCodeStub(isolate) { 2352 : PlatformCodeStub(isolate) {
2389 minor_key_ = ElementsKindBits::encode(elements_kind); 2353 minor_key_ = ElementsKindBits::encode(elements_kind);
2390 } 2354 }
2391 2355
2392 void Generate(MacroAssembler* masm); 2356 void Generate(MacroAssembler* masm);
2393 2357
2394 private: 2358 private:
2395 virtual Major MajorKey() const OVERRIDE { return StoreElement; } 2359 virtual inline Major MajorKey() const FINAL OVERRIDE;
2396 2360
2397 ElementsKind elements_kind() const { 2361 ElementsKind elements_kind() const {
2398 return ElementsKindBits::decode(minor_key_); 2362 return ElementsKindBits::decode(minor_key_);
2399 } 2363 }
2400 2364
2401 class ElementsKindBits : public BitField<ElementsKind, 0, 8> {}; 2365 class ElementsKindBits : public BitField<ElementsKind, 0, 8> {};
2402 2366
2403 DISALLOW_COPY_AND_ASSIGN(StoreElementStub); 2367 DISALLOW_COPY_AND_ASSIGN(StoreElementStub);
2404 }; 2368 };
2405 2369
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 2445
2482 virtual InlineCacheState GetICState() const { 2446 virtual InlineCacheState GetICState() const {
2483 if (types().IsEmpty()) { 2447 if (types().IsEmpty()) {
2484 return ::v8::internal::UNINITIALIZED; 2448 return ::v8::internal::UNINITIALIZED;
2485 } else { 2449 } else {
2486 return MONOMORPHIC; 2450 return MONOMORPHIC;
2487 } 2451 }
2488 } 2452 }
2489 2453
2490 private: 2454 private:
2491 virtual Major MajorKey() const OVERRIDE { return ToBoolean; }
2492
2493 ToBooleanStub(Isolate* isolate, InitializationState init_state) 2455 ToBooleanStub(Isolate* isolate, InitializationState init_state)
2494 : HydrogenCodeStub(isolate, init_state) { 2456 : HydrogenCodeStub(isolate, init_state) {
2495 set_sub_minor_key(ResultModeBits::encode(RESULT_AS_SMI)); 2457 set_sub_minor_key(ResultModeBits::encode(RESULT_AS_SMI));
2496 } 2458 }
2497 2459
2460 virtual inline Major MajorKey() const FINAL OVERRIDE;
2461
2498 class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {}; 2462 class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {};
2499 class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {}; 2463 class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {};
2500 2464
2501 DISALLOW_COPY_AND_ASSIGN(ToBooleanStub); 2465 DISALLOW_COPY_AND_ASSIGN(ToBooleanStub);
2502 }; 2466 };
2503 2467
2504 2468
2505 OStream& operator<<(OStream& os, const ToBooleanStub::Types& t); 2469 OStream& operator<<(OStream& os, const ToBooleanStub::Types& t);
2506 2470
2507 2471
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2544 return ElementTransitionAndStoreDescriptor::MapRegister(); 2508 return ElementTransitionAndStoreDescriptor::MapRegister();
2545 } 2509 }
2546 static const Register KeyRegister() { 2510 static const Register KeyRegister() {
2547 return ElementTransitionAndStoreDescriptor::NameRegister(); 2511 return ElementTransitionAndStoreDescriptor::NameRegister();
2548 } 2512 }
2549 static const Register ObjectRegister() { 2513 static const Register ObjectRegister() {
2550 return ElementTransitionAndStoreDescriptor::ReceiverRegister(); 2514 return ElementTransitionAndStoreDescriptor::ReceiverRegister();
2551 } 2515 }
2552 2516
2553 private: 2517 private:
2554 virtual Major MajorKey() const OVERRIDE { 2518 virtual inline Major MajorKey() const FINAL OVERRIDE;
2555 return ElementsTransitionAndStore;
2556 }
2557 2519
2558 class FromBits : public BitField<ElementsKind, 0, 8> {}; 2520 class FromBits : public BitField<ElementsKind, 0, 8> {};
2559 class ToBits : public BitField<ElementsKind, 8, 8> {}; 2521 class ToBits : public BitField<ElementsKind, 8, 8> {};
2560 class IsJSArrayBits : public BitField<bool, 16, 1> {}; 2522 class IsJSArrayBits : public BitField<bool, 16, 1> {};
2561 class StoreModeBits : public BitField<KeyedAccessStoreMode, 17, 4> {}; 2523 class StoreModeBits : public BitField<KeyedAccessStoreMode, 17, 4> {};
2562 2524
2563 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub); 2525 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub);
2564 }; 2526 };
2565 2527
2566 2528
2567 class StoreArrayLiteralElementStub : public PlatformCodeStub { 2529 class StoreArrayLiteralElementStub : public PlatformCodeStub {
2568 public: 2530 public:
2569 explicit StoreArrayLiteralElementStub(Isolate* isolate) 2531 explicit StoreArrayLiteralElementStub(Isolate* isolate)
2570 : PlatformCodeStub(isolate) { } 2532 : PlatformCodeStub(isolate) { }
2571 2533
2572 private: 2534 private:
2573 virtual Major MajorKey() const OVERRIDE { 2535 virtual inline Major MajorKey() const FINAL OVERRIDE;
2574 return StoreArrayLiteralElement;
2575 }
2576 2536
2577 void Generate(MacroAssembler* masm); 2537 void Generate(MacroAssembler* masm);
2578 2538
2579 DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub); 2539 DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub);
2580 }; 2540 };
2581 2541
2582 2542
2583 class StubFailureTrampolineStub : public PlatformCodeStub { 2543 class StubFailureTrampolineStub : public PlatformCodeStub {
2584 public: 2544 public:
2585 StubFailureTrampolineStub(Isolate* isolate, StubFunctionMode function_mode) 2545 StubFailureTrampolineStub(Isolate* isolate, StubFunctionMode function_mode)
2586 : PlatformCodeStub(isolate) { 2546 : PlatformCodeStub(isolate) {
2587 minor_key_ = FunctionModeField::encode(function_mode); 2547 minor_key_ = FunctionModeField::encode(function_mode);
2588 } 2548 }
2589 2549
2590 static void GenerateAheadOfTime(Isolate* isolate); 2550 static void GenerateAheadOfTime(Isolate* isolate);
2591 2551
2592 private: 2552 private:
2593 virtual Major MajorKey() const OVERRIDE { return StubFailureTrampoline; } 2553 virtual inline Major MajorKey() const FINAL OVERRIDE;
2594 2554
2595 StubFunctionMode function_mode() const { 2555 StubFunctionMode function_mode() const {
2596 return FunctionModeField::decode(minor_key_); 2556 return FunctionModeField::decode(minor_key_);
2597 } 2557 }
2598 2558
2599 void Generate(MacroAssembler* masm); 2559 void Generate(MacroAssembler* masm);
2600 2560
2601 class FunctionModeField : public BitField<StubFunctionMode, 0, 1> {}; 2561 class FunctionModeField : public BitField<StubFunctionMode, 0, 1> {};
2602 2562
2603 DISALLOW_COPY_AND_ASSIGN(StubFailureTrampolineStub); 2563 DISALLOW_COPY_AND_ASSIGN(StubFailureTrampolineStub);
2604 }; 2564 };
2605 2565
2606 2566
2607 class ProfileEntryHookStub : public PlatformCodeStub { 2567 class ProfileEntryHookStub : public PlatformCodeStub {
2608 public: 2568 public:
2609 explicit ProfileEntryHookStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 2569 explicit ProfileEntryHookStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
2610 2570
2611 // The profile entry hook function is not allowed to cause a GC. 2571 // The profile entry hook function is not allowed to cause a GC.
2612 virtual bool SometimesSetsUpAFrame() { return false; } 2572 virtual bool SometimesSetsUpAFrame() { return false; }
2613 2573
2614 // Generates a call to the entry hook if it's enabled. 2574 // Generates a call to the entry hook if it's enabled.
2615 static void MaybeCallEntryHook(MacroAssembler* masm); 2575 static void MaybeCallEntryHook(MacroAssembler* masm);
2616 2576
2617 private: 2577 private:
2618 static void EntryHookTrampoline(intptr_t function, 2578 static void EntryHookTrampoline(intptr_t function,
2619 intptr_t stack_pointer, 2579 intptr_t stack_pointer,
2620 Isolate* isolate); 2580 Isolate* isolate);
2621 2581
2622 virtual Major MajorKey() const OVERRIDE { return ProfileEntryHook; } 2582 virtual inline Major MajorKey() const FINAL OVERRIDE;
2623 2583
2624 void Generate(MacroAssembler* masm); 2584 void Generate(MacroAssembler* masm);
2625 2585
2626 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); 2586 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub);
2627 }; 2587 };
2628 2588
2629 2589
2630 class StoreBufferOverflowStub : public PlatformCodeStub { 2590 class StoreBufferOverflowStub : public PlatformCodeStub {
2631 public: 2591 public:
2632 StoreBufferOverflowStub(Isolate* isolate, SaveFPRegsMode save_fp) 2592 StoreBufferOverflowStub(Isolate* isolate, SaveFPRegsMode save_fp)
2633 : PlatformCodeStub(isolate) { 2593 : PlatformCodeStub(isolate) {
2634 minor_key_ = SaveDoublesBits::encode(save_fp == kSaveFPRegs); 2594 minor_key_ = SaveDoublesBits::encode(save_fp == kSaveFPRegs);
2635 } 2595 }
2636 2596
2637 void Generate(MacroAssembler* masm); 2597 void Generate(MacroAssembler* masm);
2638 2598
2639 static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); 2599 static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate);
2640 virtual bool SometimesSetsUpAFrame() { return false; } 2600 virtual bool SometimesSetsUpAFrame() { return false; }
2641 2601
2642 private: 2602 private:
2643 Major MajorKey() const OVERRIDE { return StoreBufferOverflow; } 2603 virtual inline Major MajorKey() const FINAL OVERRIDE;
2644 2604
2645 bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); } 2605 bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); }
2646 2606
2647 class SaveDoublesBits : public BitField<bool, 0, 1> {}; 2607 class SaveDoublesBits : public BitField<bool, 0, 1> {};
2648 2608
2649 DISALLOW_COPY_AND_ASSIGN(StoreBufferOverflowStub); 2609 DISALLOW_COPY_AND_ASSIGN(StoreBufferOverflowStub);
2650 }; 2610 };
2651 2611
2652 2612
2653 class SubStringStub : public PlatformCodeStub { 2613 class SubStringStub : public PlatformCodeStub {
2654 public: 2614 public:
2655 explicit SubStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 2615 explicit SubStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
2656 2616
2657 private: 2617 private:
2658 Major MajorKey() const OVERRIDE { return SubString; } 2618 virtual inline Major MajorKey() const FINAL OVERRIDE;
2659 2619
2660 void Generate(MacroAssembler* masm); 2620 void Generate(MacroAssembler* masm);
2661 2621
2662 DISALLOW_COPY_AND_ASSIGN(SubStringStub); 2622 DISALLOW_COPY_AND_ASSIGN(SubStringStub);
2663 }; 2623 };
2664 2624
2665 2625
2666 class StringCompareStub : public PlatformCodeStub { 2626 class StringCompareStub : public PlatformCodeStub {
2667 public: 2627 public:
2668 explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 2628 explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
2669 2629
2670 private: 2630 private:
2671 virtual Major MajorKey() const { return StringCompare; } 2631 virtual inline Major MajorKey() const FINAL OVERRIDE;
2672 2632
2673 virtual void Generate(MacroAssembler* masm); 2633 virtual void Generate(MacroAssembler* masm);
2674 2634
2675 DISALLOW_COPY_AND_ASSIGN(StringCompareStub); 2635 DISALLOW_COPY_AND_ASSIGN(StringCompareStub);
2676 }; 2636 };
2637
2638
2639 #define DEFINE_MAJOR_KEY(NAME) \
2640 CodeStub::Major NAME##Stub::MajorKey() const { return NAME; }
2641
2642 CODE_STUB_LIST(DEFINE_MAJOR_KEY)
2643
2644 #undef DEFINE_MAJOR_KEY
2677 } } // namespace v8::internal 2645 } } // namespace v8::internal
2678 2646
2679 #endif // V8_CODE_STUBS_H_ 2647 #endif // V8_CODE_STUBS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698