Index: src/crankshaft/hydrogen-instructions.h |
diff --git a/src/crankshaft/hydrogen-instructions.h b/src/crankshaft/hydrogen-instructions.h |
index da21400cea5a8410d92ae12c8a304629935a958d..1ccc9dd0a88bdc975032c3d25ec76e33ada3800a 100644 |
--- a/src/crankshaft/hydrogen-instructions.h |
+++ b/src/crankshaft/hydrogen-instructions.h |
@@ -2307,49 +2307,50 @@ class HCallWithDescriptor final : public HInstruction { |
class HInvokeFunction final : public HBinaryCall { |
public: |
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInvokeFunction, HValue*, int); |
- |
- HInvokeFunction(HValue* context, |
- HValue* function, |
- Handle<JSFunction> known_function, |
- int argument_count) |
- : HBinaryCall(context, function, argument_count), |
- known_function_(known_function) { |
- formal_parameter_count_ = |
- known_function.is_null() |
- ? 0 |
- : known_function->shared()->internal_formal_parameter_count(); |
- has_stack_check_ = !known_function.is_null() && |
- (known_function->code()->kind() == Code::FUNCTION || |
- known_function->code()->kind() == Code::OPTIMIZED_FUNCTION); |
- } |
- |
- static HInvokeFunction* New(Isolate* isolate, Zone* zone, HValue* context, |
- HValue* function, |
- Handle<JSFunction> known_function, |
- int argument_count) { |
- return new(zone) HInvokeFunction(context, function, |
- known_function, argument_count); |
- } |
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HInvokeFunction, HValue*, |
+ Handle<JSFunction>, int, |
+ TailCallMode); |
HValue* context() { return first(); } |
HValue* function() { return second(); } |
Handle<JSFunction> known_function() { return known_function_; } |
int formal_parameter_count() const { return formal_parameter_count_; } |
- bool HasStackCheck() final { return has_stack_check_; } |
+ bool HasStackCheck() final { return HasStackCheckField::decode(bit_field_); } |
+ TailCallMode tail_call_mode() const { |
+ return TailCallModeField::decode(bit_field_); |
+ } |
DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) |
private: |
- HInvokeFunction(HValue* context, HValue* function, int argument_count) |
+ void set_has_stack_check(bool has_stack_check) { |
+ bit_field_ = HasStackCheckField::update(bit_field_, has_stack_check); |
+ } |
+ |
+ HInvokeFunction(HValue* context, HValue* function, |
+ Handle<JSFunction> known_function, int argument_count, |
+ TailCallMode tail_call_mode) |
: HBinaryCall(context, function, argument_count), |
- has_stack_check_(false) { |
+ known_function_(known_function), |
+ bit_field_(TailCallModeField::encode(tail_call_mode)) { |
+ formal_parameter_count_ = |
+ known_function.is_null() |
+ ? 0 |
+ : known_function->shared()->internal_formal_parameter_count(); |
+ set_has_stack_check( |
+ !known_function.is_null() && |
+ (known_function->code()->kind() == Code::FUNCTION || |
+ known_function->code()->kind() == Code::OPTIMIZED_FUNCTION)); |
} |
Handle<JSFunction> known_function_; |
int formal_parameter_count_; |
- bool has_stack_check_; |
+ |
+ class HasStackCheckField : public BitField<bool, 0, 1> {}; |
+ class TailCallModeField |
+ : public BitField<TailCallMode, HasStackCheckField::kNext, 1> {}; |
+ uint32_t bit_field_; |
}; |
@@ -3785,8 +3786,8 @@ class HWrapReceiver final : public HTemplateInstruction<2> { |
class HApplyArguments final : public HTemplateInstruction<4> { |
public: |
- DECLARE_INSTRUCTION_FACTORY_P4(HApplyArguments, HValue*, HValue*, HValue*, |
- HValue*); |
+ DECLARE_INSTRUCTION_FACTORY_P5(HApplyArguments, HValue*, HValue*, HValue*, |
+ HValue*, TailCallMode); |
Representation RequiredInputRepresentation(int index) override { |
// The length is untagged, all other inputs are tagged. |
@@ -3800,13 +3801,16 @@ class HApplyArguments final : public HTemplateInstruction<4> { |
HValue* length() { return OperandAt(2); } |
HValue* elements() { return OperandAt(3); } |
+ TailCallMode tail_call_mode() const { |
+ return TailCallModeField::decode(bit_field_); |
+ } |
+ |
DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) |
private: |
- HApplyArguments(HValue* function, |
- HValue* receiver, |
- HValue* length, |
- HValue* elements) { |
+ HApplyArguments(HValue* function, HValue* receiver, HValue* length, |
+ HValue* elements, TailCallMode tail_call_mode) |
+ : bit_field_(TailCallModeField::encode(tail_call_mode)) { |
set_representation(Representation::Tagged()); |
SetOperandAt(0, function); |
SetOperandAt(1, receiver); |
@@ -3814,6 +3818,9 @@ class HApplyArguments final : public HTemplateInstruction<4> { |
SetOperandAt(3, elements); |
SetAllSideEffects(); |
} |
+ |
+ class TailCallModeField : public BitField<TailCallMode, 0, 1> {}; |
+ uint32_t bit_field_; |
}; |