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

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

Issue 6390003: Introduce a hydrogen value for contexts, support context slot assignment. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Sorted Lithium instructions names. 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
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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 V(CheckFunction) \ 91 V(CheckFunction) \
92 V(CheckInstanceType) \ 92 V(CheckInstanceType) \
93 V(CheckMap) \ 93 V(CheckMap) \
94 V(CheckNonSmi) \ 94 V(CheckNonSmi) \
95 V(CheckPrototypeMaps) \ 95 V(CheckPrototypeMaps) \
96 V(CheckSmi) \ 96 V(CheckSmi) \
97 V(Compare) \ 97 V(Compare) \
98 V(CompareJSObjectEq) \ 98 V(CompareJSObjectEq) \
99 V(CompareMap) \ 99 V(CompareMap) \
100 V(Constant) \ 100 V(Constant) \
101 V(Context) \
101 V(DeleteProperty) \ 102 V(DeleteProperty) \
102 V(Deoptimize) \ 103 V(Deoptimize) \
103 V(Div) \ 104 V(Div) \
104 V(EnterInlined) \ 105 V(EnterInlined) \
105 V(FixedArrayLength) \ 106 V(FixedArrayLength) \
106 V(FunctionLiteral) \ 107 V(FunctionLiteral) \
107 V(GlobalObject) \ 108 V(GlobalObject) \
108 V(GlobalReceiver) \ 109 V(GlobalReceiver) \
109 V(Goto) \ 110 V(Goto) \
110 V(InstanceOf) \ 111 V(InstanceOf) \
(...skipping 11 matching lines...) Expand all
122 V(LoadFunctionPrototype) \ 123 V(LoadFunctionPrototype) \
123 V(LoadGlobal) \ 124 V(LoadGlobal) \
124 V(LoadKeyedFastElement) \ 125 V(LoadKeyedFastElement) \
125 V(LoadKeyedGeneric) \ 126 V(LoadKeyedGeneric) \
126 V(LoadNamedField) \ 127 V(LoadNamedField) \
127 V(LoadNamedGeneric) \ 128 V(LoadNamedGeneric) \
128 V(Mod) \ 129 V(Mod) \
129 V(Mul) \ 130 V(Mul) \
130 V(ObjectLiteral) \ 131 V(ObjectLiteral) \
131 V(OsrEntry) \ 132 V(OsrEntry) \
133 V(OuterContext) \
132 V(Parameter) \ 134 V(Parameter) \
133 V(Power) \ 135 V(Power) \
134 V(PushArgument) \ 136 V(PushArgument) \
135 V(RegExpLiteral) \ 137 V(RegExpLiteral) \
136 V(Return) \ 138 V(Return) \
137 V(Sar) \ 139 V(Sar) \
138 V(Shl) \ 140 V(Shl) \
139 V(Shr) \ 141 V(Shr) \
140 V(Simulate) \ 142 V(Simulate) \
141 V(StackCheck) \ 143 V(StackCheck) \
144 V(StoreContextSlot) \
142 V(StoreGlobal) \ 145 V(StoreGlobal) \
143 V(StoreKeyedFastElement) \ 146 V(StoreKeyedFastElement) \
144 V(StoreKeyedGeneric) \ 147 V(StoreKeyedGeneric) \
145 V(StoreNamedField) \ 148 V(StoreNamedField) \
146 V(StoreNamedGeneric) \ 149 V(StoreNamedGeneric) \
147 V(StringCharCodeAt) \ 150 V(StringCharCodeAt) \
148 V(StringLength) \ 151 V(StringLength) \
149 V(Sub) \ 152 V(Sub) \
150 V(Test) \ 153 V(Test) \
151 V(Throw) \ 154 V(Throw) \
152 V(Typeof) \ 155 V(Typeof) \
153 V(TypeofIs) \ 156 V(TypeofIs) \
154 V(UnaryMathOperation) \ 157 V(UnaryMathOperation) \
155 V(UnknownOSRValue) \ 158 V(UnknownOSRValue) \
156 V(ValueOf) 159 V(ValueOf)
157 160
158 #define GVN_FLAG_LIST(V) \ 161 #define GVN_FLAG_LIST(V) \
159 V(Calls) \ 162 V(Calls) \
160 V(InobjectFields) \ 163 V(InobjectFields) \
161 V(BackingStoreFields) \ 164 V(BackingStoreFields) \
162 V(ArrayElements) \ 165 V(ArrayElements) \
163 V(GlobalVars) \ 166 V(GlobalVars) \
164 V(Maps) \ 167 V(Maps) \
165 V(ArrayLengths) \ 168 V(ArrayLengths) \
169 V(ContextSlots) \
166 V(OsrEntries) 170 V(OsrEntries)
167 171
168 #define DECLARE_INSTRUCTION(type) \ 172 #define DECLARE_INSTRUCTION(type) \
169 virtual bool Is##type() const { return true; } \ 173 virtual bool Is##type() const { return true; } \
170 static H##type* cast(HValue* value) { \ 174 static H##type* cast(HValue* value) { \
171 ASSERT(value->Is##type()); \ 175 ASSERT(value->Is##type()); \
172 return reinterpret_cast<H##type*>(value); \ 176 return reinterpret_cast<H##type*>(value); \
173 } \ 177 } \
174 Opcode opcode() const { return HValue::k##type; } 178 Opcode opcode() const { return HValue::k##type; }
175 179
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after
1053 argument_index_ = index; 1057 argument_index_ = index;
1054 } 1058 }
1055 1059
1056 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument") 1060 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument")
1057 1061
1058 private: 1062 private:
1059 int argument_index_; 1063 int argument_index_;
1060 }; 1064 };
1061 1065
1062 1066
1063 class HGlobalObject: public HInstruction { 1067 class HContext: public HInstruction {
1064 public: 1068 public:
1065 HGlobalObject() { 1069 HContext() {
1066 set_representation(Representation::Tagged()); 1070 set_representation(Representation::Tagged());
1067 SetFlag(kUseGVN); 1071 SetFlag(kUseGVN);
1068 SetFlag(kDependsOnCalls); 1072 }
1073
1074 DECLARE_CONCRETE_INSTRUCTION(Context, "context");
1075
1076 protected:
1077 virtual bool DataEquals(HValue* other) const { return true; }
1078 };
1079
1080
1081 class HOuterContext: public HUnaryOperation {
1082 public:
1083 explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
1084 set_representation(Representation::Tagged());
1085 SetFlag(kUseGVN);
1086 }
1087
1088 DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer_context");
1089
1090 protected:
1091 virtual bool DataEquals(HValue* other) const { return true; }
1092 };
1093
1094
1095 class HGlobalObject: public HUnaryOperation {
1096 public:
1097 explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
1098 set_representation(Representation::Tagged());
1099 SetFlag(kUseGVN);
1069 } 1100 }
1070 1101
1071 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global_object") 1102 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global_object")
1072 1103
1073 protected: 1104 protected:
1074 virtual bool DataEquals(HValue* other) const { return true; } 1105 virtual bool DataEquals(HValue* other) const { return true; }
1075 }; 1106 };
1076 1107
1077 1108
1078 class HGlobalReceiver: public HInstruction { 1109 class HGlobalReceiver: public HUnaryOperation {
1079 public: 1110 public:
1080 HGlobalReceiver() { 1111 explicit HGlobalReceiver(HValue* global_object)
1112 : HUnaryOperation(global_object) {
1081 set_representation(Representation::Tagged()); 1113 set_representation(Representation::Tagged());
1082 SetFlag(kUseGVN); 1114 SetFlag(kUseGVN);
1083 SetFlag(kDependsOnCalls);
1084 } 1115 }
1085 1116
1086 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global_receiver") 1117 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global_receiver")
1087 1118
1088 protected: 1119 protected:
1089 virtual bool DataEquals(HValue* other) const { return true; } 1120 virtual bool DataEquals(HValue* other) const { return true; }
1090 }; 1121 };
1091 1122
1092 1123
1093 class HCall: public HInstruction { 1124 class HCall: public HInstruction {
(...skipping 1512 matching lines...) Expand 10 before | Expand all | Expand 10 after
2606 virtual void PrintDataTo(StringStream* stream) const; 2637 virtual void PrintDataTo(StringStream* stream) const;
2607 2638
2608 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store_global") 2639 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store_global")
2609 2640
2610 private: 2641 private:
2611 Handle<JSGlobalPropertyCell> cell_; 2642 Handle<JSGlobalPropertyCell> cell_;
2612 bool check_hole_value_; 2643 bool check_hole_value_;
2613 }; 2644 };
2614 2645
2615 2646
2616 class HLoadContextSlot: public HInstruction { 2647 class HLoadContextSlot: public HUnaryOperation {
2617 public: 2648 public:
2618 HLoadContextSlot(int context_chain_length , int slot_index) 2649 HLoadContextSlot(HValue* context , int slot_index)
2619 : context_chain_length_(context_chain_length), slot_index_(slot_index) { 2650 : HUnaryOperation(context), slot_index_(slot_index) {
2620 set_representation(Representation::Tagged()); 2651 set_representation(Representation::Tagged());
2621 SetFlag(kUseGVN); 2652 SetFlag(kUseGVN);
2622 SetFlag(kDependsOnCalls); 2653 SetFlag(kDependsOnContextSlots);
2623 } 2654 }
2624 2655
2625 int context_chain_length() const { return context_chain_length_; }
2626 int slot_index() const { return slot_index_; } 2656 int slot_index() const { return slot_index_; }
2627 2657
2658 virtual Representation RequiredInputRepresentation(int index) const {
2659 return Representation::Tagged();
2660 }
2661
2628 virtual void PrintDataTo(StringStream* stream) const; 2662 virtual void PrintDataTo(StringStream* stream) const;
2629 2663
2630 virtual intptr_t Hashcode() const {
2631 return context_chain_length() * 29 + slot_index();
2632 }
2633
2634 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load_context_slot") 2664 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load_context_slot")
2635 2665
2636 protected: 2666 protected:
2637 virtual bool DataEquals(HValue* other) const { 2667 virtual bool DataEquals(HValue* other) const {
2638 HLoadContextSlot* b = HLoadContextSlot::cast(other); 2668 HLoadContextSlot* b = HLoadContextSlot::cast(other);
2639 return (context_chain_length() == b->context_chain_length()) 2669 return (slot_index() == b->slot_index());
2640 && (slot_index() == b->slot_index());
2641 } 2670 }
2642 2671
2643 private: 2672 private:
2644 int context_chain_length_;
2645 int slot_index_; 2673 int slot_index_;
2646 }; 2674 };
2647 2675
2676
2677 static inline bool StoringValueNeedsWriteBarrier(HValue* value) {
2678 return !value->type().IsSmi() &&
2679 !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
2680 }
2681
2682
2683 class HStoreContextSlot: public HBinaryOperation {
2684 public:
2685 HStoreContextSlot(HValue* context, int slot_index, HValue* value)
2686 : HBinaryOperation(context, value), slot_index_(slot_index) {
2687 SetFlag(kChangesContextSlots);
2688 }
2689
2690 HValue* context() const { return OperandAt(0); }
2691 HValue* value() const { return OperandAt(1); }
2692 int slot_index() const { return slot_index_; }
2693
2694 bool NeedsWriteBarrier() const {
2695 return StoringValueNeedsWriteBarrier(value());
2696 }
2697
2698 virtual Representation RequiredInputRepresentation(int index) const {
2699 return Representation::Tagged();
2700 }
2701
2702 virtual void PrintDataTo(StringStream* stream) const;
2703
2704 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store_context_slot")
2705
2706 private:
2707 int slot_index_;
2708 };
2709
2648 2710
2649 class HLoadNamedField: public HUnaryOperation { 2711 class HLoadNamedField: public HUnaryOperation {
2650 public: 2712 public:
2651 HLoadNamedField(HValue* object, bool is_in_object, int offset) 2713 HLoadNamedField(HValue* object, bool is_in_object, int offset)
2652 : HUnaryOperation(object), 2714 : HUnaryOperation(object),
2653 is_in_object_(is_in_object), 2715 is_in_object_(is_in_object),
2654 offset_(offset) { 2716 offset_(offset) {
2655 set_representation(Representation::Tagged()); 2717 set_representation(Representation::Tagged());
2656 SetFlag(kUseGVN); 2718 SetFlag(kUseGVN);
2657 if (is_in_object) { 2719 if (is_in_object) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
2770 class HLoadKeyedGeneric: public HLoadKeyed { 2832 class HLoadKeyedGeneric: public HLoadKeyed {
2771 public: 2833 public:
2772 HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { 2834 HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) {
2773 SetAllSideEffects(); 2835 SetAllSideEffects();
2774 } 2836 }
2775 2837
2776 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") 2838 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic")
2777 }; 2839 };
2778 2840
2779 2841
2780 static inline bool StoringValueNeedsWriteBarrier(HValue* value) {
2781 return !value->type().IsSmi() &&
2782 !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
2783 }
2784
2785
2786 class HStoreNamed: public HBinaryOperation { 2842 class HStoreNamed: public HBinaryOperation {
2787 public: 2843 public:
2788 HStoreNamed(HValue* obj, Handle<Object> name, HValue* val) 2844 HStoreNamed(HValue* obj, Handle<Object> name, HValue* val)
2789 : HBinaryOperation(obj, val), name_(name) { 2845 : HBinaryOperation(obj, val), name_(name) {
2790 } 2846 }
2791 2847
2792 virtual Representation RequiredInputRepresentation(int index) const { 2848 virtual Representation RequiredInputRepresentation(int index) const {
2793 return Representation::Tagged(); 2849 return Representation::Tagged();
2794 } 2850 }
2795 2851
2796 virtual void PrintDataTo(StringStream* stream) const; 2852 virtual void PrintDataTo(StringStream* stream) const;
2797 2853
2798 HValue* object() const { return OperandAt(0); } 2854 HValue* object() const { return OperandAt(0); }
2799 Handle<Object> name() const { return name_; } 2855 Handle<Object> name() const { return name_; }
2800 HValue* value() const { return OperandAt(1); } 2856 HValue* value() const { return OperandAt(1); }
2801 void set_value(HValue* value) { SetOperandAt(1, value); } 2857 void set_value(HValue* value) { SetOperandAt(1, value); }
2802 2858
2803 bool NeedsWriteBarrier() const {
2804 return StoringValueNeedsWriteBarrier(value());
2805 }
2806
2807 DECLARE_INSTRUCTION(StoreNamed) 2859 DECLARE_INSTRUCTION(StoreNamed)
2808 2860
2809 private: 2861 private:
2810 Handle<Object> name_; 2862 Handle<Object> name_;
2811 }; 2863 };
2812 2864
2813 2865
2814 class HStoreNamedField: public HStoreNamed { 2866 class HStoreNamedField: public HStoreNamed {
2815 public: 2867 public:
2816 HStoreNamedField(HValue* obj, 2868 HStoreNamedField(HValue* obj,
2817 Handle<Object> name, 2869 Handle<Object> name,
2818 HValue* val, 2870 HValue* val,
2819 bool in_object, 2871 bool in_object,
2820 int offset) 2872 int offset)
2821 : HStoreNamed(obj, name, val), 2873 : HStoreNamed(obj, name, val),
2822 is_in_object_(in_object), 2874 is_in_object_(in_object),
2823 offset_(offset) { 2875 offset_(offset) {
2824 if (is_in_object_) { 2876 if (is_in_object_) {
2825 SetFlag(kChangesInobjectFields); 2877 SetFlag(kChangesInobjectFields);
2826 } else { 2878 } else {
2827 SetFlag(kChangesBackingStoreFields); 2879 SetFlag(kChangesBackingStoreFields);
2828 } 2880 }
2829 } 2881 }
2830 2882
2831 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store_named_field") 2883 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store_named_field")
2832 2884
2833 virtual Representation RequiredInputRepresentation(int index) const { 2885 virtual Representation RequiredInputRepresentation(int index) const {
2834 return Representation::Tagged(); 2886 return Representation::Tagged();
2835 } 2887 }
2836 virtual void PrintDataTo(StringStream* stream) const; 2888 virtual void PrintDataTo(StringStream* stream) const;
2837 2889
2838 bool is_in_object() const { return is_in_object_; } 2890 bool is_in_object() const { return is_in_object_; }
2839 int offset() const { return offset_; } 2891 int offset() const { return offset_; }
2840 Handle<Map> transition() const { return transition_; } 2892 Handle<Map> transition() const { return transition_; }
2841 void set_transition(Handle<Map> map) { transition_ = map; } 2893 void set_transition(Handle<Map> map) { transition_ = map; }
2842 2894
2895 bool NeedsWriteBarrier() const {
2896 return StoringValueNeedsWriteBarrier(value());
2897 }
2898
2843 private: 2899 private:
2844 bool is_in_object_; 2900 bool is_in_object_;
2845 int offset_; 2901 int offset_;
2846 Handle<Map> transition_; 2902 Handle<Map> transition_;
2847 }; 2903 };
2848 2904
2849 2905
2850 class HStoreNamedGeneric: public HStoreNamed { 2906 class HStoreNamedGeneric: public HStoreNamed {
2851 public: 2907 public:
2852 HStoreNamedGeneric(HValue* obj, Handle<Object> name, HValue* val) 2908 HStoreNamedGeneric(HValue* obj, Handle<Object> name, HValue* val)
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
3121 HValue* object() const { return left(); } 3177 HValue* object() const { return left(); }
3122 HValue* key() const { return right(); } 3178 HValue* key() const { return right(); }
3123 }; 3179 };
3124 3180
3125 #undef DECLARE_INSTRUCTION 3181 #undef DECLARE_INSTRUCTION
3126 #undef DECLARE_CONCRETE_INSTRUCTION 3182 #undef DECLARE_CONCRETE_INSTRUCTION
3127 3183
3128 } } // namespace v8::internal 3184 } } // namespace v8::internal
3129 3185
3130 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 3186 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698