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

Side by Side Diff: src/mips64/code-stubs-mips64.cc

Issue 1328603003: Vector ICs: platform support for vector-based stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: MIPS* ports. Created 5 years, 3 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
OLDNEW
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 #if V8_TARGET_ARCH_MIPS64 5 #if V8_TARGET_ARCH_MIPS64
6 6
7 #include "src/bootstrapper.h" 7 #include "src/bootstrapper.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/ic/handler-compiler.h" 10 #include "src/ic/handler-compiler.h"
(...skipping 4815 matching lines...) Expand 10 before | Expand all | Expand 10 after
4826 GenerateImpl(masm, false); 4826 GenerateImpl(masm, false);
4827 } 4827 }
4828 4828
4829 4829
4830 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { 4830 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) {
4831 GenerateImpl(masm, true); 4831 GenerateImpl(masm, true);
4832 } 4832 }
4833 4833
4834 4834
4835 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4835 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4836 Label miss; 4836 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4837 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4838 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4839 Register slot = VectorStoreICDescriptor::SlotRegister(); // a4
4840 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4841 Register feedback = a5;
4842 Register receiver_map = a6;
4843 Register scratch1 = a7;
4837 4844
4838 // TODO(mvstanton): Implement. 4845 __ SmiScale(scratch1, slot, kPointerSizeLog2);
4846 __ Daddu(feedback, vector, Operand(scratch1));
4847 __ ld(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4848
4849 // Try to quickly handle the monomorphic case without knowing for sure
4850 // if we have a weak cell in feedback. We do know it's safe to look
4851 // at WeakCell::kValueOffset.
4852 Label try_array, load_smi_map, compare_map;
4853 Label not_array, miss;
4854 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4855 scratch1, &compare_map, &load_smi_map, &try_array);
4856
4857 // Is it a fixed array?
4858 __ bind(&try_array);
4859 __ ld(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4860 __ Branch(&not_array, ne, scratch1, Heap::kFixedArrayMapRootIndex);
4861
4862 Register scratch2 = t0;
4863 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, true,
4864 &miss);
4865
4866 __ bind(&not_array);
4867 __ Branch(&miss, ne, feedback, Heap::kmegamorphic_symbolRootIndex);
4868 Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags(
4869 Code::ComputeHandlerFlags(Code::STORE_IC));
4870 masm->isolate()->stub_cache()->GenerateProbe(
4871 masm, Code::STORE_IC, code_flags, receiver, key, feedback, receiver_map,
4872 scratch1, scratch2);
4873
4839 __ bind(&miss); 4874 __ bind(&miss);
4840 StoreIC::GenerateMiss(masm); 4875 StoreIC::GenerateMiss(masm);
4876
4877 __ bind(&load_smi_map);
4878 __ Branch(USE_DELAY_SLOT, &compare_map);
4879 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); // In delay slot.
4841 } 4880 }
4842 4881
4843 4882
4844 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) { 4883 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) {
4845 GenerateImpl(masm, false); 4884 GenerateImpl(masm, false);
4846 } 4885 }
4847 4886
4848 4887
4849 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { 4888 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) {
4850 GenerateImpl(masm, true); 4889 GenerateImpl(masm, true);
4851 } 4890 }
4852 4891
4853 4892
4893 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register feedback,
4894 Register receiver_map, Register scratch1,
4895 Register scratch2, Label* miss) {
4896 // feedback initially contains the feedback array
4897 Label next_loop, prepare_next;
4898 Label start_polymorphic;
4899 Label transition_call;
4900
4901 Register cached_map = scratch1;
4902 Register too_far = scratch2;
4903 Register pointer_reg = feedback;
4904
4905 __ ld(too_far, FieldMemOperand(feedback, FixedArray::kLengthOffset));
4906
4907 // +-----+------+------+-----+-----+-----+ ... ----+
4908 // | map | len | wm0 | wt0 | h0 | wm1 | hN |
4909 // +-----+------+------+-----+-----+ ----+ ... ----+
4910 // 0 1 2 len-1
4911 // ^ ^
4912 // | |
4913 // pointer_reg too_far
4914 // aka feedback scratch2
4915 // also need receiver_map
4916 // use cached_map (scratch1) to look in the weak map values.
4917 __ SmiScale(too_far, too_far, kPointerSizeLog2);
4918 __ Daddu(too_far, feedback, Operand(too_far));
4919 __ Daddu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4920 __ Daddu(pointer_reg, feedback,
4921 Operand(FixedArray::OffsetOfElementAt(0) - kHeapObjectTag));
4922
4923 __ bind(&next_loop);
4924 __ ld(cached_map, MemOperand(pointer_reg));
4925 __ ld(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset));
4926 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map));
4927 // Is it a transitioning store?
4928 __ ld(too_far, MemOperand(pointer_reg, kPointerSize));
4929 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
4930 __ Branch(&transition_call, ne, too_far, Operand(at));
4931
4932 __ ld(pointer_reg, MemOperand(pointer_reg, kPointerSize * 2));
4933 __ Daddu(t9, pointer_reg, Operand(Code::kHeaderSize - kHeapObjectTag));
4934 __ Jump(t9);
4935
4936 __ bind(&transition_call);
4937 __ ld(too_far, FieldMemOperand(too_far, WeakCell::kValueOffset));
4938 __ JumpIfSmi(too_far, miss);
4939
4940 __ ld(receiver_map, MemOperand(pointer_reg, kPointerSize * 2));
4941 // Load the map into the correct register.
4942 DCHECK(feedback.is(VectorStoreTransitionDescriptor::MapRegister()));
4943 __ Move(feedback, too_far);
4944 __ Daddu(t9, receiver_map, Operand(Code::kHeaderSize - kHeapObjectTag));
4945 __ Jump(t9);
4946
4947 __ bind(&prepare_next);
4948 __ Daddu(pointer_reg, pointer_reg, Operand(kPointerSize * 3));
4949 __ Branch(&next_loop, lt, pointer_reg, Operand(too_far));
4950
4951 // We exhausted our array of map handler pairs.
4952 __ Branch(miss);
4953 }
4954
4955
4854 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4956 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4855 Label miss; 4957 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4958 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4959 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4960 Register slot = VectorStoreICDescriptor::SlotRegister(); // a4
4961 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4962 Register feedback = a5;
4963 Register receiver_map = a6;
4964 Register scratch1 = a7;
4856 4965
4857 // TODO(mvstanton): Implement. 4966 __ SmiScale(scratch1, slot, kPointerSizeLog2);
4967 __ Daddu(feedback, vector, Operand(scratch1));
4968 __ ld(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4969
4970 // Try to quickly handle the monomorphic case without knowing for sure
4971 // if we have a weak cell in feedback. We do know it's safe to look
4972 // at WeakCell::kValueOffset.
4973 Label try_array, load_smi_map, compare_map;
4974 Label not_array, miss;
4975 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4976 scratch1, &compare_map, &load_smi_map, &try_array);
4977
4978 __ bind(&try_array);
4979 // Is it a fixed array?
4980 __ ld(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4981 __ Branch(&not_array, ne, scratch1, Heap::kFixedArrayMapRootIndex);
4982
4983 // We have a polymorphic element handler.
4984 Label try_poly_name;
4985
4986 Register scratch2 = t0;
4987
4988 HandlePolymorphicStoreCase(masm, feedback, receiver_map, scratch1, scratch2,
4989 &miss);
4990
4991 __ bind(&not_array);
4992 // Is it generic?
4993 __ Branch(&try_poly_name, ne, feedback, Heap::kmegamorphic_symbolRootIndex);
4994 Handle<Code> megamorphic_stub =
4995 KeyedStoreIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState());
4996 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET);
4997
4998 __ bind(&try_poly_name);
4999 // We might have a name in feedback, and a fixed array in the next slot.
5000 __ Branch(&miss, ne, key, Operand(feedback));
5001 // If the name comparison succeeded, we know we have a fixed array with
5002 // at least one map/handler pair.
5003 __ SmiScale(scratch1, slot, kPointerSizeLog2);
5004 __ Daddu(feedback, vector, Operand(scratch1));
5005 __ ld(feedback,
5006 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize));
5007 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, false,
5008 &miss);
5009
4858 __ bind(&miss); 5010 __ bind(&miss);
4859 KeyedStoreIC::GenerateMiss(masm); 5011 KeyedStoreIC::GenerateMiss(masm);
5012
5013 __ bind(&load_smi_map);
5014 __ Branch(USE_DELAY_SLOT, &compare_map);
5015 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); // In delay slot.
4860 } 5016 }
4861 5017
4862 5018
4863 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { 5019 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) {
4864 if (masm->isolate()->function_entry_hook() != NULL) { 5020 if (masm->isolate()->function_entry_hook() != NULL) {
4865 ProfileEntryHookStub stub(masm->isolate()); 5021 ProfileEntryHookStub stub(masm->isolate());
4866 __ push(ra); 5022 __ push(ra);
4867 __ CallStub(&stub); 5023 __ CallStub(&stub);
4868 __ pop(ra); 5024 __ pop(ra);
4869 } 5025 }
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
5692 MemOperand(fp, 6 * kPointerSize), NULL); 5848 MemOperand(fp, 6 * kPointerSize), NULL);
5693 } 5849 }
5694 5850
5695 5851
5696 #undef __ 5852 #undef __
5697 5853
5698 } // namespace internal 5854 } // namespace internal
5699 } // namespace v8 5855 } // namespace v8
5700 5856
5701 #endif // V8_TARGET_ARCH_MIPS64 5857 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698