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_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
7 | 7 |
8 #include <cstring> | 8 #include <cstring> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 | 10 |
(...skipping 2289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2300 | 2300 |
2301 CallInterfaceDescriptor descriptor_; | 2301 CallInterfaceDescriptor descriptor_; |
2302 ZoneList<HValue*> values_; | 2302 ZoneList<HValue*> values_; |
2303 int argument_count_; | 2303 int argument_count_; |
2304 CallMode call_mode_; | 2304 CallMode call_mode_; |
2305 }; | 2305 }; |
2306 | 2306 |
2307 | 2307 |
2308 class HInvokeFunction final : public HBinaryCall { | 2308 class HInvokeFunction final : public HBinaryCall { |
2309 public: | 2309 public: |
2310 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInvokeFunction, HValue*, int); | 2310 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HInvokeFunction, HValue*, |
2311 | 2311 Handle<JSFunction>, int, |
2312 HInvokeFunction(HValue* context, | 2312 TailCallMode); |
2313 HValue* function, | |
2314 Handle<JSFunction> known_function, | |
2315 int argument_count) | |
2316 : HBinaryCall(context, function, argument_count), | |
2317 known_function_(known_function) { | |
2318 formal_parameter_count_ = | |
2319 known_function.is_null() | |
2320 ? 0 | |
2321 : known_function->shared()->internal_formal_parameter_count(); | |
2322 has_stack_check_ = !known_function.is_null() && | |
2323 (known_function->code()->kind() == Code::FUNCTION || | |
2324 known_function->code()->kind() == Code::OPTIMIZED_FUNCTION); | |
2325 } | |
2326 | |
2327 static HInvokeFunction* New(Isolate* isolate, Zone* zone, HValue* context, | |
2328 HValue* function, | |
2329 Handle<JSFunction> known_function, | |
2330 int argument_count) { | |
2331 return new(zone) HInvokeFunction(context, function, | |
2332 known_function, argument_count); | |
2333 } | |
2334 | 2313 |
2335 HValue* context() { return first(); } | 2314 HValue* context() { return first(); } |
2336 HValue* function() { return second(); } | 2315 HValue* function() { return second(); } |
2337 Handle<JSFunction> known_function() { return known_function_; } | 2316 Handle<JSFunction> known_function() { return known_function_; } |
2338 int formal_parameter_count() const { return formal_parameter_count_; } | 2317 int formal_parameter_count() const { return formal_parameter_count_; } |
2339 | 2318 |
2340 bool HasStackCheck() final { return has_stack_check_; } | 2319 bool HasStackCheck() final { return HasStackCheckField::decode(bit_field_); } |
| 2320 TailCallMode tail_call_mode() const { |
| 2321 return TailCallModeField::decode(bit_field_); |
| 2322 } |
2341 | 2323 |
2342 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) | 2324 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) |
2343 | 2325 |
2344 private: | 2326 private: |
2345 HInvokeFunction(HValue* context, HValue* function, int argument_count) | 2327 void set_has_stack_check(bool has_stack_check) { |
| 2328 bit_field_ = HasStackCheckField::update(bit_field_, has_stack_check); |
| 2329 } |
| 2330 |
| 2331 HInvokeFunction(HValue* context, HValue* function, |
| 2332 Handle<JSFunction> known_function, int argument_count, |
| 2333 TailCallMode tail_call_mode) |
2346 : HBinaryCall(context, function, argument_count), | 2334 : HBinaryCall(context, function, argument_count), |
2347 has_stack_check_(false) { | 2335 known_function_(known_function), |
| 2336 bit_field_(TailCallModeField::encode(tail_call_mode)) { |
| 2337 formal_parameter_count_ = |
| 2338 known_function.is_null() |
| 2339 ? 0 |
| 2340 : known_function->shared()->internal_formal_parameter_count(); |
| 2341 set_has_stack_check( |
| 2342 !known_function.is_null() && |
| 2343 (known_function->code()->kind() == Code::FUNCTION || |
| 2344 known_function->code()->kind() == Code::OPTIMIZED_FUNCTION)); |
2348 } | 2345 } |
2349 | 2346 |
2350 Handle<JSFunction> known_function_; | 2347 Handle<JSFunction> known_function_; |
2351 int formal_parameter_count_; | 2348 int formal_parameter_count_; |
2352 bool has_stack_check_; | 2349 |
| 2350 class HasStackCheckField : public BitField<bool, 0, 1> {}; |
| 2351 class TailCallModeField |
| 2352 : public BitField<TailCallMode, HasStackCheckField::kNext, 1> {}; |
| 2353 uint32_t bit_field_; |
2353 }; | 2354 }; |
2354 | 2355 |
2355 | 2356 |
2356 class HCallNewArray final : public HBinaryCall { | 2357 class HCallNewArray final : public HBinaryCall { |
2357 public: | 2358 public: |
2358 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HCallNewArray, HValue*, int, | 2359 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HCallNewArray, HValue*, int, |
2359 ElementsKind, | 2360 ElementsKind, |
2360 Handle<AllocationSite>); | 2361 Handle<AllocationSite>); |
2361 | 2362 |
2362 HValue* context() { return first(); } | 2363 HValue* context() { return first(); } |
(...skipping 1415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3778 SetOperandAt(1, function); | 3779 SetOperandAt(1, function); |
3779 SetFlag(kUseGVN); | 3780 SetFlag(kUseGVN); |
3780 } | 3781 } |
3781 | 3782 |
3782 bool known_function_; | 3783 bool known_function_; |
3783 }; | 3784 }; |
3784 | 3785 |
3785 | 3786 |
3786 class HApplyArguments final : public HTemplateInstruction<4> { | 3787 class HApplyArguments final : public HTemplateInstruction<4> { |
3787 public: | 3788 public: |
3788 DECLARE_INSTRUCTION_FACTORY_P4(HApplyArguments, HValue*, HValue*, HValue*, | 3789 DECLARE_INSTRUCTION_FACTORY_P5(HApplyArguments, HValue*, HValue*, HValue*, |
3789 HValue*); | 3790 HValue*, TailCallMode); |
3790 | 3791 |
3791 Representation RequiredInputRepresentation(int index) override { | 3792 Representation RequiredInputRepresentation(int index) override { |
3792 // The length is untagged, all other inputs are tagged. | 3793 // The length is untagged, all other inputs are tagged. |
3793 return (index == 2) | 3794 return (index == 2) |
3794 ? Representation::Integer32() | 3795 ? Representation::Integer32() |
3795 : Representation::Tagged(); | 3796 : Representation::Tagged(); |
3796 } | 3797 } |
3797 | 3798 |
3798 HValue* function() { return OperandAt(0); } | 3799 HValue* function() { return OperandAt(0); } |
3799 HValue* receiver() { return OperandAt(1); } | 3800 HValue* receiver() { return OperandAt(1); } |
3800 HValue* length() { return OperandAt(2); } | 3801 HValue* length() { return OperandAt(2); } |
3801 HValue* elements() { return OperandAt(3); } | 3802 HValue* elements() { return OperandAt(3); } |
3802 | 3803 |
| 3804 TailCallMode tail_call_mode() const { |
| 3805 return TailCallModeField::decode(bit_field_); |
| 3806 } |
| 3807 |
3803 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) | 3808 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) |
3804 | 3809 |
3805 private: | 3810 private: |
3806 HApplyArguments(HValue* function, | 3811 HApplyArguments(HValue* function, HValue* receiver, HValue* length, |
3807 HValue* receiver, | 3812 HValue* elements, TailCallMode tail_call_mode) |
3808 HValue* length, | 3813 : bit_field_(TailCallModeField::encode(tail_call_mode)) { |
3809 HValue* elements) { | |
3810 set_representation(Representation::Tagged()); | 3814 set_representation(Representation::Tagged()); |
3811 SetOperandAt(0, function); | 3815 SetOperandAt(0, function); |
3812 SetOperandAt(1, receiver); | 3816 SetOperandAt(1, receiver); |
3813 SetOperandAt(2, length); | 3817 SetOperandAt(2, length); |
3814 SetOperandAt(3, elements); | 3818 SetOperandAt(3, elements); |
3815 SetAllSideEffects(); | 3819 SetAllSideEffects(); |
3816 } | 3820 } |
| 3821 |
| 3822 class TailCallModeField : public BitField<TailCallMode, 0, 1> {}; |
| 3823 uint32_t bit_field_; |
3817 }; | 3824 }; |
3818 | 3825 |
3819 | 3826 |
3820 class HArgumentsElements final : public HTemplateInstruction<0> { | 3827 class HArgumentsElements final : public HTemplateInstruction<0> { |
3821 public: | 3828 public: |
3822 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool); | 3829 DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool); |
3823 | 3830 |
3824 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) | 3831 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) |
3825 | 3832 |
3826 Representation RequiredInputRepresentation(int index) override { | 3833 Representation RequiredInputRepresentation(int index) override { |
(...skipping 3761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7588 | 7595 |
7589 | 7596 |
7590 | 7597 |
7591 #undef DECLARE_INSTRUCTION | 7598 #undef DECLARE_INSTRUCTION |
7592 #undef DECLARE_CONCRETE_INSTRUCTION | 7599 #undef DECLARE_CONCRETE_INSTRUCTION |
7593 | 7600 |
7594 } // namespace internal | 7601 } // namespace internal |
7595 } // namespace v8 | 7602 } // namespace v8 |
7596 | 7603 |
7597 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 7604 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |