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

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

Issue 7008011: First step in refactoring hydrogen control instructions. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 7 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/lithium-allocator.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 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 HInstruction* next_; 752 HInstruction* next_;
753 HInstruction* previous_; 753 HInstruction* previous_;
754 int position_; 754 int position_;
755 755
756 friend class HBasicBlock; 756 friend class HBasicBlock;
757 }; 757 };
758 758
759 759
760 class HControlInstruction: public HInstruction { 760 class HControlInstruction: public HInstruction {
761 public: 761 public:
762 HControlInstruction(HBasicBlock* first, HBasicBlock* second) 762 virtual HBasicBlock* SuccessorAt(int i) = 0;
763 : first_successor_(first), second_successor_(second) { 763 virtual int SuccessorCount() = 0;
764 }
765
766 HBasicBlock* FirstSuccessor() const { return first_successor_; }
767 HBasicBlock* SecondSuccessor() const { return second_successor_; }
768 764
769 virtual void PrintDataTo(StringStream* stream); 765 virtual void PrintDataTo(StringStream* stream);
770 766
767 HBasicBlock* FirstSuccessor() {
768 return SuccessorCount() > 0 ? SuccessorAt(0) : NULL;
769 }
770 HBasicBlock* SecondSuccessor() {
771 return SuccessorCount() > 1 ? SuccessorAt(1) : NULL;
772 }
773
771 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) 774 DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
772
773 private:
774 HBasicBlock* first_successor_;
775 HBasicBlock* second_successor_;
776 }; 775 };
777 776
778 777
779 template<int NumElements> 778 class HSuccessorIterator BASE_EMBEDDED {
780 class HOperandContainer {
781 public: 779 public:
782 HOperandContainer() : elems_() { } 780 explicit HSuccessorIterator(HControlInstruction* instr)
781 : instr_(instr), next_(0) { }
782
783 bool HasNext() { return next_ < instr_->SuccessorCount(); }
784 HBasicBlock* Next() { return instr_->SuccessorAt(next_); }
785 void Advance() { next_++; }
786
787 private:
788 HControlInstruction* instr_;
789 int next_;
790 };
791
792
793 template<typename T, int NumElements>
Kevin Millikin (Chromium) 2011/05/25 15:50:28 We have more or less this class "OperandContainer"
794 class Container {
795 public:
796 Container() : elems_() { }
783 797
784 int length() { return NumElements; } 798 int length() { return NumElements; }
785 HValue*& operator[](int i) { 799 T& operator[](int i) {
786 ASSERT(i < length()); 800 ASSERT(i < length());
787 return elems_[i]; 801 return elems_[i];
788 } 802 }
789 803
790 private: 804 private:
791 HValue* elems_[NumElements]; 805 T elems_[NumElements];
792 }; 806 };
793 807
794 808
795 template<> 809 template<typename T>
796 class HOperandContainer<0> { 810 class Container<T, 0> {
797 public: 811 public:
798 int length() { return 0; } 812 int length() { return 0; }
799 HValue*& operator[](int i) { 813 T& operator[](int i) {
800 UNREACHABLE(); 814 UNREACHABLE();
801 static HValue* t = 0; 815 static T t = 0;
802 return t; 816 return t;
803 } 817 }
804 }; 818 };
805 819
806 820
807 template<int V> 821 template<int V>
808 class HTemplateInstruction : public HInstruction { 822 class HTemplateInstruction : public HInstruction {
809 public: 823 public:
810 int OperandCount() { return V; } 824 int OperandCount() { return V; }
811 HValue* OperandAt(int i) { return inputs_[i]; } 825 HValue* OperandAt(int i) { return inputs_[i]; }
812 826
813 protected: 827 protected:
814 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 828 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
815 829
816 private: 830 private:
817 HOperandContainer<V> inputs_; 831 Container<HValue*, V> inputs_;
818 }; 832 };
819 833
820 834
821 template<int V> 835 template<int S, int V>
822 class HTemplateControlInstruction : public HControlInstruction { 836 class HTemplateControlInstruction : public HControlInstruction {
823 public: 837 public:
824 HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second)
825 : HControlInstruction(first, second) { }
826 int OperandCount() { return V; } 838 int OperandCount() { return V; }
827 HValue* OperandAt(int i) { return inputs_[i]; } 839 HValue* OperandAt(int i) { return inputs_[i]; }
828 840
841 int SuccessorCount() { return S; }
842 HBasicBlock* SuccessorAt(int i) { return successors_[i]; }
843
829 protected: 844 protected:
830 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 845 void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
846 void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; }
831 847
832 private: 848 private:
833 HOperandContainer<V> inputs_; 849 Container<HBasicBlock*, S> successors_;
850 Container<HValue*, V> inputs_;
834 }; 851 };
835 852
836 853
837 class HBlockEntry: public HTemplateInstruction<0> { 854 class HBlockEntry: public HTemplateInstruction<0> {
838 public: 855 public:
839 virtual Representation RequiredInputRepresentation(int index) const { 856 virtual Representation RequiredInputRepresentation(int index) const {
840 return Representation::None(); 857 return Representation::None();
841 } 858 }
842 859
843 DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 860 DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
844 }; 861 };
845 862
846 863
847 class HDeoptimize: public HControlInstruction { 864 class HDeoptimize: public HControlInstruction {
848 public: 865 public:
849 explicit HDeoptimize(int environment_length) 866 explicit HDeoptimize(int environment_length) : values_(environment_length) { }
850 : HControlInstruction(NULL, NULL),
851 values_(environment_length) { }
852 867
853 virtual Representation RequiredInputRepresentation(int index) const { 868 virtual Representation RequiredInputRepresentation(int index) const {
854 return Representation::None(); 869 return Representation::None();
855 } 870 }
856 871
857 virtual int OperandCount() { return values_.length(); } 872 virtual int OperandCount() { return values_.length(); }
858 virtual HValue* OperandAt(int index) { return values_[index]; } 873 virtual HValue* OperandAt(int index) { return values_[index]; }
859 874
875 virtual int SuccessorCount() { return 0; }
876 virtual HBasicBlock* SuccessorAt(int i) {
877 UNREACHABLE();
878 return NULL;
879 }
880
860 void AddEnvironmentValue(HValue* value) { 881 void AddEnvironmentValue(HValue* value) {
861 values_.Add(NULL); 882 values_.Add(NULL);
862 SetOperandAt(values_.length() - 1, value); 883 SetOperandAt(values_.length() - 1, value);
863 } 884 }
864 885
865 DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 886 DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
866 887
867 enum UseEnvironment { 888 enum UseEnvironment {
868 kNoUses, 889 kNoUses,
869 kUseAll 890 kUseAll
870 }; 891 };
871 892
872 protected: 893 protected:
873 virtual void InternalSetOperandAt(int index, HValue* value) { 894 virtual void InternalSetOperandAt(int index, HValue* value) {
874 values_[index] = value; 895 values_[index] = value;
875 } 896 }
876 897
877 private: 898 private:
878 ZoneList<HValue*> values_; 899 ZoneList<HValue*> values_;
879 }; 900 };
880 901
881 902
882 class HGoto: public HTemplateControlInstruction<0> { 903 class HGoto: public HTemplateControlInstruction<1, 0> {
883 public: 904 public:
884 explicit HGoto(HBasicBlock* target) 905 explicit HGoto(HBasicBlock* target)
885 : HTemplateControlInstruction<0>(target, NULL), 906 : include_stack_check_(false) {
886 include_stack_check_(false) { } 907 SetSuccessorAt(0, target);
908 }
887 909
888 void set_include_stack_check(bool include_stack_check) { 910 void set_include_stack_check(bool include_stack_check) {
889 include_stack_check_ = include_stack_check; 911 include_stack_check_ = include_stack_check;
890 } 912 }
891 bool include_stack_check() const { return include_stack_check_; } 913 bool include_stack_check() const { return include_stack_check_; }
892 914
893 virtual Representation RequiredInputRepresentation(int index) const { 915 virtual Representation RequiredInputRepresentation(int index) const {
894 return Representation::None(); 916 return Representation::None();
895 } 917 }
896 918
897 DECLARE_CONCRETE_INSTRUCTION(Goto) 919 DECLARE_CONCRETE_INSTRUCTION(Goto)
898 920
899 private: 921 private:
900 bool include_stack_check_; 922 bool include_stack_check_;
901 }; 923 };
902 924
903 925
904 class HUnaryControlInstruction: public HTemplateControlInstruction<1> { 926 class HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> {
905 public: 927 public:
906 explicit HUnaryControlInstruction(HValue* value, 928 explicit HUnaryControlInstruction(HValue* value,
907 HBasicBlock* true_target, 929 HBasicBlock* true_target,
908 HBasicBlock* false_target) 930 HBasicBlock* false_target) {
909 : HTemplateControlInstruction<1>(true_target, false_target) {
910 SetOperandAt(0, value); 931 SetOperandAt(0, value);
932 SetSuccessorAt(0, true_target);
933 SetSuccessorAt(1, false_target);
911 } 934 }
912 935
913 virtual void PrintDataTo(StringStream* stream); 936 virtual void PrintDataTo(StringStream* stream);
914 937
915 HValue* value() { return OperandAt(0); } 938 HValue* value() { return OperandAt(0); }
916 }; 939 };
917 940
918 941
919 class HTest: public HUnaryControlInstruction { 942 class HTest: public HUnaryControlInstruction {
920 public: 943 public:
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 return Representation::Tagged(); 975 return Representation::Tagged();
953 } 976 }
954 977
955 DECLARE_CONCRETE_INSTRUCTION(CompareMap) 978 DECLARE_CONCRETE_INSTRUCTION(CompareMap)
956 979
957 private: 980 private:
958 Handle<Map> map_; 981 Handle<Map> map_;
959 }; 982 };
960 983
961 984
962 class HReturn: public HUnaryControlInstruction { 985 class HReturn: public HTemplateControlInstruction<0, 1> {
963 public: 986 public:
964 explicit HReturn(HValue* value) 987 explicit HReturn(HValue* value) {
965 : HUnaryControlInstruction(value, NULL, NULL) { 988 SetOperandAt(0, value);
966 } 989 }
967 990
968 virtual Representation RequiredInputRepresentation(int index) const { 991 virtual Representation RequiredInputRepresentation(int index) const {
969 return Representation::Tagged(); 992 return Representation::Tagged();
970 } 993 }
971 994
995 HValue* value() { return OperandAt(0); }
996
972 DECLARE_CONCRETE_INSTRUCTION(Return) 997 DECLARE_CONCRETE_INSTRUCTION(Return)
973 }; 998 };
974 999
975 1000
976 class HAbnormalExit: public HTemplateControlInstruction<0> { 1001 class HAbnormalExit: public HTemplateControlInstruction<0, 0> {
977 public: 1002 public:
978 HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { }
979
980 virtual Representation RequiredInputRepresentation(int index) const { 1003 virtual Representation RequiredInputRepresentation(int index) const {
981 return Representation::None(); 1004 return Representation::None();
982 } 1005 }
983 1006
984 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1007 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
985 }; 1008 };
986 1009
987 1010
988 class HUnaryOperation: public HTemplateInstruction<1> { 1011 class HUnaryOperation: public HTemplateInstruction<1> {
989 public: 1012 public:
(...skipping 2972 matching lines...) Expand 10 before | Expand all | Expand 10 after
3962 3985
3963 DECLARE_CONCRETE_INSTRUCTION(In) 3986 DECLARE_CONCRETE_INSTRUCTION(In)
3964 }; 3987 };
3965 3988
3966 #undef DECLARE_INSTRUCTION 3989 #undef DECLARE_INSTRUCTION
3967 #undef DECLARE_CONCRETE_INSTRUCTION 3990 #undef DECLARE_CONCRETE_INSTRUCTION
3968 3991
3969 } } // namespace v8::internal 3992 } } // namespace v8::internal
3970 3993
3971 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 3994 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/lithium-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698