| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 namespace v8 { | 43 namespace v8 { |
| 44 namespace internal { | 44 namespace internal { |
| 45 | 45 |
| 46 // Forward declarations. | 46 // Forward declarations. |
| 47 class HBasicBlock; | 47 class HBasicBlock; |
| 48 class HEnvironment; | 48 class HEnvironment; |
| 49 class HInferRepresentationPhase; | 49 class HInferRepresentationPhase; |
| 50 class HInstruction; | 50 class HInstruction; |
| 51 class HLoopInformation; | 51 class HLoopInformation; |
| 52 class HStoreNamedField; |
| 52 class HValue; | 53 class HValue; |
| 53 class LInstruction; | 54 class LInstruction; |
| 54 class LChunkBuilder; | 55 class LChunkBuilder; |
| 55 | 56 |
| 56 | |
| 57 #define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \ | 57 #define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \ |
| 58 V(ArithmeticBinaryOperation) \ | 58 V(ArithmeticBinaryOperation) \ |
| 59 V(BinaryOperation) \ | 59 V(BinaryOperation) \ |
| 60 V(BitwiseBinaryOperation) \ | 60 V(BitwiseBinaryOperation) \ |
| 61 V(ControlInstruction) \ | 61 V(ControlInstruction) \ |
| 62 V(Instruction) \ | 62 V(Instruction) \ |
| 63 | 63 |
| 64 | 64 |
| 65 #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ | 65 #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ |
| 66 V(AbnormalExit) \ | 66 V(AbnormalExit) \ |
| (...skipping 3156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3223 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) | 3223 DECLARE_CONCRETE_INSTRUCTION(CapturedObject) |
| 3224 }; | 3224 }; |
| 3225 | 3225 |
| 3226 | 3226 |
| 3227 class HConstant V8_FINAL : public HTemplateInstruction<0> { | 3227 class HConstant V8_FINAL : public HTemplateInstruction<0> { |
| 3228 public: | 3228 public: |
| 3229 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); | 3229 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); |
| 3230 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); | 3230 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); |
| 3231 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); | 3231 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); |
| 3232 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); | 3232 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); |
| 3233 DECLARE_INSTRUCTION_FACTORY_P2(HConstant, Handle<Map>, UniqueValueId); |
| 3233 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); | 3234 DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); |
| 3234 | 3235 |
| 3236 static HConstant* CreateAndInsertAfter(Zone* zone, |
| 3237 HValue* context, |
| 3238 int32_t value, |
| 3239 HInstruction* instruction) { |
| 3240 HConstant* new_constant = HConstant::New(zone, context, value); |
| 3241 new_constant->InsertAfter(instruction); |
| 3242 return new_constant; |
| 3243 } |
| 3244 |
| 3245 static HConstant* CreateAndInsertBefore(Zone* zone, |
| 3246 HValue* context, |
| 3247 int32_t value, |
| 3248 HInstruction* instruction) { |
| 3249 HConstant* new_constant = HConstant::New(zone, context, value); |
| 3250 new_constant->InsertBefore(instruction); |
| 3251 return new_constant; |
| 3252 } |
| 3253 |
| 3235 Handle<Object> handle() { | 3254 Handle<Object> handle() { |
| 3236 if (handle_.is_null()) { | 3255 if (handle_.is_null()) { |
| 3237 Factory* factory = Isolate::Current()->factory(); | 3256 Factory* factory = Isolate::Current()->factory(); |
| 3238 // Default arguments to is_not_in_new_space depend on this heap number | 3257 // Default arguments to is_not_in_new_space depend on this heap number |
| 3239 // to be tenured so that it's guaranteed not be be located in new space. | 3258 // to be tenured so that it's guaranteed not be be located in new space. |
| 3240 handle_ = factory->NewNumber(double_value_, TENURED); | 3259 handle_ = factory->NewNumber(double_value_, TENURED); |
| 3241 } | 3260 } |
| 3242 AllowDeferredHandleDereference smi_check; | 3261 AllowDeferredHandleDereference smi_check; |
| 3243 ASSERT(has_int32_value_ || !handle_->IsSmi()); | 3262 ASSERT(has_int32_value_ || !handle_->IsSmi()); |
| 3244 return handle_; | 3263 return handle_; |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3427 bool is_not_in_new_space = true, | 3446 bool is_not_in_new_space = true, |
| 3428 Handle<Object> optional_handle = Handle<Object>::null()); | 3447 Handle<Object> optional_handle = Handle<Object>::null()); |
| 3429 HConstant(Handle<Object> handle, | 3448 HConstant(Handle<Object> handle, |
| 3430 UniqueValueId unique_id, | 3449 UniqueValueId unique_id, |
| 3431 Representation r, | 3450 Representation r, |
| 3432 HType type, | 3451 HType type, |
| 3433 bool is_internalized_string, | 3452 bool is_internalized_string, |
| 3434 bool is_not_in_new_space, | 3453 bool is_not_in_new_space, |
| 3435 bool is_cell, | 3454 bool is_cell, |
| 3436 bool boolean_value); | 3455 bool boolean_value); |
| 3456 HConstant(Handle<Map> handle, |
| 3457 UniqueValueId unique_id); |
| 3437 explicit HConstant(ExternalReference reference); | 3458 explicit HConstant(ExternalReference reference); |
| 3438 | 3459 |
| 3439 void Initialize(Representation r); | 3460 void Initialize(Representation r); |
| 3440 | 3461 |
| 3441 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 3462 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 3442 | 3463 |
| 3443 // If this is a numerical constant, handle_ either points to to the | 3464 // If this is a numerical constant, handle_ either points to to the |
| 3444 // HeapObject the constant originated from or is null. If the | 3465 // HeapObject the constant originated from or is null. If the |
| 3445 // constant is non-numeric, handle_ always points to a valid | 3466 // constant is non-numeric, handle_ always points to a valid |
| 3446 // constant HeapObject. | 3467 // constant HeapObject. |
| (...skipping 1647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5094 } | 5115 } |
| 5095 | 5116 |
| 5096 void MakePrefillWithFiller() { | 5117 void MakePrefillWithFiller() { |
| 5097 flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER); | 5118 flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER); |
| 5098 } | 5119 } |
| 5099 | 5120 |
| 5100 void MakeDoubleAligned() { | 5121 void MakeDoubleAligned() { |
| 5101 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); | 5122 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); |
| 5102 } | 5123 } |
| 5103 | 5124 |
| 5104 void UpdateSize(HValue* size) { | |
| 5105 SetOperandAt(1, size); | |
| 5106 } | |
| 5107 | |
| 5108 virtual void HandleSideEffectDominator(GVNFlag side_effect, | 5125 virtual void HandleSideEffectDominator(GVNFlag side_effect, |
| 5109 HValue* dominator) V8_OVERRIDE; | 5126 HValue* dominator) V8_OVERRIDE; |
| 5110 | 5127 |
| 5111 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 5128 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 5112 | 5129 |
| 5113 DECLARE_CONCRETE_INSTRUCTION(Allocate) | 5130 DECLARE_CONCRETE_INSTRUCTION(Allocate) |
| 5114 | 5131 |
| 5115 private: | 5132 private: |
| 5116 enum Flags { | 5133 enum Flags { |
| 5117 ALLOCATE_IN_NEW_SPACE = 1 << 0, | 5134 ALLOCATE_IN_NEW_SPACE = 1 << 0, |
| 5118 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, | 5135 ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, |
| 5119 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, | 5136 ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, |
| 5120 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, | 5137 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, |
| 5121 PREFILL_WITH_FILLER = 1 << 4 | 5138 PREFILL_WITH_FILLER = 1 << 4 |
| 5122 }; | 5139 }; |
| 5123 | 5140 |
| 5124 HAllocate(HValue* context, | 5141 HAllocate(HValue* context, |
| 5125 HValue* size, | 5142 HValue* size, |
| 5126 HType type, | 5143 HType type, |
| 5127 PretenureFlag pretenure_flag, | 5144 PretenureFlag pretenure_flag, |
| 5128 InstanceType instance_type) | 5145 InstanceType instance_type) |
| 5129 : HTemplateInstruction<2>(type) { | 5146 : HTemplateInstruction<2>(type), |
| 5147 dominating_allocate_(NULL), |
| 5148 filler_free_space_size_(NULL) { |
| 5130 SetOperandAt(0, context); | 5149 SetOperandAt(0, context); |
| 5131 SetOperandAt(1, size); | 5150 SetOperandAt(1, size); |
| 5132 set_representation(Representation::Tagged()); | 5151 set_representation(Representation::Tagged()); |
| 5133 SetFlag(kTrackSideEffectDominators); | 5152 SetFlag(kTrackSideEffectDominators); |
| 5134 SetGVNFlag(kChangesNewSpacePromotion); | 5153 SetGVNFlag(kChangesNewSpacePromotion); |
| 5135 SetGVNFlag(kDependsOnNewSpacePromotion); | 5154 SetGVNFlag(kDependsOnNewSpacePromotion); |
| 5136 flags_ = pretenure_flag == TENURED | 5155 flags_ = pretenure_flag == TENURED |
| 5137 ? (Heap::TargetSpaceId(instance_type) == OLD_POINTER_SPACE | 5156 ? (Heap::TargetSpaceId(instance_type) == OLD_POINTER_SPACE |
| 5138 ? ALLOCATE_IN_OLD_POINTER_SPACE : ALLOCATE_IN_OLD_DATA_SPACE) | 5157 ? ALLOCATE_IN_OLD_POINTER_SPACE : ALLOCATE_IN_OLD_DATA_SPACE) |
| 5139 : ALLOCATE_IN_NEW_SPACE; | 5158 : ALLOCATE_IN_NEW_SPACE; |
| 5140 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { | 5159 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { |
| 5141 flags_ = static_cast<HAllocate::Flags>(flags_ | | 5160 flags_ = static_cast<HAllocate::Flags>(flags_ | |
| 5142 ALLOCATE_DOUBLE_ALIGNED); | 5161 ALLOCATE_DOUBLE_ALIGNED); |
| 5143 } | 5162 } |
| 5144 } | 5163 } |
| 5145 | 5164 |
| 5165 void UpdateSize(HValue* size) { |
| 5166 SetOperandAt(1, size); |
| 5167 } |
| 5168 |
| 5169 HAllocate* GetFoldableDominator(HAllocate* dominator); |
| 5170 |
| 5171 void UpdateFreeSpaceFiller(int32_t filler_size); |
| 5172 |
| 5173 void CreateFreeSpaceFiller(int32_t filler_size); |
| 5174 |
| 5175 bool IsFoldable(HAllocate* allocate) { |
| 5176 return (IsNewSpaceAllocation() && allocate->IsNewSpaceAllocation()) || |
| 5177 (IsOldDataSpaceAllocation() && allocate->IsOldDataSpaceAllocation()) || |
| 5178 (IsOldPointerSpaceAllocation() && |
| 5179 allocate->IsOldPointerSpaceAllocation()); |
| 5180 } |
| 5181 |
| 5146 Flags flags_; | 5182 Flags flags_; |
| 5147 Handle<Map> known_initial_map_; | 5183 Handle<Map> known_initial_map_; |
| 5184 HAllocate* dominating_allocate_; |
| 5185 HStoreNamedField* filler_free_space_size_; |
| 5148 }; | 5186 }; |
| 5149 | 5187 |
| 5150 | 5188 |
| 5151 class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<1> { | 5189 class HInnerAllocatedObject V8_FINAL : public HTemplateInstruction<1> { |
| 5152 public: | 5190 public: |
| 5153 static HInnerAllocatedObject* New(Zone* zone, | 5191 static HInnerAllocatedObject* New(Zone* zone, |
| 5154 HValue* context, | 5192 HValue* context, |
| 5155 HValue* value, | 5193 HValue* value, |
| 5156 int offset, | 5194 int offset, |
| 5157 HType type = HType::Tagged()) { | 5195 HType type = HType::Tagged()) { |
| (...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5984 | 6022 |
| 5985 bool NeedsWriteBarrierForMap() { | 6023 bool NeedsWriteBarrierForMap() { |
| 5986 if (IsSkipWriteBarrier()) return false; | 6024 if (IsSkipWriteBarrier()) return false; |
| 5987 return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); | 6025 return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); |
| 5988 } | 6026 } |
| 5989 | 6027 |
| 5990 Representation field_representation() const { | 6028 Representation field_representation() const { |
| 5991 return access_.representation(); | 6029 return access_.representation(); |
| 5992 } | 6030 } |
| 5993 | 6031 |
| 6032 void UpdateValue(HValue* value) { |
| 6033 SetOperandAt(1, value); |
| 6034 } |
| 6035 |
| 5994 private: | 6036 private: |
| 5995 HStoreNamedField(HValue* obj, | 6037 HStoreNamedField(HValue* obj, |
| 5996 HObjectAccess access, | 6038 HObjectAccess access, |
| 5997 HValue* val) | 6039 HValue* val) |
| 5998 : access_(access), | 6040 : access_(access), |
| 5999 new_space_dominator_(NULL), | 6041 new_space_dominator_(NULL), |
| 6000 write_barrier_mode_(UPDATE_WRITE_BARRIER), | 6042 write_barrier_mode_(UPDATE_WRITE_BARRIER), |
| 6001 has_transition_(false) { | 6043 has_transition_(false) { |
| 6002 SetOperandAt(0, obj); | 6044 SetOperandAt(0, obj); |
| 6003 SetOperandAt(1, val); | 6045 SetOperandAt(1, val); |
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6792 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 6834 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 6793 }; | 6835 }; |
| 6794 | 6836 |
| 6795 | 6837 |
| 6796 #undef DECLARE_INSTRUCTION | 6838 #undef DECLARE_INSTRUCTION |
| 6797 #undef DECLARE_CONCRETE_INSTRUCTION | 6839 #undef DECLARE_CONCRETE_INSTRUCTION |
| 6798 | 6840 |
| 6799 } } // namespace v8::internal | 6841 } } // namespace v8::internal |
| 6800 | 6842 |
| 6801 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 6843 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |