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

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

Issue 1318353003: MIPS: Vector ICs: platform support for vector-based stores. Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: bug fix and some minor consistency tweaks. 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
« no previous file with comments | « src/mips/code-stubs-mips.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 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 4782 matching lines...) Expand 10 before | Expand all | Expand 10 after
4793 GenerateImpl(masm, false); 4793 GenerateImpl(masm, false);
4794 } 4794 }
4795 4795
4796 4796
4797 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { 4797 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) {
4798 GenerateImpl(masm, true); 4798 GenerateImpl(masm, true);
4799 } 4799 }
4800 4800
4801 4801
4802 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4802 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4803 Label miss; 4803 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4804 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4805 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4806 Register slot = VectorStoreICDescriptor::SlotRegister(); // a4
4807 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4808 Register feedback = a5;
4809 Register receiver_map = a6;
4810 Register scratch1 = a7;
4804 4811
4805 // TODO(mvstanton): Implement. 4812 __ SmiScale(scratch1, slot, kPointerSizeLog2);
4813 __ Daddu(feedback, vector, Operand(scratch1));
4814 __ ld(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4815
4816 // Try to quickly handle the monomorphic case without knowing for sure
4817 // if we have a weak cell in feedback. We do know it's safe to look
4818 // at WeakCell::kValueOffset.
4819 Label try_array, load_smi_map, compare_map;
4820 Label not_array, miss;
4821 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4822 scratch1, &compare_map, &load_smi_map, &try_array);
4823
4824 // Is it a fixed array?
4825 __ bind(&try_array);
4826 __ ld(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4827 __ Branch(&not_array, ne, scratch1, Heap::kFixedArrayMapRootIndex);
4828
4829 Register scratch2 = t0;
4830 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, true,
4831 &miss);
4832
4833 __ bind(&not_array);
4834 __ Branch(&miss, ne, feedback, Heap::kmegamorphic_symbolRootIndex);
4835 Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags(
4836 Code::ComputeHandlerFlags(Code::STORE_IC));
4837 masm->isolate()->stub_cache()->GenerateProbe(
4838 masm, Code::STORE_IC, code_flags, receiver, key, feedback, receiver_map,
4839 scratch1, scratch2);
4840
4806 __ bind(&miss); 4841 __ bind(&miss);
4807 StoreIC::GenerateMiss(masm); 4842 StoreIC::GenerateMiss(masm);
4843
4844 __ bind(&load_smi_map);
4845 __ Branch(USE_DELAY_SLOT, &compare_map);
4846 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); // In delay slot.
4808 } 4847 }
4809 4848
4810 4849
4811 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) { 4850 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) {
4812 GenerateImpl(masm, false); 4851 GenerateImpl(masm, false);
4813 } 4852 }
4814 4853
4815 4854
4816 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { 4855 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) {
4817 GenerateImpl(masm, true); 4856 GenerateImpl(masm, true);
4818 } 4857 }
4819 4858
4820 4859
4860 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register feedback,
4861 Register receiver_map, Register scratch1,
4862 Register scratch2, Label* miss) {
4863 // feedback initially contains the feedback array
4864 Label next_loop, prepare_next;
4865 Label start_polymorphic;
4866 Label transition_call;
4867
4868 Register cached_map = scratch1;
4869 Register too_far = scratch2;
4870 Register pointer_reg = feedback;
4871
4872 __ ld(too_far, FieldMemOperand(feedback, FixedArray::kLengthOffset));
4873
4874 // +-----+------+------+-----+-----+-----+ ... ----+
4875 // | map | len | wm0 | wt0 | h0 | wm1 | hN |
4876 // +-----+------+------+-----+-----+ ----+ ... ----+
4877 // 0 1 2 len-1
4878 // ^ ^
4879 // | |
4880 // pointer_reg too_far
4881 // aka feedback scratch2
4882 // also need receiver_map
4883 // use cached_map (scratch1) to look in the weak map values.
4884 __ SmiScale(too_far, too_far, kPointerSizeLog2);
4885 __ Daddu(too_far, feedback, Operand(too_far));
4886 __ Daddu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4887 __ Daddu(pointer_reg, feedback,
4888 Operand(FixedArray::OffsetOfElementAt(0) - kHeapObjectTag));
4889
4890 __ bind(&next_loop);
4891 __ ld(cached_map, MemOperand(pointer_reg));
4892 __ ld(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset));
4893 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map));
4894 // Is it a transitioning store?
4895 __ ld(too_far, MemOperand(pointer_reg, kPointerSize));
4896 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
4897 __ Branch(&transition_call, ne, too_far, Operand(at));
4898
4899 __ ld(pointer_reg, MemOperand(pointer_reg, kPointerSize * 2));
4900 __ Daddu(t9, pointer_reg, Operand(Code::kHeaderSize - kHeapObjectTag));
4901 __ Jump(t9);
4902
4903 __ bind(&transition_call);
4904 __ ld(too_far, FieldMemOperand(too_far, WeakCell::kValueOffset));
4905 __ JumpIfSmi(too_far, miss);
4906
4907 __ ld(receiver_map, MemOperand(pointer_reg, kPointerSize * 2));
4908 // Load the map into the correct register.
4909 DCHECK(feedback.is(VectorStoreTransitionDescriptor::MapRegister()));
4910 __ Move(feedback, too_far);
4911 __ Daddu(t9, receiver_map, Operand(Code::kHeaderSize - kHeapObjectTag));
4912 __ Jump(t9);
4913
4914 __ bind(&prepare_next);
4915 __ Daddu(pointer_reg, pointer_reg, Operand(kPointerSize * 3));
4916 __ Branch(&next_loop, lt, pointer_reg, Operand(too_far));
4917
4918 // We exhausted our array of map handler pairs.
4919 __ Branch(miss);
4920 }
4921
4922
4821 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4923 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4822 Label miss; 4924 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4925 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4926 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4927 Register slot = VectorStoreICDescriptor::SlotRegister(); // a4
4928 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4929 Register feedback = a5;
4930 Register receiver_map = a6;
4931 Register scratch1 = a7;
4823 4932
4824 // TODO(mvstanton): Implement. 4933 __ SmiScale(scratch1, slot, kPointerSizeLog2);
4934 __ Daddu(feedback, vector, Operand(scratch1));
4935 __ ld(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4936
4937 // Try to quickly handle the monomorphic case without knowing for sure
4938 // if we have a weak cell in feedback. We do know it's safe to look
4939 // at WeakCell::kValueOffset.
4940 Label try_array, load_smi_map, compare_map;
4941 Label not_array, miss;
4942 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4943 scratch1, &compare_map, &load_smi_map, &try_array);
4944
4945 __ bind(&try_array);
4946 // Is it a fixed array?
4947 __ ld(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4948 __ Branch(&not_array, ne, scratch1, Heap::kFixedArrayMapRootIndex);
4949
4950 // We have a polymorphic element handler.
4951 Label try_poly_name;
4952
4953 Register scratch2 = t0;
4954
4955 HandlePolymorphicStoreCase(masm, feedback, receiver_map, scratch1, scratch2,
4956 &miss);
4957
4958 __ bind(&not_array);
4959 // Is it generic?
4960 __ Branch(&try_poly_name, ne, feedback, Heap::kmegamorphic_symbolRootIndex);
4961 Handle<Code> megamorphic_stub =
4962 KeyedStoreIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState());
4963 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET);
4964
4965 __ bind(&try_poly_name);
4966 // We might have a name in feedback, and a fixed array in the next slot.
4967 __ Branch(&miss, ne, key, Operand(feedback));
4968 // If the name comparison succeeded, we know we have a fixed array with
4969 // at least one map/handler pair.
4970 __ SmiScale(scratch1, slot, kPointerSizeLog2);
4971 __ Daddu(feedback, vector, Operand(scratch1));
4972 __ ld(feedback,
4973 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize));
4974 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, false,
4975 &miss);
4976
4825 __ bind(&miss); 4977 __ bind(&miss);
4826 KeyedStoreIC::GenerateMiss(masm); 4978 KeyedStoreIC::GenerateMiss(masm);
4979
4980 __ bind(&load_smi_map);
4981 __ Branch(USE_DELAY_SLOT, &compare_map);
4982 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); // In delay slot.
4827 } 4983 }
4828 4984
4829 4985
4830 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { 4986 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) {
4831 if (masm->isolate()->function_entry_hook() != NULL) { 4987 if (masm->isolate()->function_entry_hook() != NULL) {
4832 ProfileEntryHookStub stub(masm->isolate()); 4988 ProfileEntryHookStub stub(masm->isolate());
4833 __ push(ra); 4989 __ push(ra);
4834 __ CallStub(&stub); 4990 __ CallStub(&stub);
4835 __ pop(ra); 4991 __ pop(ra);
4836 } 4992 }
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
5659 MemOperand(fp, 6 * kPointerSize), NULL); 5815 MemOperand(fp, 6 * kPointerSize), NULL);
5660 } 5816 }
5661 5817
5662 5818
5663 #undef __ 5819 #undef __
5664 5820
5665 } // namespace internal 5821 } // namespace internal
5666 } // namespace v8 5822 } // namespace v8
5667 5823
5668 #endif // V8_TARGET_ARCH_MIPS64 5824 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips/code-stubs-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698