OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ |
6 #define V8_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ |
7 | 7 |
8 #include "v8.h" | 8 #include "v8.h" |
9 | 9 |
10 #include "allocation.h" | 10 #include "allocation.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 V(BinaryOperation) \ | 38 V(BinaryOperation) \ |
39 V(BitwiseBinaryOperation) \ | 39 V(BitwiseBinaryOperation) \ |
40 V(ControlInstruction) \ | 40 V(ControlInstruction) \ |
41 V(Instruction) \ | 41 V(Instruction) \ |
42 | 42 |
43 | 43 |
44 #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ | 44 #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ |
45 V(AbnormalExit) \ | 45 V(AbnormalExit) \ |
46 V(AccessArgumentsAt) \ | 46 V(AccessArgumentsAt) \ |
47 V(Add) \ | 47 V(Add) \ |
| 48 V(AllocateBlockContext) \ |
48 V(Allocate) \ | 49 V(Allocate) \ |
49 V(ApplyArguments) \ | 50 V(ApplyArguments) \ |
50 V(ArgumentsElements) \ | 51 V(ArgumentsElements) \ |
51 V(ArgumentsLength) \ | 52 V(ArgumentsLength) \ |
52 V(ArgumentsObject) \ | 53 V(ArgumentsObject) \ |
53 V(ArrayShift) \ | 54 V(ArrayShift) \ |
54 V(Bitwise) \ | 55 V(Bitwise) \ |
55 V(BlockEntry) \ | 56 V(BlockEntry) \ |
56 V(BoundsCheck) \ | 57 V(BoundsCheck) \ |
57 V(BoundsCheckBaseIndexInformation) \ | 58 V(BoundsCheckBaseIndexInformation) \ |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 V(Ror) \ | 134 V(Ror) \ |
134 V(Sar) \ | 135 V(Sar) \ |
135 V(SeqStringGetChar) \ | 136 V(SeqStringGetChar) \ |
136 V(SeqStringSetChar) \ | 137 V(SeqStringSetChar) \ |
137 V(Shl) \ | 138 V(Shl) \ |
138 V(Shr) \ | 139 V(Shr) \ |
139 V(Simulate) \ | 140 V(Simulate) \ |
140 V(StackCheck) \ | 141 V(StackCheck) \ |
141 V(StoreCodeEntry) \ | 142 V(StoreCodeEntry) \ |
142 V(StoreContextSlot) \ | 143 V(StoreContextSlot) \ |
| 144 V(StoreFrameContext) \ |
143 V(StoreGlobalCell) \ | 145 V(StoreGlobalCell) \ |
144 V(StoreKeyed) \ | 146 V(StoreKeyed) \ |
145 V(StoreKeyedGeneric) \ | 147 V(StoreKeyedGeneric) \ |
146 V(StoreNamedField) \ | 148 V(StoreNamedField) \ |
147 V(StoreNamedGeneric) \ | 149 V(StoreNamedGeneric) \ |
148 V(StringAdd) \ | 150 V(StringAdd) \ |
149 V(StringCharCodeAt) \ | 151 V(StringCharCodeAt) \ |
150 V(StringCharFromCode) \ | 152 V(StringCharFromCode) \ |
151 V(StringCompareAndBranch) \ | 153 V(StringCompareAndBranch) \ |
152 V(Sub) \ | 154 V(Sub) \ |
(...skipping 5689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5842 // Load and check the value of the context slot. Deoptimize if it's the | 5844 // Load and check the value of the context slot. Deoptimize if it's the |
5843 // hole value. This is used for checking for loading of uninitialized | 5845 // hole value. This is used for checking for loading of uninitialized |
5844 // harmony bindings where we deoptimize into full-codegen generated code | 5846 // harmony bindings where we deoptimize into full-codegen generated code |
5845 // which will subsequently throw a reference error. | 5847 // which will subsequently throw a reference error. |
5846 kCheckDeoptimize, | 5848 kCheckDeoptimize, |
5847 // Load and check the value of the context slot. Return undefined if it's | 5849 // Load and check the value of the context slot. Return undefined if it's |
5848 // the hole value. This is used for non-harmony const assignments | 5850 // the hole value. This is used for non-harmony const assignments |
5849 kCheckReturnUndefined | 5851 kCheckReturnUndefined |
5850 }; | 5852 }; |
5851 | 5853 |
5852 HLoadContextSlot(HValue* context, Variable* var) | 5854 HLoadContextSlot(HValue* context, int slot_index, Mode mode) |
5853 : HUnaryOperation(context), slot_index_(var->index()) { | 5855 : HUnaryOperation(context), slot_index_(slot_index), mode_(mode) { |
5854 ASSERT(var->IsContextSlot()); | |
5855 switch (var->mode()) { | |
5856 case LET: | |
5857 case CONST: | |
5858 mode_ = kCheckDeoptimize; | |
5859 break; | |
5860 case CONST_LEGACY: | |
5861 mode_ = kCheckReturnUndefined; | |
5862 break; | |
5863 default: | |
5864 mode_ = kNoCheck; | |
5865 } | |
5866 set_representation(Representation::Tagged()); | 5856 set_representation(Representation::Tagged()); |
5867 SetFlag(kUseGVN); | 5857 SetFlag(kUseGVN); |
5868 SetDependsOnFlag(kContextSlots); | 5858 SetDependsOnFlag(kContextSlots); |
5869 } | 5859 } |
5870 | 5860 |
5871 int slot_index() const { return slot_index_; } | 5861 int slot_index() const { return slot_index_; } |
5872 Mode mode() const { return mode_; } | 5862 Mode mode() const { return mode_; } |
5873 | 5863 |
5874 bool DeoptimizesOnHole() { | 5864 bool DeoptimizesOnHole() { |
5875 return mode_ == kCheckDeoptimize; | 5865 return mode_ == kCheckDeoptimize; |
(...skipping 1922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7798 return HType::Tagged(); | 7788 return HType::Tagged(); |
7799 } | 7789 } |
7800 | 7790 |
7801 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); | 7791 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); |
7802 | 7792 |
7803 private: | 7793 private: |
7804 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7794 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
7805 }; | 7795 }; |
7806 | 7796 |
7807 | 7797 |
| 7798 class HStoreFrameContext: public HUnaryOperation { |
| 7799 public: |
| 7800 DECLARE_INSTRUCTION_FACTORY_P1(HStoreFrameContext, HValue*); |
| 7801 |
| 7802 HValue* context() { return OperandAt(0); } |
| 7803 |
| 7804 virtual Representation RequiredInputRepresentation(int index) { |
| 7805 return Representation::Tagged(); |
| 7806 } |
| 7807 |
| 7808 DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext) |
| 7809 private: |
| 7810 explicit HStoreFrameContext(HValue* context) |
| 7811 : HUnaryOperation(context) { |
| 7812 set_representation(Representation::Tagged()); |
| 7813 SetChangesFlag(kContextSlots); |
| 7814 } |
| 7815 }; |
| 7816 |
| 7817 |
| 7818 class HAllocateBlockContext: public HTemplateInstruction<2> { |
| 7819 public: |
| 7820 DECLARE_INSTRUCTION_FACTORY_P3(HAllocateBlockContext, HValue*, |
| 7821 HValue*, Handle<ScopeInfo>); |
| 7822 HValue* context() { return OperandAt(0); } |
| 7823 HValue* function() { return OperandAt(1); } |
| 7824 Handle<ScopeInfo> scope_info() { return scope_info_; } |
| 7825 |
| 7826 virtual Representation RequiredInputRepresentation(int index) { |
| 7827 return Representation::Tagged(); |
| 7828 } |
| 7829 |
| 7830 virtual void PrintDataTo(StringStream* stream); |
| 7831 |
| 7832 DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext) |
| 7833 |
| 7834 private: |
| 7835 HAllocateBlockContext(HValue* context, |
| 7836 HValue* function, |
| 7837 Handle<ScopeInfo> scope_info) |
| 7838 : scope_info_(scope_info) { |
| 7839 SetOperandAt(0, context); |
| 7840 SetOperandAt(1, function); |
| 7841 set_representation(Representation::Tagged()); |
| 7842 } |
| 7843 |
| 7844 Handle<ScopeInfo> scope_info_; |
| 7845 }; |
| 7846 |
| 7847 |
| 7848 |
7808 #undef DECLARE_INSTRUCTION | 7849 #undef DECLARE_INSTRUCTION |
7809 #undef DECLARE_CONCRETE_INSTRUCTION | 7850 #undef DECLARE_CONCRETE_INSTRUCTION |
7810 | 7851 |
7811 } } // namespace v8::internal | 7852 } } // namespace v8::internal |
7812 | 7853 |
7813 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7854 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |