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

Side by Side Diff: src/ic/arm64/ic-arm64.cc

Issue 584043002: Add MEGAMORPHIC state support for KeyedStoreIC (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebased for landing Created 6 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/ic/arm/ic-arm.cc ('k') | src/ic/ia32/ic-ia32.cc » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_ARM64 7 #if V8_TARGET_ARCH_ARM64
8 8
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/ic/ic.h" 10 #include "src/ic/ic.h"
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 __ LoadTransitionedArrayMapConditional(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS, 791 __ LoadTransitionedArrayMapConditional(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS,
792 receiver_map, x10, x11, slow); 792 receiver_map, x10, x11, slow);
793 mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS); 793 mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS);
794 ElementsTransitionGenerator::GenerateDoubleToObject( 794 ElementsTransitionGenerator::GenerateDoubleToObject(
795 masm, receiver, key, value, receiver_map, mode, slow); 795 masm, receiver, key, value, receiver_map, mode, slow);
796 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset)); 796 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset));
797 __ B(&finish_store); 797 __ B(&finish_store);
798 } 798 }
799 799
800 800
801 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, 801 void KeyedStoreIC::GenerateGeneric(
802 StrictMode strict_mode) { 802 MacroAssembler* masm, StrictMode strict_mode,
803 KeyedStoreStubCacheRequirement handler_requirement) {
803 ASM_LOCATION("KeyedStoreIC::GenerateGeneric"); 804 ASM_LOCATION("KeyedStoreIC::GenerateGeneric");
804 Label slow; 805 Label slow;
805 Label array; 806 Label array;
806 Label fast_object; 807 Label fast_object;
807 Label extra; 808 Label extra;
808 Label fast_object_grow; 809 Label fast_object_grow;
809 Label fast_double_grow; 810 Label fast_double_grow;
810 Label fast_double; 811 Label fast_double;
812 Label maybe_name_key;
813 Label miss;
811 814
812 Register value = StoreDescriptor::ValueRegister(); 815 Register value = StoreDescriptor::ValueRegister();
813 Register key = StoreDescriptor::NameRegister(); 816 Register key = StoreDescriptor::NameRegister();
814 Register receiver = StoreDescriptor::ReceiverRegister(); 817 Register receiver = StoreDescriptor::ReceiverRegister();
815 DCHECK(receiver.is(x1)); 818 DCHECK(receiver.is(x1));
816 DCHECK(key.is(x2)); 819 DCHECK(key.is(x2));
817 DCHECK(value.is(x0)); 820 DCHECK(value.is(x0));
818 821
819 Register receiver_map = x3; 822 Register receiver_map = x3;
820 Register elements = x4; 823 Register elements = x4;
821 Register elements_map = x5; 824 Register elements_map = x5;
822 825
823 __ JumpIfNotSmi(key, &slow); 826 __ JumpIfNotSmi(key, &maybe_name_key);
824 __ JumpIfSmi(receiver, &slow); 827 __ JumpIfSmi(receiver, &slow);
825 __ Ldr(receiver_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); 828 __ Ldr(receiver_map, FieldMemOperand(receiver, HeapObject::kMapOffset));
826 829
827 // Check that the receiver does not require access checks and is not observed. 830 // Check that the receiver does not require access checks and is not observed.
828 // The generic stub does not perform map checks or handle observed objects. 831 // The generic stub does not perform map checks or handle observed objects.
829 __ Ldrb(x10, FieldMemOperand(receiver_map, Map::kBitFieldOffset)); 832 __ Ldrb(x10, FieldMemOperand(receiver_map, Map::kBitFieldOffset));
830 __ TestAndBranchIfAnySet( 833 __ TestAndBranchIfAnySet(
831 x10, (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kIsObserved), &slow); 834 x10, (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kIsObserved), &slow);
832 835
833 // Check if the object is a JS array or not. 836 // Check if the object is a JS array or not.
(...skipping 12 matching lines...) Expand all
846 __ B(hi, &fast_object); 849 __ B(hi, &fast_object);
847 850
848 851
849 __ Bind(&slow); 852 __ Bind(&slow);
850 // Slow case, handle jump to runtime. 853 // Slow case, handle jump to runtime.
851 // Live values: 854 // Live values:
852 // x0: value 855 // x0: value
853 // x1: key 856 // x1: key
854 // x2: receiver 857 // x2: receiver
855 PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode); 858 PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode);
859 // Never returns to here.
856 860
861 __ bind(&maybe_name_key);
862 __ Ldr(x10, FieldMemOperand(key, HeapObject::kMapOffset));
863 __ Ldrb(x10, FieldMemOperand(x10, Map::kInstanceTypeOffset));
864 __ JumpIfNotUniqueNameInstanceType(x10, &slow);
865 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags(
866 Code::ComputeHandlerFlags(Code::STORE_IC));
867 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver,
868 key, x3, x4, x5, x6);
869 // Cache miss.
870 if (handler_requirement == kCallRuntimeOnMissingHandler) {
871 __ B(&slow);
872 } else {
873 DCHECK(handler_requirement == kMissOnMissingHandler);
874 __ B(&miss);
875 }
857 876
858 __ Bind(&extra); 877 __ Bind(&extra);
859 // Extra capacity case: Check if there is extra capacity to 878 // Extra capacity case: Check if there is extra capacity to
860 // perform the store and update the length. Used for adding one 879 // perform the store and update the length. Used for adding one
861 // element to the array by writing to array[array.length]. 880 // element to the array by writing to array[array.length].
862 881
863 // Check for room in the elements backing store. 882 // Check for room in the elements backing store.
864 // Both the key and the length of FixedArray are smis. 883 // Both the key and the length of FixedArray are smis.
865 __ Ldrsw(x10, UntagSmiFieldMemOperand(elements, FixedArray::kLengthOffset)); 884 __ Ldrsw(x10, UntagSmiFieldMemOperand(elements, FixedArray::kLengthOffset));
866 __ Cmp(x10, Operand::UntagSmi(key)); 885 __ Cmp(x10, Operand::UntagSmi(key));
(...skipping 21 matching lines...) Expand all
888 __ B(eq, &extra); // We can handle the case where we are appending 1 element. 907 __ B(eq, &extra); // We can handle the case where we are appending 1 element.
889 __ B(lo, &slow); 908 __ B(lo, &slow);
890 909
891 KeyedStoreGenerateGenericHelper( 910 KeyedStoreGenerateGenericHelper(
892 masm, &fast_object, &fast_double, &slow, kCheckMap, kDontIncrementLength, 911 masm, &fast_object, &fast_double, &slow, kCheckMap, kDontIncrementLength,
893 value, key, receiver, receiver_map, elements_map, elements); 912 value, key, receiver, receiver_map, elements_map, elements);
894 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, 913 KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow,
895 &slow, kDontCheckMap, kIncrementLength, value, 914 &slow, kDontCheckMap, kIncrementLength, value,
896 key, receiver, receiver_map, elements_map, 915 key, receiver, receiver_map, elements_map,
897 elements); 916 elements);
917
918 if (handler_requirement == kMissOnMissingHandler) {
919 __ bind(&miss);
920 GenerateMiss(masm);
921 }
898 } 922 }
899 923
900 924
901 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) { 925 void StoreIC::GenerateMegamorphic(MacroAssembler* masm) {
902 Register receiver = StoreDescriptor::ReceiverRegister(); 926 Register receiver = StoreDescriptor::ReceiverRegister();
903 Register name = StoreDescriptor::NameRegister(); 927 Register name = StoreDescriptor::NameRegister();
904 DCHECK(!AreAliased(receiver, name, StoreDescriptor::ValueRegister(), x3, x4, 928 DCHECK(!AreAliased(receiver, name, StoreDescriptor::ValueRegister(), x3, x4,
905 x5, x6)); 929 x5, x6));
906 930
907 // Probe the stub cache. 931 // Probe the stub cache.
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 } else { 1054 } else {
1031 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ); 1055 DCHECK(to_patch->Mask(TestBranchMask) == TBNZ);
1032 // This is JumpIfSmi(smi_reg, branch_imm). 1056 // This is JumpIfSmi(smi_reg, branch_imm).
1033 patcher.tbz(smi_reg, 0, branch_imm); 1057 patcher.tbz(smi_reg, 0, branch_imm);
1034 } 1058 }
1035 } 1059 }
1036 } 1060 }
1037 } // namespace v8::internal 1061 } // namespace v8::internal
1038 1062
1039 #endif // V8_TARGET_ARCH_ARM64 1063 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/ic/arm/ic-arm.cc ('k') | src/ic/ia32/ic-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698