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

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

Issue 2541843006: [stubs] Add LoadFixedArrayElements with int index (Closed)
Patch Set: Address comments Created 4 years 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/ic/accessor-assembler.cc ('k') | no next file » | 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 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 feedback_element, 584 feedback_element,
585 HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate()))); 585 HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate())));
586 GotoIf(is_megamorphic, &call); 586 GotoIf(is_megamorphic, &call);
587 587
588 Comment("check if it is an allocation site"); 588 Comment("check if it is an allocation site");
589 Node* is_allocation_site = WordEqual( 589 Node* is_allocation_site = WordEqual(
590 LoadMap(feedback_element), LoadRoot(Heap::kAllocationSiteMapRootIndex)); 590 LoadMap(feedback_element), LoadRoot(Heap::kAllocationSiteMapRootIndex));
591 GotoUnless(is_allocation_site, &check_initialized); 591 GotoUnless(is_allocation_site, &check_initialized);
592 592
593 // If it is not the Array() function, mark megamorphic. 593 // If it is not the Array() function, mark megamorphic.
594 Node* context_slot = 594 Node* context_slot = LoadContextElement(LoadNativeContext(context),
595 LoadFixedArrayElement(LoadNativeContext(context), 595 Context::ARRAY_FUNCTION_INDEX);
596 Int32Constant(Context::ARRAY_FUNCTION_INDEX));
597 Node* is_array_function = WordEqual(context_slot, function); 596 Node* is_array_function = WordEqual(context_slot, function);
598 GotoUnless(is_array_function, &mark_megamorphic); 597 GotoUnless(is_array_function, &mark_megamorphic);
599 598
600 // It is a monomorphic Array function. Increment the call count. 599 // It is a monomorphic Array function. Increment the call count.
601 IncrementCallCount(type_feedback_vector, slot_id); 600 IncrementCallCount(type_feedback_vector, slot_id);
602 601
603 // Call ArrayConstructorStub. 602 // Call ArrayConstructorStub.
604 Callable callable_call = 603 Callable callable_call =
605 CodeFactory::InterpreterPushArgsAndConstructArray(isolate()); 604 CodeFactory::InterpreterPushArgsAndConstructArray(isolate());
606 Node* code_target_call = HeapConstant(callable_call.code()); 605 Node* code_target_call = HeapConstant(callable_call.code());
(...skipping 17 matching lines...) Expand all
624 Node* is_smi = TaggedIsSmi(function); 623 Node* is_smi = TaggedIsSmi(function);
625 GotoIf(is_smi, &mark_megamorphic); 624 GotoIf(is_smi, &mark_megamorphic);
626 625
627 // Check if function is an object of JSFunction type. 626 // Check if function is an object of JSFunction type.
628 Node* instance_type = LoadInstanceType(function); 627 Node* instance_type = LoadInstanceType(function);
629 Node* is_js_function = 628 Node* is_js_function =
630 WordEqual(instance_type, Int32Constant(JS_FUNCTION_TYPE)); 629 WordEqual(instance_type, Int32Constant(JS_FUNCTION_TYPE));
631 GotoUnless(is_js_function, &mark_megamorphic); 630 GotoUnless(is_js_function, &mark_megamorphic);
632 631
633 // Check if it is the Array() function. 632 // Check if it is the Array() function.
634 Node* context_slot = 633 Node* context_slot = LoadContextElement(LoadNativeContext(context),
635 LoadFixedArrayElement(LoadNativeContext(context), 634 Context::ARRAY_FUNCTION_INDEX);
636 Int32Constant(Context::ARRAY_FUNCTION_INDEX));
637 Node* is_array_function = WordEqual(context_slot, function); 635 Node* is_array_function = WordEqual(context_slot, function);
638 GotoIf(is_array_function, &create_allocation_site); 636 GotoIf(is_array_function, &create_allocation_site);
639 637
640 // Check if the function belongs to the same native context. 638 // Check if the function belongs to the same native context.
641 Node* native_context = LoadNativeContext( 639 Node* native_context = LoadNativeContext(
642 LoadObjectField(function, JSFunction::kContextOffset)); 640 LoadObjectField(function, JSFunction::kContextOffset));
643 Node* is_same_native_context = 641 Node* is_same_native_context =
644 WordEqual(native_context, LoadNativeContext(context)); 642 WordEqual(native_context, LoadNativeContext(context));
645 GotoUnless(is_same_native_context, &mark_megamorphic); 643 GotoUnless(is_same_native_context, &mark_megamorphic);
646 644
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 773
776 Bind(&check_allocation_site); 774 Bind(&check_allocation_site);
777 { 775 {
778 Comment("check if it is an allocation site"); 776 Comment("check if it is an allocation site");
779 Node* is_allocation_site = 777 Node* is_allocation_site =
780 WordEqual(LoadObjectField(feedback_element, 0), 778 WordEqual(LoadObjectField(feedback_element, 0),
781 LoadRoot(Heap::kAllocationSiteMapRootIndex)); 779 LoadRoot(Heap::kAllocationSiteMapRootIndex));
782 GotoUnless(is_allocation_site, &check_initialized); 780 GotoUnless(is_allocation_site, &check_initialized);
783 781
784 // Make sure the function is the Array() function. 782 // Make sure the function is the Array() function.
785 Node* context_slot = 783 Node* context_slot = LoadContextElement(LoadNativeContext(context),
786 LoadFixedArrayElement(LoadNativeContext(context), 784 Context::ARRAY_FUNCTION_INDEX);
787 Int32Constant(Context::ARRAY_FUNCTION_INDEX));
788 Node* is_array_function = WordEqual(context_slot, constructor); 785 Node* is_array_function = WordEqual(context_slot, constructor);
789 GotoUnless(is_array_function, &mark_megamorphic); 786 GotoUnless(is_array_function, &mark_megamorphic);
790 787
791 allocation_feedback.Bind(feedback_element); 788 allocation_feedback.Bind(feedback_element);
792 Goto(&call_construct_function); 789 Goto(&call_construct_function);
793 } 790 }
794 791
795 Bind(&check_initialized); 792 Bind(&check_initialized);
796 { 793 {
797 // Check if it is uninitialized. 794 // Check if it is uninitialized.
798 Comment("check if uninitialized"); 795 Comment("check if uninitialized");
799 Node* is_uninitialized = WordEqual( 796 Node* is_uninitialized = WordEqual(
800 feedback_element, LoadRoot(Heap::kuninitialized_symbolRootIndex)); 797 feedback_element, LoadRoot(Heap::kuninitialized_symbolRootIndex));
801 Branch(is_uninitialized, &initialize, &mark_megamorphic); 798 Branch(is_uninitialized, &initialize, &mark_megamorphic);
802 } 799 }
803 800
804 Bind(&initialize); 801 Bind(&initialize);
805 { 802 {
806 Label create_allocation_site(this), create_weak_cell(this); 803 Label create_allocation_site(this), create_weak_cell(this);
807 Comment("initialize the feedback element"); 804 Comment("initialize the feedback element");
808 // Create an allocation site if the function is an array function, 805 // Create an allocation site if the function is an array function,
809 // otherwise create a weak cell. 806 // otherwise create a weak cell.
810 Node* context_slot = 807 Node* context_slot = LoadContextElement(LoadNativeContext(context),
811 LoadFixedArrayElement(LoadNativeContext(context), 808 Context::ARRAY_FUNCTION_INDEX);
812 Int32Constant(Context::ARRAY_FUNCTION_INDEX));
813 Node* is_array_function = WordEqual(context_slot, constructor); 809 Node* is_array_function = WordEqual(context_slot, constructor);
814 Branch(is_array_function, &create_allocation_site, &create_weak_cell); 810 Branch(is_array_function, &create_allocation_site, &create_weak_cell);
815 811
816 Bind(&create_allocation_site); 812 Bind(&create_allocation_site);
817 { 813 {
818 Node* site = CreateAllocationSiteInFeedbackVector(type_feedback_vector, 814 Node* site = CreateAllocationSiteInFeedbackVector(type_feedback_vector,
819 SmiTag(slot_id)); 815 SmiTag(slot_id));
820 allocation_feedback.Bind(site); 816 allocation_feedback.Bind(site);
821 Goto(&call_construct_function); 817 Goto(&call_construct_function);
822 } 818 }
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 Goto(&loop); 1326 Goto(&loop);
1331 } 1327 }
1332 Bind(&done_loop); 1328 Bind(&done_loop);
1333 1329
1334 return array; 1330 return array;
1335 } 1331 }
1336 1332
1337 } // namespace interpreter 1333 } // namespace interpreter
1338 } // namespace internal 1334 } // namespace internal
1339 } // namespace v8 1335 } // namespace v8
OLDNEW
« no previous file with comments | « src/ic/accessor-assembler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698