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

Side by Side Diff: src/interpreter/interpreter-assembler.cc

Issue 2649143002: [Turbofan] Implement call with spread bytecode in assembly code. (Closed)
Patch Set: Rename PushArgsMode to InterpreterPushArgsMode Created 3 years, 11 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
« no previous file with comments | « src/interpreter/interpreter-assembler.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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 #include "src/interpreter/interpreter-assembler.h" 5 #include "src/interpreter/interpreter-assembler.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <ostream> 8 #include <ostream>
9 9
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 Node* is_smi = TaggedIsSmi(function); 536 Node* is_smi = TaggedIsSmi(function);
537 Branch(is_smi, &extra_checks, &call_function); 537 Branch(is_smi, &extra_checks, &call_function);
538 538
539 Bind(&call_function); 539 Bind(&call_function);
540 { 540 {
541 // Increment the call count. 541 // Increment the call count.
542 IncrementCallCount(type_feedback_vector, slot_id); 542 IncrementCallCount(type_feedback_vector, slot_id);
543 543
544 // Call using call function builtin. 544 // Call using call function builtin.
545 Callable callable = CodeFactory::InterpreterPushArgsAndCall( 545 Callable callable = CodeFactory::InterpreterPushArgsAndCall(
546 isolate(), tail_call_mode, CallableType::kJSFunction); 546 isolate(), tail_call_mode, InterpreterPushArgsMode::kJSFunction);
547 Node* code_target = HeapConstant(callable.code()); 547 Node* code_target = HeapConstant(callable.code());
548 Node* ret_value = CallStub(callable.descriptor(), code_target, context, 548 Node* ret_value = CallStub(callable.descriptor(), code_target, context,
549 arg_count, first_arg, function); 549 arg_count, first_arg, function);
550 return_value.Bind(ret_value); 550 return_value.Bind(ret_value);
551 Goto(&end); 551 Goto(&end);
552 } 552 }
553 553
554 Bind(&extra_checks); 554 Bind(&extra_checks);
555 { 555 {
556 Label check_initialized(this), mark_megamorphic(this), 556 Label check_initialized(this), mark_megamorphic(this),
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 } 652 }
653 653
654 Bind(&call); 654 Bind(&call);
655 { 655 {
656 Comment("Increment call count and call using Call builtin"); 656 Comment("Increment call count and call using Call builtin");
657 // Increment the call count. 657 // Increment the call count.
658 IncrementCallCount(type_feedback_vector, slot_id); 658 IncrementCallCount(type_feedback_vector, slot_id);
659 659
660 // Call using call builtin. 660 // Call using call builtin.
661 Callable callable_call = CodeFactory::InterpreterPushArgsAndCall( 661 Callable callable_call = CodeFactory::InterpreterPushArgsAndCall(
662 isolate(), tail_call_mode, CallableType::kAny); 662 isolate(), tail_call_mode, InterpreterPushArgsMode::kOther);
663 Node* code_target_call = HeapConstant(callable_call.code()); 663 Node* code_target_call = HeapConstant(callable_call.code());
664 Node* ret_value = CallStub(callable_call.descriptor(), code_target_call, 664 Node* ret_value = CallStub(callable_call.descriptor(), code_target_call,
665 context, arg_count, first_arg, function); 665 context, arg_count, first_arg, function);
666 return_value.Bind(ret_value); 666 return_value.Bind(ret_value);
667 Goto(&end); 667 Goto(&end);
668 } 668 }
669 669
670 Bind(&end); 670 Bind(&end);
671 return return_value.value(); 671 return return_value.value();
672 } 672 }
673 673
674 Node* InterpreterAssembler::CallJS(Node* function, Node* context, 674 Node* InterpreterAssembler::CallJS(Node* function, Node* context,
675 Node* first_arg, Node* arg_count, 675 Node* first_arg, Node* arg_count,
676 TailCallMode tail_call_mode) { 676 TailCallMode tail_call_mode) {
677 Callable callable = CodeFactory::InterpreterPushArgsAndCall( 677 Callable callable = CodeFactory::InterpreterPushArgsAndCall(
678 isolate(), tail_call_mode, CallableType::kAny); 678 isolate(), tail_call_mode, InterpreterPushArgsMode::kOther);
679 Node* code_target = HeapConstant(callable.code()); 679 Node* code_target = HeapConstant(callable.code());
680 680
681 return CallStub(callable.descriptor(), code_target, context, arg_count, 681 return CallStub(callable.descriptor(), code_target, context, arg_count,
682 first_arg, function);
683 }
684
685 Node* InterpreterAssembler::CallJSWithSpread(Node* function, Node* context,
686 Node* first_arg, Node* arg_count) {
687 Callable callable = CodeFactory::InterpreterPushArgsAndCall(
688 isolate(), TailCallMode::kDisallow,
689 InterpreterPushArgsMode::kWithFinalSpread);
690 Node* code_target = HeapConstant(callable.code());
691
692 return CallStub(callable.descriptor(), code_target, context, arg_count,
682 first_arg, function); 693 first_arg, function);
683 } 694 }
684 695
685 Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context, 696 Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context,
686 Node* new_target, Node* first_arg, 697 Node* new_target, Node* first_arg,
687 Node* arg_count, Node* slot_id, 698 Node* arg_count, Node* slot_id,
688 Node* type_feedback_vector) { 699 Node* type_feedback_vector) {
689 Variable return_value(this, MachineRepresentation::kTagged); 700 Variable return_value(this, MachineRepresentation::kTagged);
690 Variable allocation_feedback(this, MachineRepresentation::kTagged); 701 Variable allocation_feedback(this, MachineRepresentation::kTagged);
691 Label call_construct_function(this, &allocation_feedback), 702 Label call_construct_function(this, &allocation_feedback),
(...skipping 19 matching lines...) Expand all
711 Node* feedback_value = LoadWeakCellValueUnchecked(feedback_element); 722 Node* feedback_value = LoadWeakCellValueUnchecked(feedback_element);
712 Node* is_monomorphic = WordEqual(constructor, feedback_value); 723 Node* is_monomorphic = WordEqual(constructor, feedback_value);
713 allocation_feedback.Bind(UndefinedConstant()); 724 allocation_feedback.Bind(UndefinedConstant());
714 Branch(is_monomorphic, &call_construct_function, &extra_checks); 725 Branch(is_monomorphic, &call_construct_function, &extra_checks);
715 726
716 Bind(&call_construct_function); 727 Bind(&call_construct_function);
717 { 728 {
718 Comment("call using callConstructFunction"); 729 Comment("call using callConstructFunction");
719 IncrementCallCount(type_feedback_vector, slot_id); 730 IncrementCallCount(type_feedback_vector, slot_id);
720 Callable callable_function = CodeFactory::InterpreterPushArgsAndConstruct( 731 Callable callable_function = CodeFactory::InterpreterPushArgsAndConstruct(
721 isolate(), PushArgsConstructMode::kJSFunction); 732 isolate(), InterpreterPushArgsMode::kJSFunction);
722 return_value.Bind(CallStub(callable_function.descriptor(), 733 return_value.Bind(CallStub(callable_function.descriptor(),
723 HeapConstant(callable_function.code()), context, 734 HeapConstant(callable_function.code()), context,
724 arg_count, new_target, constructor, 735 arg_count, new_target, constructor,
725 allocation_feedback.value(), first_arg)); 736 allocation_feedback.value(), first_arg));
726 Goto(&end); 737 Goto(&end);
727 } 738 }
728 739
729 Bind(&extra_checks); 740 Bind(&extra_checks);
730 { 741 {
731 Label check_allocation_site(this), check_initialized(this), 742 Label check_allocation_site(this), check_initialized(this),
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate())), 825 HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate())),
815 SKIP_WRITE_BARRIER); 826 SKIP_WRITE_BARRIER);
816 Goto(&call_construct_function); 827 Goto(&call_construct_function);
817 } 828 }
818 } 829 }
819 830
820 Bind(&call_construct); 831 Bind(&call_construct);
821 { 832 {
822 Comment("call using callConstruct builtin"); 833 Comment("call using callConstruct builtin");
823 Callable callable = CodeFactory::InterpreterPushArgsAndConstruct( 834 Callable callable = CodeFactory::InterpreterPushArgsAndConstruct(
824 isolate(), PushArgsConstructMode::kOther); 835 isolate(), InterpreterPushArgsMode::kOther);
825 Node* code_target = HeapConstant(callable.code()); 836 Node* code_target = HeapConstant(callable.code());
826 return_value.Bind(CallStub(callable.descriptor(), code_target, context, 837 return_value.Bind(CallStub(callable.descriptor(), code_target, context,
827 arg_count, new_target, constructor, 838 arg_count, new_target, constructor,
828 UndefinedConstant(), first_arg)); 839 UndefinedConstant(), first_arg));
829 Goto(&end); 840 Goto(&end);
830 } 841 }
831 842
832 Bind(&end); 843 Bind(&end);
833 return return_value.value(); 844 return return_value.value();
834 } 845 }
835 846
836 Node* InterpreterAssembler::CallConstructWithSpread(Node* constructor, 847 Node* InterpreterAssembler::CallConstructWithSpread(Node* constructor,
837 Node* context, 848 Node* context,
838 Node* new_target, 849 Node* new_target,
839 Node* first_arg, 850 Node* first_arg,
840 Node* arg_count) { 851 Node* arg_count) {
841 Variable return_value(this, MachineRepresentation::kTagged); 852 Variable return_value(this, MachineRepresentation::kTagged);
842 Comment("call using ConstructWithSpread"); 853 Comment("call using ConstructWithSpread");
843 Callable callable = CodeFactory::InterpreterPushArgsAndConstruct( 854 Callable callable = CodeFactory::InterpreterPushArgsAndConstruct(
844 isolate(), PushArgsConstructMode::kWithFinalSpread); 855 isolate(), InterpreterPushArgsMode::kWithFinalSpread);
845 Node* code_target = HeapConstant(callable.code()); 856 Node* code_target = HeapConstant(callable.code());
846 return_value.Bind(CallStub(callable.descriptor(), code_target, context, 857 return_value.Bind(CallStub(callable.descriptor(), code_target, context,
847 arg_count, new_target, constructor, 858 arg_count, new_target, constructor,
848 UndefinedConstant(), first_arg)); 859 UndefinedConstant(), first_arg));
849 860
850 return return_value.value(); 861 return return_value.value();
851 } 862 }
852 863
853 Node* InterpreterAssembler::CallRuntimeN(Node* function_id, Node* context, 864 Node* InterpreterAssembler::CallRuntimeN(Node* function_id, Node* context,
854 Node* first_arg, Node* arg_count, 865 Node* first_arg, Node* arg_count,
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 Goto(&loop); 1331 Goto(&loop);
1321 } 1332 }
1322 Bind(&done_loop); 1333 Bind(&done_loop);
1323 1334
1324 return array; 1335 return array;
1325 } 1336 }
1326 1337
1327 } // namespace interpreter 1338 } // namespace interpreter
1328 } // namespace internal 1339 } // namespace internal
1329 } // namespace v8 1340 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/interpreter-assembler.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698