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

Side by Side Diff: src/hydrogen-instructions.h

Issue 6538080: Add template parameter for hydrogen input operands. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: HIR refactoring. Created 9 years, 10 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
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 class HValue; 44 class HValue;
45 class LInstruction; 45 class LInstruction;
46 class LChunkBuilder; 46 class LChunkBuilder;
47 47
48 48
49 #define HYDROGEN_ALL_INSTRUCTION_LIST(V) \ 49 #define HYDROGEN_ALL_INSTRUCTION_LIST(V) \
50 V(ArithmeticBinaryOperation) \ 50 V(ArithmeticBinaryOperation) \
51 V(BinaryCall) \ 51 V(BinaryCall) \
52 V(BinaryOperation) \ 52 V(BinaryOperation) \
53 V(BitwiseBinaryOperation) \ 53 V(BitwiseBinaryOperation) \
54 V(Call) \
55 V(ControlInstruction) \ 54 V(ControlInstruction) \
56 V(Instruction) \ 55 V(Instruction) \
57 V(LoadKeyed) \
58 V(MaterializedLiteral) \
59 V(Phi) \ 56 V(Phi) \
60 V(StoreKeyed) \
61 V(StoreNamed) \
62 V(UnaryCall) \ 57 V(UnaryCall) \
63 V(UnaryControlInstruction) \ 58 V(UnaryControlInstruction) \
64 V(UnaryOperation) \ 59 V(UnaryOperation) \
65 HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) 60 HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
66 61
67 62
68 #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ 63 #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \
69 V(AbnormalExit) \ 64 V(AbnormalExit) \
70 V(AccessArgumentsAt) \ 65 V(AccessArgumentsAt) \
71 V(Add) \ 66 V(Add) \
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 } \ 181 } \
187 Opcode opcode() const { return HValue::k##type; } 182 Opcode opcode() const { return HValue::k##type; }
188 183
189 184
190 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \ 185 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
191 virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \ 186 virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \
192 virtual const char* Mnemonic() const { return mnemonic; } \ 187 virtual const char* Mnemonic() const { return mnemonic; } \
193 DECLARE_INSTRUCTION(type) 188 DECLARE_INSTRUCTION(type)
194 189
195 190
196
197 template<int kSize>
198 class HOperandVector : public EmbeddedVector<HValue*, kSize> {
199 public:
200 HOperandVector() : EmbeddedVector<HValue*, kSize>(NULL) { }
201 };
202
203
204 class Range: public ZoneObject { 191 class Range: public ZoneObject {
205 public: 192 public:
206 Range() : lower_(kMinInt), 193 Range() : lower_(kMinInt),
207 upper_(kMaxInt), 194 upper_(kMaxInt),
208 next_(NULL), 195 next_(NULL),
209 can_be_minus_zero_(false) { } 196 can_be_minus_zero_(false) { }
210 197
211 Range(int32_t lower, int32_t upper) 198 Range(int32_t lower, int32_t upper)
212 : lower_(lower), upper_(upper), next_(NULL), can_be_minus_zero_(false) { } 199 : lower_(lower), upper_(upper), next_(NULL), can_be_minus_zero_(false) { }
213 200
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 // one input. They are phi and binary add. They always return NULL and 524 // one input. They are phi and binary add. They always return NULL and
538 // expect the caller to take care of things. 525 // expect the caller to take care of things.
539 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) { 526 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) {
540 visited->Add(id()); 527 visited->Add(id());
541 return NULL; 528 return NULL;
542 } 529 }
543 530
544 bool IsDefinedAfter(HBasicBlock* other) const; 531 bool IsDefinedAfter(HBasicBlock* other) const;
545 532
546 // Operands. 533 // Operands.
547 virtual int OperandCount() { return 0; } 534 virtual int OperandCount() = 0;
548 virtual HValue* OperandAt(int index) { 535 virtual HValue* OperandAt(int index) = 0;
549 UNREACHABLE();
550 return NULL;
551 }
552 void SetOperandAt(int index, HValue* value); 536 void SetOperandAt(int index, HValue* value);
553 537
554 int LookupOperandIndex(int occurrence_index, HValue* op); 538 int LookupOperandIndex(int occurrence_index, HValue* op);
555 bool UsesMultipleTimes(HValue* op); 539 bool UsesMultipleTimes(HValue* op);
556 540
557 void ReplaceAndDelete(HValue* other); 541 void ReplaceAndDelete(HValue* other);
558 void ReplaceValue(HValue* other); 542 void ReplaceValue(HValue* other);
559 void ReplaceAtUse(HValue* use, HValue* other); 543 void ReplaceAtUse(HValue* use, HValue* other);
560 void ReplaceFirstAtUse(HValue* use, HValue* other, Representation r); 544 void ReplaceFirstAtUse(HValue* use, HValue* other, Representation r);
561 bool HasNoUses() const { return uses_.is_empty(); } 545 bool HasNoUses() const { return uses_.is_empty(); }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 protected: 603 protected:
620 // This function must be overridden for instructions with flag kUseGVN, to 604 // This function must be overridden for instructions with flag kUseGVN, to
621 // compare the non-Operand parts of the instruction. 605 // compare the non-Operand parts of the instruction.
622 virtual bool DataEquals(HValue* other) { 606 virtual bool DataEquals(HValue* other) {
623 UNREACHABLE(); 607 UNREACHABLE();
624 return false; 608 return false;
625 } 609 }
626 virtual void RepresentationChanged(Representation to) { } 610 virtual void RepresentationChanged(Representation to) { }
627 virtual Range* InferRange(); 611 virtual Range* InferRange();
628 virtual void DeleteFromGraph() = 0; 612 virtual void DeleteFromGraph() = 0;
629 virtual void InternalSetOperandAt(int index, HValue* value) { UNREACHABLE(); } 613 virtual void InternalSetOperandAt(int index, HValue* value) = 0;
630 void clear_block() { 614 void clear_block() {
631 ASSERT(block_ != NULL); 615 ASSERT(block_ != NULL);
632 block_ = NULL; 616 block_ = NULL;
633 } 617 }
634 618
635 void set_representation(Representation r) { 619 void set_representation(Representation r) {
636 // Representation is set-once. 620 // Representation is set-once.
637 ASSERT(representation_.IsNone() && !r.IsNone()); 621 ASSERT(representation_.IsNone() && !r.IsNone());
638 representation_ = r; 622 representation_ = r;
639 } 623 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; 667 virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
684 668
685 #ifdef DEBUG 669 #ifdef DEBUG
686 virtual void Verify(); 670 virtual void Verify();
687 #endif 671 #endif
688 672
689 // Returns whether this is some kind of deoptimizing check 673 // Returns whether this is some kind of deoptimizing check
690 // instruction. 674 // instruction.
691 virtual bool IsCheckInstruction() const { return false; } 675 virtual bool IsCheckInstruction() const { return false; }
692 676
677 virtual bool IsCall() { return false; }
678
693 DECLARE_INSTRUCTION(Instruction) 679 DECLARE_INSTRUCTION(Instruction)
694 680
695 protected: 681 protected:
696 HInstruction() 682 HInstruction()
697 : next_(NULL), 683 : next_(NULL),
698 previous_(NULL), 684 previous_(NULL),
699 position_(RelocInfo::kNoPosition) { 685 position_(RelocInfo::kNoPosition) {
700 SetFlag(kDependsOnOsrEntries); 686 SetFlag(kDependsOnOsrEntries);
701 } 687 }
702 688
703 virtual void DeleteFromGraph() { Unlink(); } 689 virtual void DeleteFromGraph() { Unlink(); }
704 690
705 private: 691 private:
706 void InitializeAsFirst(HBasicBlock* block) { 692 void InitializeAsFirst(HBasicBlock* block) {
707 ASSERT(!IsLinked()); 693 ASSERT(!IsLinked());
708 SetBlock(block); 694 SetBlock(block);
709 } 695 }
710 696
711 HInstruction* next_; 697 HInstruction* next_;
712 HInstruction* previous_; 698 HInstruction* previous_;
713 int position_; 699 int position_;
714 700
715 friend class HBasicBlock; 701 friend class HBasicBlock;
716 }; 702 };
717 703
718 704
719 class HBlockEntry: public HInstruction {
720 public:
721
722 virtual Representation RequiredInputRepresentation(int index) const {
723 return Representation::None();
724 }
725
726 DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry")
727 };
728
729
730 class HControlInstruction: public HInstruction { 705 class HControlInstruction: public HInstruction {
731 public: 706 public:
732 HControlInstruction(HBasicBlock* first, HBasicBlock* second) 707 HControlInstruction(HBasicBlock* first, HBasicBlock* second)
733 : first_successor_(first), second_successor_(second) { 708 : first_successor_(first), second_successor_(second) {
734 } 709 }
735 710
736 HBasicBlock* FirstSuccessor() const { return first_successor_; } 711 HBasicBlock* FirstSuccessor() const { return first_successor_; }
737 HBasicBlock* SecondSuccessor() const { return second_successor_; } 712 HBasicBlock* SecondSuccessor() const { return second_successor_; }
738 713
739 virtual void PrintDataTo(StringStream* stream); 714 virtual void PrintDataTo(StringStream* stream);
740 715
741 DECLARE_INSTRUCTION(ControlInstruction) 716 DECLARE_INSTRUCTION(ControlInstruction)
742 717
743 private: 718 private:
744 HBasicBlock* first_successor_; 719 HBasicBlock* first_successor_;
745 HBasicBlock* second_successor_; 720 HBasicBlock* second_successor_;
746 }; 721 };
747 722
748 723
749 class HDeoptimize: public HControlInstruction { 724 template<int NumElements>
725 class HOperandContainer {
Kevin Millikin (Chromium) 2011/02/22 15:00:39 This is essentially the same as the corresponding
fschneider 2011/02/23 10:42:19 I agree - for that I need to factor out the printi
750 public: 726 public:
751 HDeoptimize() : HControlInstruction(NULL, NULL) { } 727 HOperandContainer() {
728 for (int i = 0; i < NumElements; i++) elems_[i] = NULL;
Kevin Millikin (Chromium) 2011/02/22 15:00:39 We should be able to zero initialize the elems_ by
fschneider 2011/02/23 10:42:19 Done. (but somehow I don't trust all compilers to
729 }
730 int length() { return NumElements; }
731 HValue*& operator[](int i) {
732 ASSERT(i < length());
733 return elems_[i];
734 }
735
736 private:
737 HValue* elems_[NumElements];
738 };
739
740
741 template<>
742 class HOperandContainer<0> {
743 public:
744 int length() { return 0; }
745 HValue*& operator[](int i) {
746 UNREACHABLE();
747 static HValue* t = 0;
748 return t;
749 }
750 };
751
752
753 template<int V>
754 class HTemplateInstruction : public HInstruction {
755 public:
756 int OperandCount() { return V; }
757 HValue* OperandAt(int i) { return inputs_[i]; }
758
759 protected:
760 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
761
762 private:
763 HOperandContainer<V> inputs_;
764 };
765
766
767 template<int V>
768 class HTemplateControlInstruction : public HControlInstruction {
769 public:
770 HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second)
771 : HControlInstruction(first, second) { }
772 int OperandCount() { return V; }
773 HValue* OperandAt(int i) { return inputs_[i]; }
774
775 protected:
776 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
777
778 private:
779 HOperandContainer<V> inputs_;
780 };
781
782
783 class HBlockEntry: public HTemplateInstruction<0> {
784 public:
785 virtual Representation RequiredInputRepresentation(int index) const {
786 return Representation::None();
787 }
788
789 DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry")
790 };
791
792
793 class HDeoptimize: public HTemplateControlInstruction<0> {
794 public:
795 HDeoptimize() : HTemplateControlInstruction<0>(NULL, NULL) { }
752 796
753 virtual Representation RequiredInputRepresentation(int index) const { 797 virtual Representation RequiredInputRepresentation(int index) const {
754 return Representation::None(); 798 return Representation::None();
755 } 799 }
756 800
757 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") 801 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
758 }; 802 };
759 803
760 804
761 class HGoto: public HControlInstruction { 805 class HGoto: public HTemplateControlInstruction<0> {
762 public: 806 public:
763 explicit HGoto(HBasicBlock* target) 807 explicit HGoto(HBasicBlock* target)
764 : HControlInstruction(target, NULL), include_stack_check_(false) { 808 : HTemplateControlInstruction<0>(target, NULL),
765 } 809 include_stack_check_(false) { }
766 810
767 void set_include_stack_check(bool include_stack_check) { 811 void set_include_stack_check(bool include_stack_check) {
768 include_stack_check_ = include_stack_check; 812 include_stack_check_ = include_stack_check;
769 } 813 }
770 bool include_stack_check() const { return include_stack_check_; } 814 bool include_stack_check() const { return include_stack_check_; }
771 815
772 virtual Representation RequiredInputRepresentation(int index) const { 816 virtual Representation RequiredInputRepresentation(int index) const {
773 return Representation::None(); 817 return Representation::None();
774 } 818 }
775 819
776 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") 820 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
777 821
778 private: 822 private:
779 bool include_stack_check_; 823 bool include_stack_check_;
780 }; 824 };
781 825
782 826
783 class HUnaryControlInstruction: public HControlInstruction { 827 class HUnaryControlInstruction: public HTemplateControlInstruction<1> {
784 public: 828 public:
785 explicit HUnaryControlInstruction(HValue* value, 829 explicit HUnaryControlInstruction(HValue* value,
786 HBasicBlock* true_target, 830 HBasicBlock* true_target,
787 HBasicBlock* false_target) 831 HBasicBlock* false_target)
788 : HControlInstruction(true_target, false_target) { 832 : HTemplateControlInstruction<1>(true_target, false_target) {
789 SetOperandAt(0, value); 833 SetOperandAt(0, value);
790 } 834 }
791 835
792 virtual void PrintDataTo(StringStream* stream); 836 virtual void PrintDataTo(StringStream* stream);
793 837
794 HValue* value() { return OperandAt(0); } 838 HValue* value() { return OperandAt(0); }
795 virtual int OperandCount() { return 1; }
796 virtual HValue* OperandAt(int index) { return operands_[index]; }
797 839
798 DECLARE_INSTRUCTION(UnaryControlInstruction) 840 DECLARE_INSTRUCTION(UnaryControlInstruction)
799
800 protected:
801 virtual void InternalSetOperandAt(int index, HValue* value) {
802 operands_[index] = value;
803 }
804
805 private:
806 HOperandVector<1> operands_;
807 }; 841 };
808 842
809 843
810 class HTest: public HUnaryControlInstruction { 844 class HTest: public HUnaryControlInstruction {
811 public: 845 public:
812 HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target) 846 HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target)
813 : HUnaryControlInstruction(value, true_target, false_target) { 847 : HUnaryControlInstruction(value, true_target, false_target) {
814 ASSERT(true_target != NULL && false_target != NULL); 848 ASSERT(true_target != NULL && false_target != NULL);
815 } 849 }
816 850
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 } 891 }
858 892
859 virtual Representation RequiredInputRepresentation(int index) const { 893 virtual Representation RequiredInputRepresentation(int index) const {
860 return Representation::Tagged(); 894 return Representation::Tagged();
861 } 895 }
862 896
863 DECLARE_CONCRETE_INSTRUCTION(Return, "return") 897 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
864 }; 898 };
865 899
866 900
867 class HAbnormalExit: public HControlInstruction { 901 class HAbnormalExit: public HTemplateControlInstruction<0> {
868 public: 902 public:
869 HAbnormalExit() : HControlInstruction(NULL, NULL) { } 903 HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { }
870 904
871 virtual Representation RequiredInputRepresentation(int index) const { 905 virtual Representation RequiredInputRepresentation(int index) const {
872 return Representation::None(); 906 return Representation::None();
873 } 907 }
874 908
875 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit, "abnormal_exit") 909 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit, "abnormal_exit")
876 }; 910 };
877 911
878 912
879 class HUnaryOperation: public HInstruction { 913 class HUnaryOperation: public HTemplateInstruction<1> {
880 public: 914 public:
881 explicit HUnaryOperation(HValue* value) { 915 explicit HUnaryOperation(HValue* value) {
882 SetOperandAt(0, value); 916 SetOperandAt(0, value);
883 } 917 }
884 918
885 HValue* value() { return OperandAt(0); } 919 HValue* value() { return OperandAt(0); }
886 virtual void PrintDataTo(StringStream* stream); 920 virtual void PrintDataTo(StringStream* stream);
887 virtual int OperandCount() { return 1; }
888 virtual HValue* OperandAt(int index) { return operands_[index]; }
889 921
890 DECLARE_INSTRUCTION(UnaryOperation) 922 DECLARE_INSTRUCTION(UnaryOperation)
891
892 protected:
893 virtual void InternalSetOperandAt(int index, HValue* value) {
894 operands_[index] = value;
895 }
896
897 private:
898 HOperandVector<1> operands_;
899 }; 923 };
900 924
901 925
902 class HThrow: public HUnaryOperation { 926 class HThrow: public HUnaryOperation {
903 public: 927 public:
904 explicit HThrow(HValue* value) : HUnaryOperation(value) { 928 explicit HThrow(HValue* value) : HUnaryOperation(value) {
905 SetAllSideEffects(); 929 SetAllSideEffects();
906 } 930 }
907 931
908 virtual Representation RequiredInputRepresentation(int index) const { 932 virtual Representation RequiredInputRepresentation(int index) const {
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 SetOperandAt(values_.length() - 1, value); 1053 SetOperandAt(values_.length() - 1, value);
1030 } 1054 }
1031 int ast_id_; 1055 int ast_id_;
1032 int pop_count_; 1056 int pop_count_;
1033 int environment_length_; 1057 int environment_length_;
1034 ZoneList<HValue*> values_; 1058 ZoneList<HValue*> values_;
1035 ZoneList<int> assigned_indexes_; 1059 ZoneList<int> assigned_indexes_;
1036 }; 1060 };
1037 1061
1038 1062
1039 class HStackCheck: public HInstruction { 1063 class HStackCheck: public HTemplateInstruction<0> {
1040 public: 1064 public:
1041 HStackCheck() { } 1065 HStackCheck() { }
1042 1066
1043 virtual Representation RequiredInputRepresentation(int index) const { 1067 virtual Representation RequiredInputRepresentation(int index) const {
1044 return Representation::None(); 1068 return Representation::None();
1045 } 1069 }
1046 1070
1047 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack_check") 1071 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack_check")
1048 }; 1072 };
1049 1073
1050 1074
1051 class HEnterInlined: public HInstruction { 1075 class HEnterInlined: public HTemplateInstruction<0> {
1052 public: 1076 public:
1053 HEnterInlined(Handle<JSFunction> closure, FunctionLiteral* function) 1077 HEnterInlined(Handle<JSFunction> closure, FunctionLiteral* function)
1054 : closure_(closure), function_(function) { 1078 : closure_(closure), function_(function) {
1055 } 1079 }
1056 1080
1057 virtual void PrintDataTo(StringStream* stream); 1081 virtual void PrintDataTo(StringStream* stream);
1058 1082
1059 Handle<JSFunction> closure() const { return closure_; } 1083 Handle<JSFunction> closure() const { return closure_; }
1060 FunctionLiteral* function() const { return function_; } 1084 FunctionLiteral* function() const { return function_; }
1061 1085
1062 virtual Representation RequiredInputRepresentation(int index) const { 1086 virtual Representation RequiredInputRepresentation(int index) const {
1063 return Representation::None(); 1087 return Representation::None();
1064 } 1088 }
1065 1089
1066 DECLARE_CONCRETE_INSTRUCTION(EnterInlined, "enter_inlined") 1090 DECLARE_CONCRETE_INSTRUCTION(EnterInlined, "enter_inlined")
1067 1091
1068 private: 1092 private:
1069 Handle<JSFunction> closure_; 1093 Handle<JSFunction> closure_;
1070 FunctionLiteral* function_; 1094 FunctionLiteral* function_;
1071 }; 1095 };
1072 1096
1073 1097
1074 class HLeaveInlined: public HInstruction { 1098 class HLeaveInlined: public HTemplateInstruction<0> {
1075 public: 1099 public:
1076 HLeaveInlined() {} 1100 HLeaveInlined() {}
1077 1101
1078 virtual Representation RequiredInputRepresentation(int index) const { 1102 virtual Representation RequiredInputRepresentation(int index) const {
1079 return Representation::None(); 1103 return Representation::None();
1080 } 1104 }
1081 1105
1082 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined, "leave_inlined") 1106 DECLARE_CONCRETE_INSTRUCTION(LeaveInlined, "leave_inlined")
1083 }; 1107 };
1084 1108
1085 1109
1086 class HPushArgument: public HUnaryOperation { 1110 class HPushArgument: public HUnaryOperation {
1087 public: 1111 public:
1088 explicit HPushArgument(HValue* value) : HUnaryOperation(value) { 1112 explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
1089 set_representation(Representation::Tagged()); 1113 set_representation(Representation::Tagged());
1090 } 1114 }
1091 1115
1092 virtual Representation RequiredInputRepresentation(int index) const { 1116 virtual Representation RequiredInputRepresentation(int index) const {
1093 return Representation::Tagged(); 1117 return Representation::Tagged();
1094 } 1118 }
1095 1119
1096 HValue* argument() { return OperandAt(0); } 1120 HValue* argument() { return OperandAt(0); }
1097 1121
1098 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument") 1122 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument")
1099 }; 1123 };
1100 1124
1101 1125
1102 class HContext: public HInstruction { 1126 class HContext: public HTemplateInstruction<0> {
1103 public: 1127 public:
1104 HContext() { 1128 HContext() {
1105 set_representation(Representation::Tagged()); 1129 set_representation(Representation::Tagged());
1106 SetFlag(kUseGVN); 1130 SetFlag(kUseGVN);
1107 } 1131 }
1108 1132
1109 virtual Representation RequiredInputRepresentation(int index) const { 1133 virtual Representation RequiredInputRepresentation(int index) const {
1110 return Representation::None(); 1134 return Representation::None();
1111 } 1135 }
1112 1136
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1165 1189
1166 virtual Representation RequiredInputRepresentation(int index) const { 1190 virtual Representation RequiredInputRepresentation(int index) const {
1167 return Representation::Tagged(); 1191 return Representation::Tagged();
1168 } 1192 }
1169 1193
1170 protected: 1194 protected:
1171 virtual bool DataEquals(HValue* other) { return true; } 1195 virtual bool DataEquals(HValue* other) { return true; }
1172 }; 1196 };
1173 1197
1174 1198
1175 class HCall: public HInstruction { 1199 template <int V>
1200 class HCall: public HTemplateInstruction<V> {
1176 public: 1201 public:
1177 // The argument count includes the receiver. 1202 // The argument count includes the receiver.
1178 explicit HCall(int argument_count) : argument_count_(argument_count) { 1203 explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
1179 set_representation(Representation::Tagged()); 1204 this->set_representation(Representation::Tagged());
1180 SetAllSideEffects(); 1205 this->SetAllSideEffects();
1181 } 1206 }
1182 1207
1183 virtual HType CalculateInferredType() { return HType::Tagged(); } 1208 virtual HType CalculateInferredType() { return HType::Tagged(); }
1184 1209
1185 virtual int argument_count() const { return argument_count_; } 1210 virtual int argument_count() const { return argument_count_; }
1186 1211
1187 virtual void PrintDataTo(StringStream* stream); 1212 virtual bool IsCall() { return true; }
1188
1189 DECLARE_INSTRUCTION(Call)
1190 1213
1191 private: 1214 private:
1192 int argument_count_; 1215 int argument_count_;
1193 }; 1216 };
1194 1217
1195 1218
1196 class HUnaryCall: public HCall { 1219 class HUnaryCall: public HCall<1> {
1197 public: 1220 public:
1198 HUnaryCall(HValue* value, int argument_count) 1221 HUnaryCall(HValue* value, int argument_count)
1199 : HCall(argument_count), value_(NULL) { 1222 : HCall<1>(argument_count) {
1200 SetOperandAt(0, value); 1223 SetOperandAt(0, value);
1201 } 1224 }
1202 1225
1226 virtual Representation RequiredInputRepresentation(int index) const {
1227 return Representation::Tagged();
1228 }
1229
1203 virtual void PrintDataTo(StringStream* stream); 1230 virtual void PrintDataTo(StringStream* stream);
1204 1231
1205 HValue* value() { return value_; } 1232 HValue* value() { return OperandAt(0); }
1206
1207 virtual int OperandCount() { return 1; }
1208 virtual HValue* OperandAt(int index) {
1209 ASSERT(index == 0);
1210 return value_;
1211 }
1212 1233
1213 DECLARE_INSTRUCTION(UnaryCall) 1234 DECLARE_INSTRUCTION(UnaryCall)
1214
1215 protected:
1216 virtual void InternalSetOperandAt(int index, HValue* value) {
1217 ASSERT(index == 0);
1218 value_ = value;
1219 }
1220
1221 private:
1222 HValue* value_;
1223 }; 1235 };
1224 1236
1225 1237
1226 class HBinaryCall: public HCall { 1238 class HBinaryCall: public HCall<2> {
1227 public: 1239 public:
1228 HBinaryCall(HValue* first, HValue* second, int argument_count) 1240 HBinaryCall(HValue* first, HValue* second, int argument_count)
1229 : HCall(argument_count) { 1241 : HCall<2>(argument_count) {
1230 SetOperandAt(0, first); 1242 SetOperandAt(0, first);
1231 SetOperandAt(1, second); 1243 SetOperandAt(1, second);
1232 } 1244 }
1233 1245
1234 virtual void PrintDataTo(StringStream* stream); 1246 virtual void PrintDataTo(StringStream* stream);
1235 1247
1236 HValue* first() const { return operands_[0]; } 1248 virtual Representation RequiredInputRepresentation(int index) const {
1237 HValue* second() const { return operands_[1]; } 1249 return Representation::Tagged();
1250 }
1238 1251
1239 virtual int OperandCount() { return 2; } 1252 HValue* first() { return OperandAt(0); }
1240 virtual HValue* OperandAt(int index) { return operands_[index]; } 1253 HValue* second() { return OperandAt(1); }
1241 1254
1242 DECLARE_INSTRUCTION(BinaryCall) 1255 DECLARE_INSTRUCTION(BinaryCall)
1243
1244 protected:
1245 virtual void InternalSetOperandAt(int index, HValue* value) {
1246 operands_[index] = value;
1247 }
1248
1249 private:
1250 HOperandVector<2> operands_;
1251 }; 1256 };
1252 1257
1253 1258
1254 class HCallConstantFunction: public HCall { 1259 class HCallConstantFunction: public HCall<0> {
1255 public: 1260 public:
1256 HCallConstantFunction(Handle<JSFunction> function, int argument_count) 1261 HCallConstantFunction(Handle<JSFunction> function, int argument_count)
1257 : HCall(argument_count), function_(function) { } 1262 : HCall<0>(argument_count), function_(function) { }
1258 1263
1259 Handle<JSFunction> function() const { return function_; } 1264 Handle<JSFunction> function() const { return function_; }
1260 1265
1261 bool IsApplyFunction() const { 1266 bool IsApplyFunction() const {
1262 return function_->code() == Builtins::builtin(Builtins::FunctionApply); 1267 return function_->code() == Builtins::builtin(Builtins::FunctionApply);
1263 } 1268 }
1264 1269
1265 virtual void PrintDataTo(StringStream* stream); 1270 virtual void PrintDataTo(StringStream* stream);
1266 1271
1267 virtual Representation RequiredInputRepresentation(int index) const { 1272 virtual Representation RequiredInputRepresentation(int index) const {
(...skipping 10 matching lines...) Expand all
1278 class HCallKeyed: public HBinaryCall { 1283 class HCallKeyed: public HBinaryCall {
1279 public: 1284 public:
1280 HCallKeyed(HValue* context, HValue* key, int argument_count) 1285 HCallKeyed(HValue* context, HValue* key, int argument_count)
1281 : HBinaryCall(context, key, argument_count) { 1286 : HBinaryCall(context, key, argument_count) {
1282 } 1287 }
1283 1288
1284 virtual Representation RequiredInputRepresentation(int index) const { 1289 virtual Representation RequiredInputRepresentation(int index) const {
1285 return Representation::Tagged(); 1290 return Representation::Tagged();
1286 } 1291 }
1287 1292
1288 HValue* context() const { return first(); } 1293 HValue* context() { return first(); }
1289 HValue* key() const { return second(); } 1294 HValue* key() { return second(); }
1290 1295
1291 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call_keyed") 1296 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call_keyed")
1292 }; 1297 };
1293 1298
1294 1299
1295 class HCallNamed: public HUnaryCall { 1300 class HCallNamed: public HUnaryCall {
1296 public: 1301 public:
1297 HCallNamed(HValue* context, Handle<String> name, int argument_count) 1302 HCallNamed(HValue* context, Handle<String> name, int argument_count)
1298 : HUnaryCall(context, argument_count), name_(name) { 1303 : HUnaryCall(context, argument_count), name_(name) {
1299 } 1304 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 return Representation::Tagged(); 1350 return Representation::Tagged();
1346 } 1351 }
1347 1352
1348 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global") 1353 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global")
1349 1354
1350 private: 1355 private:
1351 Handle<String> name_; 1356 Handle<String> name_;
1352 }; 1357 };
1353 1358
1354 1359
1355 class HCallKnownGlobal: public HCall { 1360 class HCallKnownGlobal: public HCall<0> {
1356 public: 1361 public:
1357 HCallKnownGlobal(Handle<JSFunction> target, int argument_count) 1362 HCallKnownGlobal(Handle<JSFunction> target, int argument_count)
1358 : HCall(argument_count), target_(target) { } 1363 : HCall<0>(argument_count), target_(target) { }
1359 1364
1360 virtual void PrintDataTo(StringStream* stream); 1365 virtual void PrintDataTo(StringStream* stream);
1361 1366
1362 Handle<JSFunction> target() const { return target_; } 1367 Handle<JSFunction> target() const { return target_; }
1363 1368
1364 virtual Representation RequiredInputRepresentation(int index) const { 1369 virtual Representation RequiredInputRepresentation(int index) const {
1365 return Representation::None(); 1370 return Representation::None();
1366 } 1371 }
1367 1372
1368 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global") 1373 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global")
1369 1374
1370 private: 1375 private:
1371 Handle<JSFunction> target_; 1376 Handle<JSFunction> target_;
1372 }; 1377 };
1373 1378
1374 1379
1375 class HCallNew: public HBinaryCall { 1380 class HCallNew: public HBinaryCall {
1376 public: 1381 public:
1377 HCallNew(HValue* context, HValue* constructor, int argument_count) 1382 HCallNew(HValue* context, HValue* constructor, int argument_count)
1378 : HBinaryCall(context, constructor, argument_count) { 1383 : HBinaryCall(context, constructor, argument_count) {
1379 } 1384 }
1380 1385
1381 virtual Representation RequiredInputRepresentation(int index) const { 1386 virtual Representation RequiredInputRepresentation(int index) const {
1382 return Representation::Tagged(); 1387 return Representation::Tagged();
1383 } 1388 }
1384 1389
1385 HValue* context() const { return first(); } 1390 HValue* context() { return first(); }
1386 HValue* constructor() const { return second(); } 1391 HValue* constructor() { return second(); }
1387 1392
1388 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call_new") 1393 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call_new")
1389 }; 1394 };
1390 1395
1391 1396
1392 class HCallRuntime: public HCall { 1397 class HCallRuntime: public HCall<0> {
1393 public: 1398 public:
1394 HCallRuntime(Handle<String> name, 1399 HCallRuntime(Handle<String> name,
1395 Runtime::Function* c_function, 1400 Runtime::Function* c_function,
1396 int argument_count) 1401 int argument_count)
1397 : HCall(argument_count), c_function_(c_function), name_(name) { } 1402 : HCall<0>(argument_count), c_function_(c_function), name_(name) { }
1398 virtual void PrintDataTo(StringStream* stream); 1403 virtual void PrintDataTo(StringStream* stream);
1399 1404
1400 Runtime::Function* function() const { return c_function_; } 1405 Runtime::Function* function() const { return c_function_; }
1401 Handle<String> name() const { return name_; } 1406 Handle<String> name() const { return name_; }
1402 1407
1403 virtual Representation RequiredInputRepresentation(int index) const { 1408 virtual Representation RequiredInputRepresentation(int index) const {
1404 return Representation::None(); 1409 return Representation::None();
1405 } 1410 }
1406 1411
1407 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call_runtime") 1412 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call_runtime")
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
1754 virtual void Verify(); 1759 virtual void Verify();
1755 #endif 1760 #endif
1756 1761
1757 DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check_non_smi") 1762 DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check_non_smi")
1758 1763
1759 protected: 1764 protected:
1760 virtual bool DataEquals(HValue* other) { return true; } 1765 virtual bool DataEquals(HValue* other) { return true; }
1761 }; 1766 };
1762 1767
1763 1768
1764 class HCheckPrototypeMaps: public HInstruction { 1769 class HCheckPrototypeMaps: public HTemplateInstruction<0> {
1765 public: 1770 public:
1766 HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder) 1771 HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder)
1767 : prototype_(prototype), holder_(holder) { 1772 : prototype_(prototype), holder_(holder) {
1768 SetFlag(kUseGVN); 1773 SetFlag(kUseGVN);
1769 SetFlag(kDependsOnMaps); 1774 SetFlag(kDependsOnMaps);
1770 } 1775 }
1771 1776
1772 virtual bool IsCheckInstruction() const { return true; } 1777 virtual bool IsCheckInstruction() const { return true; }
1773 1778
1774 #ifdef DEBUG 1779 #ifdef DEBUG
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1916 private: 1921 private:
1917 ZoneList<HValue*> inputs_; 1922 ZoneList<HValue*> inputs_;
1918 int merged_index_; 1923 int merged_index_;
1919 1924
1920 int non_phi_uses_[Representation::kNumRepresentations]; 1925 int non_phi_uses_[Representation::kNumRepresentations];
1921 int indirect_uses_[Representation::kNumRepresentations]; 1926 int indirect_uses_[Representation::kNumRepresentations];
1922 int phi_id_; 1927 int phi_id_;
1923 }; 1928 };
1924 1929
1925 1930
1926 class HArgumentsObject: public HInstruction { 1931 class HArgumentsObject: public HTemplateInstruction<0> {
1927 public: 1932 public:
1928 HArgumentsObject() { 1933 HArgumentsObject() {
1929 set_representation(Representation::Tagged()); 1934 set_representation(Representation::Tagged());
1930 SetFlag(kIsArguments); 1935 SetFlag(kIsArguments);
1931 } 1936 }
1932 1937
1933 virtual Representation RequiredInputRepresentation(int index) const { 1938 virtual Representation RequiredInputRepresentation(int index) const {
1934 return Representation::None(); 1939 return Representation::None();
1935 } 1940 }
1936 1941
1937 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object") 1942 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object")
1938 }; 1943 };
1939 1944
1940 1945
1941 class HConstant: public HInstruction { 1946 class HConstant: public HTemplateInstruction<0> {
1942 public: 1947 public:
1943 HConstant(Handle<Object> handle, Representation r); 1948 HConstant(Handle<Object> handle, Representation r);
1944 1949
1945 Handle<Object> handle() const { return handle_; } 1950 Handle<Object> handle() const { return handle_; }
1946 1951
1947 bool InOldSpace() const { return !Heap::InNewSpace(*handle_); } 1952 bool InOldSpace() const { return !Heap::InNewSpace(*handle_); }
1948 1953
1949 virtual Representation RequiredInputRepresentation(int index) const { 1954 virtual Representation RequiredInputRepresentation(int index) const {
1950 return Representation::None(); 1955 return Representation::None();
1951 } 1956 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 // The following two values represent the int32 and the double value of the 1999 // The following two values represent the int32 and the double value of the
1995 // given constant if there is a lossless conversion between the constant 2000 // given constant if there is a lossless conversion between the constant
1996 // and the specific representation. 2001 // and the specific representation.
1997 bool has_int32_value_; 2002 bool has_int32_value_;
1998 int32_t int32_value_; 2003 int32_t int32_value_;
1999 bool has_double_value_; 2004 bool has_double_value_;
2000 double double_value_; 2005 double double_value_;
2001 }; 2006 };
2002 2007
2003 2008
2004 class HBinaryOperation: public HInstruction { 2009 class HBinaryOperation: public HTemplateInstruction<2> {
2005 public: 2010 public:
2006 HBinaryOperation(HValue* left, HValue* right) { 2011 HBinaryOperation(HValue* left, HValue* right) {
2007 ASSERT(left != NULL && right != NULL); 2012 ASSERT(left != NULL && right != NULL);
2008 SetOperandAt(0, left); 2013 SetOperandAt(0, left);
2009 SetOperandAt(1, right); 2014 SetOperandAt(1, right);
2010 } 2015 }
2011 2016
2012 HValue* left() { return OperandAt(0); } 2017 HValue* left() { return OperandAt(0); }
2013 HValue* right() { return OperandAt(1); } 2018 HValue* right() { return OperandAt(1); }
2014 2019
2015 // TODO(kasperl): Move these helpers to the IA-32 Lithium 2020 // TODO(kasperl): Move these helpers to the IA-32 Lithium
2016 // instruction sequence builder. 2021 // instruction sequence builder.
2017 HValue* LeastConstantOperand() { 2022 HValue* LeastConstantOperand() {
2018 if (IsCommutative() && left()->IsConstant()) return right(); 2023 if (IsCommutative() && left()->IsConstant()) return right();
2019 return left(); 2024 return left();
2020 } 2025 }
2021 HValue* MostConstantOperand() { 2026 HValue* MostConstantOperand() {
2022 if (IsCommutative() && left()->IsConstant()) return left(); 2027 if (IsCommutative() && left()->IsConstant()) return left();
2023 return right(); 2028 return right();
2024 } 2029 }
2025 2030
2026 virtual bool IsCommutative() const { return false; } 2031 virtual bool IsCommutative() const { return false; }
2027 2032
2028 virtual void PrintDataTo(StringStream* stream); 2033 virtual void PrintDataTo(StringStream* stream);
2029 virtual int OperandCount() { return operands_.length(); }
2030 virtual HValue* OperandAt(int index) { return operands_[index]; }
2031 2034
2032 DECLARE_INSTRUCTION(BinaryOperation) 2035 DECLARE_INSTRUCTION(BinaryOperation)
2033
2034 protected:
2035 virtual void InternalSetOperandAt(int index, HValue* value) {
2036 operands_[index] = value;
2037 }
2038
2039 HOperandVector<2> operands_;
2040 }; 2036 };
2041 2037
2042 2038
2043 class HApplyArguments: public HInstruction { 2039 class HApplyArguments: public HTemplateInstruction<4> {
2044 public: 2040 public:
2045 HApplyArguments(HValue* function, 2041 HApplyArguments(HValue* function,
2046 HValue* receiver, 2042 HValue* receiver,
2047 HValue* length, 2043 HValue* length,
2048 HValue* elements) { 2044 HValue* elements) {
2049 set_representation(Representation::Tagged()); 2045 set_representation(Representation::Tagged());
2050 SetOperandAt(0, function); 2046 SetOperandAt(0, function);
2051 SetOperandAt(1, receiver); 2047 SetOperandAt(1, receiver);
2052 SetOperandAt(2, length); 2048 SetOperandAt(2, length);
2053 SetOperandAt(3, elements); 2049 SetOperandAt(3, elements);
2054 SetAllSideEffects(); 2050 SetAllSideEffects();
2055 } 2051 }
2056 2052
2057 virtual Representation RequiredInputRepresentation(int index) const { 2053 virtual Representation RequiredInputRepresentation(int index) const {
2058 // The length is untagged, all other inputs are tagged. 2054 // The length is untagged, all other inputs are tagged.
2059 return (index == 2) 2055 return (index == 2)
2060 ? Representation::Integer32() 2056 ? Representation::Integer32()
2061 : Representation::Tagged(); 2057 : Representation::Tagged();
2062 } 2058 }
2063 2059
2064 HValue* function() { return OperandAt(0); } 2060 HValue* function() { return OperandAt(0); }
2065 HValue* receiver() { return OperandAt(1); } 2061 HValue* receiver() { return OperandAt(1); }
2066 HValue* length() { return OperandAt(2); } 2062 HValue* length() { return OperandAt(2); }
2067 HValue* elements() { return OperandAt(3); } 2063 HValue* elements() { return OperandAt(3); }
2068 2064
2069 virtual int OperandCount() { return operands_.length(); }
2070 virtual HValue* OperandAt(int index) { return operands_[index]; }
2071
2072 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply_arguments") 2065 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply_arguments")
2073
2074 protected:
2075 virtual void InternalSetOperandAt(int index, HValue* value) {
2076 operands_[index] = value;
2077 }
2078
2079 private:
2080 HOperandVector<4> operands_;
2081 }; 2066 };
2082 2067
2083 2068
2084 class HArgumentsElements: public HInstruction { 2069 class HArgumentsElements: public HTemplateInstruction<0> {
2085 public: 2070 public:
2086 HArgumentsElements() { 2071 HArgumentsElements() {
2087 // The value produced by this instruction is a pointer into the stack 2072 // The value produced by this instruction is a pointer into the stack
2088 // that looks as if it was a smi because of alignment. 2073 // that looks as if it was a smi because of alignment.
2089 set_representation(Representation::Tagged()); 2074 set_representation(Representation::Tagged());
2090 SetFlag(kUseGVN); 2075 SetFlag(kUseGVN);
2091 } 2076 }
2092 2077
2093 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments_elements") 2078 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments_elements")
2094 2079
2095 virtual Representation RequiredInputRepresentation(int index) const { 2080 virtual Representation RequiredInputRepresentation(int index) const {
2096 return Representation::None(); 2081 return Representation::None();
2097 } 2082 }
2098 2083
2099 protected: 2084 protected:
2100 virtual bool DataEquals(HValue* other) { return true; } 2085 virtual bool DataEquals(HValue* other) { return true; }
2101 }; 2086 };
2102 2087
2103 2088
2104 class HArgumentsLength: public HUnaryOperation { 2089 class HArgumentsLength: public HUnaryOperation {
2105 public: 2090 public:
2106 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 2091 explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
2107 set_representation(Representation::Integer32()); 2092 set_representation(Representation::Integer32());
2108 SetFlag(kUseGVN); 2093 SetFlag(kUseGVN);
2109 } 2094 }
2110 2095
2111 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length")
2112
2113 virtual Representation RequiredInputRepresentation(int index) const { 2096 virtual Representation RequiredInputRepresentation(int index) const {
2114 return Representation::Tagged(); 2097 return Representation::Tagged();
2115 } 2098 }
2116 2099
2100 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length")
2101
2117 protected: 2102 protected:
2118 virtual bool DataEquals(HValue* other) { return true; } 2103 virtual bool DataEquals(HValue* other) { return true; }
2119 }; 2104 };
2120 2105
2121 2106
2122 class HAccessArgumentsAt: public HInstruction { 2107 class HAccessArgumentsAt: public HTemplateInstruction<3> {
2123 public: 2108 public:
2124 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 2109 HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
2125 set_representation(Representation::Tagged()); 2110 set_representation(Representation::Tagged());
2126 SetFlag(kUseGVN); 2111 SetFlag(kUseGVN);
2127 SetOperandAt(0, arguments); 2112 SetOperandAt(0, arguments);
2128 SetOperandAt(1, length); 2113 SetOperandAt(1, length);
2129 SetOperandAt(2, index); 2114 SetOperandAt(2, index);
2130 } 2115 }
2131 2116
2132 virtual void PrintDataTo(StringStream* stream); 2117 virtual void PrintDataTo(StringStream* stream);
2133 2118
2134 virtual Representation RequiredInputRepresentation(int index) const { 2119 virtual Representation RequiredInputRepresentation(int index) const {
2135 // The arguments elements is considered tagged. 2120 // The arguments elements is considered tagged.
2136 return index == 0 2121 return index == 0
2137 ? Representation::Tagged() 2122 ? Representation::Tagged()
2138 : Representation::Integer32(); 2123 : Representation::Integer32();
2139 } 2124 }
2140 2125
2141 HValue* arguments() { return operands_[0]; } 2126 HValue* arguments() { return OperandAt(0); }
2142 HValue* length() { return operands_[1]; } 2127 HValue* length() { return OperandAt(1); }
2143 HValue* index() { return operands_[2]; } 2128 HValue* index() { return OperandAt(2); }
2144
2145 virtual int OperandCount() { return operands_.length(); }
2146 virtual HValue* OperandAt(int index) { return operands_[index]; }
2147 2129
2148 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access_arguments_at") 2130 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access_arguments_at")
2149 2131
2150 protected:
2151 virtual void InternalSetOperandAt(int index, HValue* value) {
2152 operands_[index] = value;
2153 }
2154
2155 virtual bool DataEquals(HValue* other) { return true; } 2132 virtual bool DataEquals(HValue* other) { return true; }
2156
2157 private:
2158 HOperandVector<3> operands_;
2159 }; 2133 };
2160 2134
2161 2135
2162 class HBoundsCheck: public HBinaryOperation { 2136 class HBoundsCheck: public HBinaryOperation {
2163 public: 2137 public:
2164 HBoundsCheck(HValue* index, HValue* length) 2138 HBoundsCheck(HValue* index, HValue* length)
2165 : HBinaryOperation(index, length) { 2139 : HBinaryOperation(index, length) {
2166 SetFlag(kUseGVN); 2140 SetFlag(kUseGVN);
2167 } 2141 }
2168 2142
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
2366 public: 2340 public:
2367 explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { } 2341 explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { }
2368 2342
2369 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is_smi") 2343 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is_smi")
2370 2344
2371 protected: 2345 protected:
2372 virtual bool DataEquals(HValue* other) { return true; } 2346 virtual bool DataEquals(HValue* other) { return true; }
2373 }; 2347 };
2374 2348
2375 2349
2376 class HIsConstructCall: public HInstruction { 2350 class HIsConstructCall: public HTemplateInstruction<0> {
2377 public: 2351 public:
2378 HIsConstructCall() { 2352 HIsConstructCall() {
2379 set_representation(Representation::Tagged()); 2353 set_representation(Representation::Tagged());
2380 SetFlag(kUseGVN); 2354 SetFlag(kUseGVN);
2381 } 2355 }
2382 2356
2383 virtual bool EmitAtUses() const { 2357 virtual bool EmitAtUses() const {
2384 return !HasSideEffects() && (uses()->length() <= 1); 2358 return !HasSideEffects() && (uses()->length() <= 1);
2385 } 2359 }
2386 2360
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 virtual bool DataEquals(HValue* other) { 2455 virtual bool DataEquals(HValue* other) {
2482 HTypeofIs* b = HTypeofIs::cast(other); 2456 HTypeofIs* b = HTypeofIs::cast(other);
2483 return type_literal_.is_identical_to(b->type_literal_); 2457 return type_literal_.is_identical_to(b->type_literal_);
2484 } 2458 }
2485 2459
2486 private: 2460 private:
2487 Handle<String> type_literal_; 2461 Handle<String> type_literal_;
2488 }; 2462 };
2489 2463
2490 2464
2491 class HInstanceOf: public HInstruction { 2465 class HInstanceOf: public HTemplateInstruction<3> {
2492 public: 2466 public:
2493 HInstanceOf(HValue* context, HValue* left, HValue* right) { 2467 HInstanceOf(HValue* context, HValue* left, HValue* right) {
2494 SetOperandAt(0, context); 2468 SetOperandAt(0, context);
2495 SetOperandAt(1, left); 2469 SetOperandAt(1, left);
2496 SetOperandAt(2, right); 2470 SetOperandAt(2, right);
2497 set_representation(Representation::Tagged()); 2471 set_representation(Representation::Tagged());
2498 SetAllSideEffects(); 2472 SetAllSideEffects();
2499 } 2473 }
2500 2474
2501 HValue* context() { return operands_[0]; } 2475 HValue* context() { return OperandAt(0); }
2502 HValue* left() { return operands_[1]; } 2476 HValue* left() { return OperandAt(1); }
2503 HValue* right() { return operands_[2]; } 2477 HValue* right() { return OperandAt(2); }
2504 2478
2505 virtual bool EmitAtUses() const { 2479 virtual bool EmitAtUses() const {
2506 return !HasSideEffects() && (uses()->length() <= 1); 2480 return !HasSideEffects() && (uses()->length() <= 1);
2507 } 2481 }
2508 2482
2509 virtual Representation RequiredInputRepresentation(int index) const { 2483 virtual Representation RequiredInputRepresentation(int index) const {
2510 return Representation::Tagged(); 2484 return Representation::Tagged();
2511 } 2485 }
2512 2486
2513 virtual void PrintDataTo(StringStream* stream); 2487 virtual void PrintDataTo(StringStream* stream);
2514 2488
2515 virtual int OperandCount() { return 3; }
2516 virtual HValue* OperandAt(int index) { return operands_[index]; }
2517
2518 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance_of") 2489 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance_of")
2519
2520 protected:
2521 virtual void InternalSetOperandAt(int index, HValue* value) {
2522 operands_[index] = value;
2523 }
2524
2525 private:
2526 HOperandVector<3> operands_;
2527 }; 2490 };
2528 2491
2529 2492
2530 class HInstanceOfKnownGlobal: public HUnaryOperation { 2493 class HInstanceOfKnownGlobal: public HUnaryOperation {
2531 public: 2494 public:
2532 HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right) 2495 HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right)
2533 : HUnaryOperation(left), function_(right) { 2496 : HUnaryOperation(left), function_(right) {
2534 set_representation(Representation::Tagged()); 2497 set_representation(Representation::Tagged());
2535 SetAllSideEffects(); 2498 SetAllSideEffects();
2536 } 2499 }
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
2753 virtual Range* InferRange(); 2716 virtual Range* InferRange();
2754 virtual HType CalculateInferredType(); 2717 virtual HType CalculateInferredType();
2755 2718
2756 DECLARE_CONCRETE_INSTRUCTION(Sar, "sar") 2719 DECLARE_CONCRETE_INSTRUCTION(Sar, "sar")
2757 2720
2758 protected: 2721 protected:
2759 virtual bool DataEquals(HValue* other) { return true; } 2722 virtual bool DataEquals(HValue* other) { return true; }
2760 }; 2723 };
2761 2724
2762 2725
2763 class HOsrEntry: public HInstruction { 2726 class HOsrEntry: public HTemplateInstruction<0> {
2764 public: 2727 public:
2765 explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { 2728 explicit HOsrEntry(int ast_id) : ast_id_(ast_id) {
2766 SetFlag(kChangesOsrEntries); 2729 SetFlag(kChangesOsrEntries);
2767 } 2730 }
2768 2731
2769 int ast_id() const { return ast_id_; } 2732 int ast_id() const { return ast_id_; }
2770 2733
2771 virtual Representation RequiredInputRepresentation(int index) const { 2734 virtual Representation RequiredInputRepresentation(int index) const {
2772 return Representation::None(); 2735 return Representation::None();
2773 } 2736 }
2774 2737
2775 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr_entry") 2738 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr_entry")
2776 2739
2777 private: 2740 private:
2778 int ast_id_; 2741 int ast_id_;
2779 }; 2742 };
2780 2743
2781 2744
2782 class HParameter: public HInstruction { 2745 class HParameter: public HTemplateInstruction<0> {
2783 public: 2746 public:
2784 explicit HParameter(unsigned index) : index_(index) { 2747 explicit HParameter(unsigned index) : index_(index) {
2785 set_representation(Representation::Tagged()); 2748 set_representation(Representation::Tagged());
2786 } 2749 }
2787 2750
2788 unsigned index() const { return index_; } 2751 unsigned index() const { return index_; }
2789 2752
2790 virtual void PrintDataTo(StringStream* stream); 2753 virtual void PrintDataTo(StringStream* stream);
2791 2754
2792 virtual Representation RequiredInputRepresentation(int index) const { 2755 virtual Representation RequiredInputRepresentation(int index) const {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2826 } 2789 }
2827 2790
2828 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub") 2791 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub")
2829 2792
2830 private: 2793 private:
2831 CodeStub::Major major_key_; 2794 CodeStub::Major major_key_;
2832 TranscendentalCache::Type transcendental_type_; 2795 TranscendentalCache::Type transcendental_type_;
2833 }; 2796 };
2834 2797
2835 2798
2836 class HUnknownOSRValue: public HInstruction { 2799 class HUnknownOSRValue: public HTemplateInstruction<0> {
2837 public: 2800 public:
2838 HUnknownOSRValue() { set_representation(Representation::Tagged()); } 2801 HUnknownOSRValue() { set_representation(Representation::Tagged()); }
2839 2802
2840 virtual Representation RequiredInputRepresentation(int index) const { 2803 virtual Representation RequiredInputRepresentation(int index) const {
2841 return Representation::None(); 2804 return Representation::None();
2842 } 2805 }
2843 2806
2844 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown_osr_value") 2807 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown_osr_value")
2845 }; 2808 };
2846 2809
2847 2810
2848 class HLoadGlobal: public HInstruction { 2811 class HLoadGlobal: public HTemplateInstruction<0> {
2849 public: 2812 public:
2850 HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value) 2813 HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value)
2851 : cell_(cell), check_hole_value_(check_hole_value) { 2814 : cell_(cell), check_hole_value_(check_hole_value) {
2852 set_representation(Representation::Tagged()); 2815 set_representation(Representation::Tagged());
2853 SetFlag(kUseGVN); 2816 SetFlag(kUseGVN);
2854 SetFlag(kDependsOnGlobalVars); 2817 SetFlag(kDependsOnGlobalVars);
2855 } 2818 }
2856 2819
2857 Handle<JSGlobalPropertyCell> cell() const { return cell_; } 2820 Handle<JSGlobalPropertyCell> cell() const { return cell_; }
2858 bool check_hole_value() const { return check_hole_value_; } 2821 bool check_hole_value() const { return check_hole_value_; }
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
3049 return Representation::Tagged(); 3012 return Representation::Tagged();
3050 } 3013 }
3051 3014
3052 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load_function_prototype") 3015 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load_function_prototype")
3053 3016
3054 protected: 3017 protected:
3055 virtual bool DataEquals(HValue* other) { return true; } 3018 virtual bool DataEquals(HValue* other) { return true; }
3056 }; 3019 };
3057 3020
3058 3021
3059 class HLoadKeyed: public HBinaryOperation { 3022 class HLoadKeyedFastElement: public HBinaryOperation {
3060 public: 3023 public:
3061 HLoadKeyed(HValue* obj, HValue* key) : HBinaryOperation(obj, key) { 3024 HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) {
3062 set_representation(Representation::Tagged()); 3025 set_representation(Representation::Tagged());
3063 }
3064
3065 virtual void PrintDataTo(StringStream* stream);
3066
3067 virtual Representation RequiredInputRepresentation(int index) const {
3068 return Representation::Tagged();
3069 }
3070 HValue* object() { return OperandAt(0); }
3071 HValue* key() { return OperandAt(1); }
3072
3073 DECLARE_INSTRUCTION(LoadKeyed)
3074 };
3075
3076
3077 class HLoadKeyedFastElement: public HLoadKeyed {
3078 public:
3079 HLoadKeyedFastElement(HValue* obj, HValue* key) : HLoadKeyed(obj, key) {
3080 SetFlag(kDependsOnArrayElements); 3026 SetFlag(kDependsOnArrayElements);
3081 SetFlag(kUseGVN); 3027 SetFlag(kUseGVN);
3082 } 3028 }
3083 3029
3030 HValue* object() { return OperandAt(0); }
3031 HValue* key() { return OperandAt(1); }
3032
3084 virtual Representation RequiredInputRepresentation(int index) const { 3033 virtual Representation RequiredInputRepresentation(int index) const {
3085 // The key is supposed to be Integer32. 3034 // The key is supposed to be Integer32.
3086 return (index == 1) ? Representation::Integer32() 3035 return (index == 1) ? Representation::Integer32()
3087 : Representation::Tagged(); 3036 : Representation::Tagged();
3088 } 3037 }
3089 3038
3039 virtual void PrintDataTo(StringStream* stream);
3040
3090 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, 3041 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement,
3091 "load_keyed_fast_element") 3042 "load_keyed_fast_element")
3092 3043
3093 protected: 3044 protected:
3094 virtual bool DataEquals(HValue* other) { return true; } 3045 virtual bool DataEquals(HValue* other) { return true; }
3095 }; 3046 };
3096 3047
3097 3048
3098 class HLoadPixelArrayElement: public HBinaryOperation { 3049 class HLoadPixelArrayElement: public HBinaryOperation {
3099 public: 3050 public:
(...skipping 19 matching lines...) Expand all
3119 HValue* key() { return OperandAt(1); } 3070 HValue* key() { return OperandAt(1); }
3120 3071
3121 DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement, 3072 DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement,
3122 "load_pixel_array_element") 3073 "load_pixel_array_element")
3123 3074
3124 protected: 3075 protected:
3125 virtual bool DataEquals(HValue* other) { return true; } 3076 virtual bool DataEquals(HValue* other) { return true; }
3126 }; 3077 };
3127 3078
3128 3079
3129 class HLoadKeyedGeneric: public HLoadKeyed { 3080 class HLoadKeyedGeneric: public HTemplateInstruction<3> {
3130 public: 3081 public:
3131 HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) 3082 HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) {
3132 : HLoadKeyed(obj, key), context_(NULL) { 3083 set_representation(Representation::Tagged());
3084 SetOperandAt(0, obj);
3085 SetOperandAt(1, key);
3133 SetOperandAt(2, context); 3086 SetOperandAt(2, context);
3134 SetAllSideEffects(); 3087 SetAllSideEffects();
3135 } 3088 }
3136 3089
3137 HValue* context() const { return context_; } 3090 HValue* object() { return OperandAt(0); }
3138 HValue* object() { return operands_[0]; } 3091 HValue* key() { return OperandAt(1); }
3139 HValue* key() { return operands_[1]; } 3092 HValue* context() { return OperandAt(2); }
3140 3093
3141 virtual int OperandCount() { return 3; } 3094 virtual void PrintDataTo(StringStream* stream);
3142 virtual HValue* OperandAt(int index) {
3143 return (index < 2) ? operands_[index] : context_;
3144 }
3145
3146 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic")
3147
3148 protected:
3149 virtual void InternalSetOperandAt(int index, HValue* value);
3150
3151 private:
3152 HValue* context_;
3153 };
3154
3155
3156 class HStoreNamed: public HBinaryOperation {
3157 public:
3158 HStoreNamed(HValue* obj, Handle<String> name, HValue* val)
3159 : HBinaryOperation(obj, val), name_(name) {
3160 }
3161 3095
3162 virtual Representation RequiredInputRepresentation(int index) const { 3096 virtual Representation RequiredInputRepresentation(int index) const {
3163 return Representation::Tagged(); 3097 return Representation::Tagged();
3164 } 3098 }
3165 3099
3166 virtual void PrintDataTo(StringStream* stream); 3100 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic")
3167
3168 HValue* object() { return OperandAt(0); }
3169 Handle<String> name() const { return name_; }
3170 HValue* value() { return OperandAt(1); }
3171 void set_value(HValue* value) { SetOperandAt(1, value); }
3172
3173 DECLARE_INSTRUCTION(StoreNamed)
3174
3175 private:
3176 Handle<String> name_;
3177 }; 3101 };
3178 3102
3179 3103
3180 class HStoreNamedField: public HStoreNamed { 3104 class HStoreNamedField: public HBinaryOperation {
3181 public: 3105 public:
3182 HStoreNamedField(HValue* obj, 3106 HStoreNamedField(HValue* obj,
3183 Handle<String> name, 3107 Handle<String> name,
3184 HValue* val, 3108 HValue* val,
3185 bool in_object, 3109 bool in_object,
3186 int offset) 3110 int offset)
3187 : HStoreNamed(obj, name, val), 3111 : HBinaryOperation(obj, val),
3112 name_(name),
3188 is_in_object_(in_object), 3113 is_in_object_(in_object),
3189 offset_(offset) { 3114 offset_(offset) {
3190 if (is_in_object_) { 3115 if (is_in_object_) {
3191 SetFlag(kChangesInobjectFields); 3116 SetFlag(kChangesInobjectFields);
3192 } else { 3117 } else {
3193 SetFlag(kChangesBackingStoreFields); 3118 SetFlag(kChangesBackingStoreFields);
3194 } 3119 }
3195 } 3120 }
3196 3121
3197 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store_named_field") 3122 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store_named_field")
3198 3123
3199 virtual Representation RequiredInputRepresentation(int index) const { 3124 virtual Representation RequiredInputRepresentation(int index) const {
3200 return Representation::Tagged(); 3125 return Representation::Tagged();
3201 } 3126 }
3202 virtual void PrintDataTo(StringStream* stream); 3127 virtual void PrintDataTo(StringStream* stream);
3203 3128
3129 HValue* object() { return OperandAt(0); }
3130 HValue* value() { return OperandAt(1); }
3131
3132 Handle<String> name() const { return name_; }
3204 bool is_in_object() const { return is_in_object_; } 3133 bool is_in_object() const { return is_in_object_; }
3205 int offset() const { return offset_; } 3134 int offset() const { return offset_; }
3206 Handle<Map> transition() const { return transition_; } 3135 Handle<Map> transition() const { return transition_; }
3207 void set_transition(Handle<Map> map) { transition_ = map; } 3136 void set_transition(Handle<Map> map) { transition_ = map; }
3208 3137
3209 bool NeedsWriteBarrier() { 3138 bool NeedsWriteBarrier() {
3210 return StoringValueNeedsWriteBarrier(value()); 3139 return StoringValueNeedsWriteBarrier(value());
3211 } 3140 }
3212 3141
3213 private: 3142 private:
3143 Handle<String> name_;
3214 bool is_in_object_; 3144 bool is_in_object_;
3215 int offset_; 3145 int offset_;
3216 Handle<Map> transition_; 3146 Handle<Map> transition_;
3217 }; 3147 };
3218 3148
3219 3149
3220 class HStoreNamedGeneric: public HStoreNamed { 3150 class HStoreNamedGeneric: public HTemplateInstruction<3> {
3221 public: 3151 public:
3222 HStoreNamedGeneric(HValue* context, 3152 HStoreNamedGeneric(HValue* context,
3223 HValue* object, 3153 HValue* object,
3224 Handle<String> name, 3154 Handle<String> name,
3225 HValue* value) 3155 HValue* value)
3226 : HStoreNamed(object, name, value), context_(NULL) { 3156 : name_(name) {
3157 SetOperandAt(0, object);
3158 SetOperandAt(1, value);
3227 SetOperandAt(2, context); 3159 SetOperandAt(2, context);
3228 SetAllSideEffects(); 3160 SetAllSideEffects();
3229 } 3161 }
3230 3162
3231 HValue* context() const { return context_; } 3163 HValue* object() { return OperandAt(0); }
3232 HValue* object() const { return operands_[0]; } 3164 HValue* value() { return OperandAt(1); }
3233 HValue* value() const { return operands_[1]; } 3165 HValue* context() { return OperandAt(2); }
3234 3166 Handle<String> name() { return name_; }
3235 virtual int OperandCount() { return 3; }
3236
3237 virtual HValue* OperandAt(int index) {
3238 return (index < 2) ? operands_[index] : context_;
3239 }
3240
3241 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic")
3242
3243 protected:
3244 virtual void InternalSetOperandAt(int index, HValue* value);
3245
3246 private:
3247 HValue* context_;
3248 };
3249
3250
3251 class HStoreKeyed: public HInstruction {
3252 public:
3253 HStoreKeyed(HValue* obj, HValue* key, HValue* val) {
3254 SetOperandAt(0, obj);
3255 SetOperandAt(1, key);
3256 SetOperandAt(2, val);
3257 }
3258 3167
3259 virtual void PrintDataTo(StringStream* stream); 3168 virtual void PrintDataTo(StringStream* stream);
3260 virtual int OperandCount() { return operands_.length(); }
3261 virtual HValue* OperandAt(int index) { return operands_[index]; }
3262 3169
3263 virtual Representation RequiredInputRepresentation(int index) const { 3170 virtual Representation RequiredInputRepresentation(int index) const {
3264 return Representation::Tagged(); 3171 return Representation::Tagged();
3265 } 3172 }
3266 3173
3174 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic")
3175
3176 private:
3177 Handle<String> name_;
3178 };
3179
3180
3181 class HStoreKeyedFastElement: public HTemplateInstruction<3> {
3182 public:
3183 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) {
3184 SetOperandAt(0, obj);
3185 SetOperandAt(1, key);
3186 SetOperandAt(2, val);
3187 SetFlag(kChangesArrayElements);
3188 }
3189
3190 virtual Representation RequiredInputRepresentation(int index) const {
3191 // The key is supposed to be Integer32.
3192 return (index == 1) ? Representation::Integer32()
3193 : Representation::Tagged();
3194 }
3195
3267 HValue* object() { return OperandAt(0); } 3196 HValue* object() { return OperandAt(0); }
3268 HValue* key() { return OperandAt(1); } 3197 HValue* key() { return OperandAt(1); }
3269 HValue* value() { return OperandAt(2); } 3198 HValue* value() { return OperandAt(2); }
3270 3199
3271 bool NeedsWriteBarrier() { 3200 bool NeedsWriteBarrier() {
3272 return StoringValueNeedsWriteBarrier(value()); 3201 return StoringValueNeedsWriteBarrier(value());
3273 } 3202 }
3274 3203
3275 DECLARE_INSTRUCTION(StoreKeyed) 3204 virtual void PrintDataTo(StringStream* stream);
3276
3277 protected:
3278 virtual void InternalSetOperandAt(int index, HValue* value) {
3279 operands_[index] = value;
3280 }
3281
3282 HOperandVector<3> operands_;
3283 };
3284
3285
3286 class HStoreKeyedFastElement: public HStoreKeyed {
3287 public:
3288 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val)
3289 : HStoreKeyed(obj, key, val) {
3290 SetFlag(kChangesArrayElements);
3291 }
3292
3293 virtual Representation RequiredInputRepresentation(int index) const {
3294 // The key is supposed to be Integer32.
3295 return (index == 1) ? Representation::Integer32()
3296 : Representation::Tagged();
3297 }
3298 3205
3299 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, 3206 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement,
3300 "store_keyed_fast_element") 3207 "store_keyed_fast_element")
3301 }; 3208 };
3302 3209
3303 3210
3304 class HStorePixelArrayElement: public HInstruction { 3211 class HStorePixelArrayElement: public HTemplateInstruction<3> {
3305 public: 3212 public:
3306 HStorePixelArrayElement(HValue* external_elements, HValue* key, HValue* val) { 3213 HStorePixelArrayElement(HValue* external_elements, HValue* key, HValue* val) {
3307 SetFlag(kChangesPixelArrayElements); 3214 SetFlag(kChangesPixelArrayElements);
3308 SetOperandAt(0, external_elements); 3215 SetOperandAt(0, external_elements);
3309 SetOperandAt(1, key); 3216 SetOperandAt(1, key);
3310 SetOperandAt(2, val); 3217 SetOperandAt(2, val);
3311 } 3218 }
3312 3219
3313 virtual void PrintDataTo(StringStream* stream); 3220 virtual void PrintDataTo(StringStream* stream);
3314 virtual int OperandCount() { return operands_.length(); }
3315 virtual HValue* OperandAt(int index) { return operands_[index]; }
3316 3221
3317 virtual Representation RequiredInputRepresentation(int index) const { 3222 virtual Representation RequiredInputRepresentation(int index) const {
3318 if (index == 0) { 3223 if (index == 0) {
3319 return Representation::External(); 3224 return Representation::External();
3320 } else { 3225 } else {
3321 return Representation::Integer32(); 3226 return Representation::Integer32();
3322 } 3227 }
3323 } 3228 }
3324 3229
3325 HValue* external_pointer() { return operands_[0]; } 3230 HValue* external_pointer() { return OperandAt(0); }
3326 HValue* key() { return operands_[1]; } 3231 HValue* key() { return OperandAt(1); }
3327 HValue* value() { return operands_[2]; } 3232 HValue* value() { return OperandAt(2); }
3328 3233
3329 DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement, 3234 DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement,
3330 "store_pixel_array_element") 3235 "store_pixel_array_element")
3331
3332 protected:
3333 virtual void InternalSetOperandAt(int index, HValue* value) {
3334 operands_[index] = value;
3335 }
3336
3337 HOperandVector<3> operands_;
3338 }; 3236 };
3339 3237
3340 3238
3341 class HStoreKeyedGeneric: public HStoreKeyed { 3239 class HStoreKeyedGeneric: public HTemplateInstruction<4> {
3342 public: 3240 public:
3343 HStoreKeyedGeneric(HValue* context, 3241 HStoreKeyedGeneric(HValue* context,
3344 HValue* object, 3242 HValue* object,
3345 HValue* key, 3243 HValue* key,
3346 HValue* value) 3244 HValue* value) {
3347 : HStoreKeyed(object, key, value), context_(NULL) { 3245 SetOperandAt(0, object);
3246 SetOperandAt(1, key);
3247 SetOperandAt(2, value);
3348 SetOperandAt(3, context); 3248 SetOperandAt(3, context);
3349 SetAllSideEffects(); 3249 SetAllSideEffects();
3350 } 3250 }
3351 3251
3352 HValue* context() { return context_; } 3252 HValue* object() { return OperandAt(0); }
3353 HValue* object() { return operands_[0]; } 3253 HValue* key() { return OperandAt(1); }
3354 HValue* key() { return operands_[1]; } 3254 HValue* value() { return OperandAt(2); }
3355 HValue* value() { return operands_[2]; } 3255 HValue* context() { return OperandAt(3); }
3356 3256
3357 virtual int OperandCount() { return 4; } 3257 virtual Representation RequiredInputRepresentation(int index) const {
3358 3258 return Representation::Tagged();
3359 virtual HValue* OperandAt(int index) {
3360 return (index < 3) ? operands_[index] : context_;
3361 } 3259 }
3362 3260
3261 virtual void PrintDataTo(StringStream* stream);
3262
3363 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic") 3263 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic")
3364
3365 protected:
3366 virtual void InternalSetOperandAt(int index, HValue* value);
3367
3368 private:
3369 HValue* context_;
3370 }; 3264 };
3371 3265
3372 3266
3373 class HStringCharCodeAt: public HBinaryOperation { 3267 class HStringCharCodeAt: public HBinaryOperation {
3374 public: 3268 public:
3375 HStringCharCodeAt(HValue* string, HValue* index) 3269 HStringCharCodeAt(HValue* string, HValue* index)
3376 : HBinaryOperation(string, index) { 3270 : HBinaryOperation(string, index) {
3377 set_representation(Representation::Integer32()); 3271 set_representation(Representation::Integer32());
3378 SetFlag(kUseGVN); 3272 SetFlag(kUseGVN);
3379 } 3273 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3418 3312
3419 protected: 3313 protected:
3420 virtual bool DataEquals(HValue* other) { return true; } 3314 virtual bool DataEquals(HValue* other) { return true; }
3421 3315
3422 virtual Range* InferRange() { 3316 virtual Range* InferRange() {
3423 return new Range(0, String::kMaxLength); 3317 return new Range(0, String::kMaxLength);
3424 } 3318 }
3425 }; 3319 };
3426 3320
3427 3321
3428 class HMaterializedLiteral: public HInstruction { 3322 template <int V>
3323 class HMaterializedLiteral: public HTemplateInstruction<V> {
3429 public: 3324 public:
3430 HMaterializedLiteral(int index, int depth) 3325 HMaterializedLiteral<V>(int index, int depth)
3431 : literal_index_(index), depth_(depth) { 3326 : literal_index_(index), depth_(depth) {
3432 set_representation(Representation::Tagged()); 3327 this->set_representation(Representation::Tagged());
3433 } 3328 }
3434 3329
3435 int literal_index() const { return literal_index_; } 3330 int literal_index() const { return literal_index_; }
3436 int depth() const { return depth_; } 3331 int depth() const { return depth_; }
3437 3332
3438 DECLARE_INSTRUCTION(MaterializedLiteral)
3439
3440 private: 3333 private:
3441 int literal_index_; 3334 int literal_index_;
3442 int depth_; 3335 int depth_;
3443 }; 3336 };
3444 3337
3445 3338
3446 class HArrayLiteral: public HMaterializedLiteral { 3339 class HArrayLiteral: public HMaterializedLiteral<0> {
3447 public: 3340 public:
3448 HArrayLiteral(Handle<FixedArray> constant_elements, 3341 HArrayLiteral(Handle<FixedArray> constant_elements,
3449 int length, 3342 int length,
3450 int literal_index, 3343 int literal_index,
3451 int depth) 3344 int depth)
3452 : HMaterializedLiteral(literal_index, depth), 3345 : HMaterializedLiteral<0>(literal_index, depth),
3453 length_(length), 3346 length_(length),
3454 constant_elements_(constant_elements) {} 3347 constant_elements_(constant_elements) {}
3455 3348
3456 Handle<FixedArray> constant_elements() const { return constant_elements_; } 3349 Handle<FixedArray> constant_elements() const { return constant_elements_; }
3457 int length() const { return length_; } 3350 int length() const { return length_; }
3458 3351
3459 bool IsCopyOnWrite() const; 3352 bool IsCopyOnWrite() const;
3460 3353
3461 virtual Representation RequiredInputRepresentation(int index) const { 3354 virtual Representation RequiredInputRepresentation(int index) const {
3462 return Representation::None(); 3355 return Representation::None();
3463 } 3356 }
3464 3357
3465 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal") 3358 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal")
3466 3359
3467 private: 3360 private:
3468 int length_; 3361 int length_;
3469 Handle<FixedArray> constant_elements_; 3362 Handle<FixedArray> constant_elements_;
3470 }; 3363 };
3471 3364
3472 3365
3473 class HObjectLiteral: public HMaterializedLiteral { 3366 class HObjectLiteral: public HMaterializedLiteral<1> {
3474 public: 3367 public:
3475 HObjectLiteral(HValue* context, 3368 HObjectLiteral(HValue* context,
3476 Handle<FixedArray> constant_properties, 3369 Handle<FixedArray> constant_properties,
3477 bool fast_elements, 3370 bool fast_elements,
3478 int literal_index, 3371 int literal_index,
3479 int depth) 3372 int depth)
3480 : HMaterializedLiteral(literal_index, depth), 3373 : HMaterializedLiteral<1>(literal_index, depth),
3481 context_(NULL),
3482 constant_properties_(constant_properties), 3374 constant_properties_(constant_properties),
3483 fast_elements_(fast_elements) { 3375 fast_elements_(fast_elements) {
3484 SetOperandAt(0, context); 3376 SetOperandAt(0, context);
3485 } 3377 }
3486 3378
3487 HValue* context() const { return context_; } 3379 HValue* context() { return OperandAt(0); }
3488 Handle<FixedArray> constant_properties() const { 3380 Handle<FixedArray> constant_properties() const {
3489 return constant_properties_; 3381 return constant_properties_;
3490 } 3382 }
3491 bool fast_elements() const { return fast_elements_; } 3383 bool fast_elements() const { return fast_elements_; }
3492 3384
3493 virtual int OperandCount() { return 1; }
3494 virtual HValue* OperandAt(int index) { return context_; }
3495
3496 virtual Representation RequiredInputRepresentation(int index) const { 3385 virtual Representation RequiredInputRepresentation(int index) const {
3497 return Representation::Tagged(); 3386 return Representation::Tagged();
3498 } 3387 }
3499 3388
3500 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal") 3389 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal")
3501 3390
3502 protected:
3503 virtual void InternalSetOperandAt(int index, HValue* value) {
3504 context_ = value;
3505 }
3506
3507 private: 3391 private:
3508 HValue* context_;
3509 Handle<FixedArray> constant_properties_; 3392 Handle<FixedArray> constant_properties_;
3510 bool fast_elements_; 3393 bool fast_elements_;
3511 }; 3394 };
3512 3395
3513 3396
3514 class HRegExpLiteral: public HMaterializedLiteral { 3397 class HRegExpLiteral: public HMaterializedLiteral<0> {
3515 public: 3398 public:
3516 HRegExpLiteral(Handle<String> pattern, 3399 HRegExpLiteral(Handle<String> pattern,
3517 Handle<String> flags, 3400 Handle<String> flags,
3518 int literal_index) 3401 int literal_index)
3519 : HMaterializedLiteral(literal_index, 0), 3402 : HMaterializedLiteral<0>(literal_index, 0),
3520 pattern_(pattern), 3403 pattern_(pattern),
3521 flags_(flags) { } 3404 flags_(flags) { }
3522 3405
3523 Handle<String> pattern() { return pattern_; } 3406 Handle<String> pattern() { return pattern_; }
3524 Handle<String> flags() { return flags_; } 3407 Handle<String> flags() { return flags_; }
3525 3408
3526 virtual Representation RequiredInputRepresentation(int index) const { 3409 virtual Representation RequiredInputRepresentation(int index) const {
3527 return Representation::None(); 3410 return Representation::None();
3528 } 3411 }
3529 3412
3530 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp_literal") 3413 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp_literal")
3531 3414
3532 private: 3415 private:
3533 Handle<String> pattern_; 3416 Handle<String> pattern_;
3534 Handle<String> flags_; 3417 Handle<String> flags_;
3535 }; 3418 };
3536 3419
3537 3420
3538 class HFunctionLiteral: public HInstruction { 3421 class HFunctionLiteral: public HTemplateInstruction<0> {
3539 public: 3422 public:
3540 HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure) 3423 HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure)
3541 : shared_info_(shared), pretenure_(pretenure) { 3424 : shared_info_(shared), pretenure_(pretenure) {
3542 set_representation(Representation::Tagged()); 3425 set_representation(Representation::Tagged());
3543 } 3426 }
3544 3427
3545 virtual Representation RequiredInputRepresentation(int index) const { 3428 virtual Representation RequiredInputRepresentation(int index) const {
3546 return Representation::None(); 3429 return Representation::None();
3547 } 3430 }
3548 3431
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3602 HValue* object() { return left(); } 3485 HValue* object() { return left(); }
3603 HValue* key() { return right(); } 3486 HValue* key() { return right(); }
3604 }; 3487 };
3605 3488
3606 #undef DECLARE_INSTRUCTION 3489 #undef DECLARE_INSTRUCTION
3607 #undef DECLARE_CONCRETE_INSTRUCTION 3490 #undef DECLARE_CONCRETE_INSTRUCTION
3608 3491
3609 } } // namespace v8::internal 3492 } } // namespace v8::internal
3610 3493
3611 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 3494 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698