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

Side by Side Diff: src/mips/code-stubs-mips.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/ic/mips64/stub-cache-mips64.cc ('k') | src/mips64/code-stubs-mips64.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 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_MIPS 5 #if V8_TARGET_ARCH_MIPS
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 4752 matching lines...) Expand 10 before | Expand all | Expand 10 after
4763 GenerateImpl(masm, false); 4763 GenerateImpl(masm, false);
4764 } 4764 }
4765 4765
4766 4766
4767 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { 4767 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) {
4768 GenerateImpl(masm, true); 4768 GenerateImpl(masm, true);
4769 } 4769 }
4770 4770
4771 4771
4772 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4772 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4773 Label miss; 4773 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4774 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4775 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4776 Register slot = VectorStoreICDescriptor::SlotRegister(); // t0
4777 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4778 Register feedback = t1;
4779 Register receiver_map = t2;
4780 Register scratch1 = t5;
4774 4781
4775 // TODO(mvstanton): Implement. 4782 __ sll(scratch1, slot, kPointerSizeLog2 - kSmiTagSize);
4783 __ Addu(feedback, vector, Operand(scratch1));
4784 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4785
4786 // Try to quickly handle the monomorphic case without knowing for sure
4787 // if we have a weak cell in feedback. We do know it's safe to look
4788 // at WeakCell::kValueOffset.
4789 Label try_array, load_smi_map, compare_map;
4790 Label not_array, miss;
4791 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4792 scratch1, &compare_map, &load_smi_map, &try_array);
4793
4794 // Is it a fixed array?
4795 __ bind(&try_array);
4796 __ lw(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4797 __ LoadRoot(at, Heap::kFixedArrayMapRootIndex);
4798 __ Branch(&not_array, ne, scratch1, Operand(at));
4799
4800 Register scratch2 = t4;
4801 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, true,
4802 &miss);
4803
4804 __ bind(&not_array);
4805 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
4806 __ Branch(&miss, ne, feedback, Operand(at));
4807 Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags(
4808 Code::ComputeHandlerFlags(Code::STORE_IC));
4809 masm->isolate()->stub_cache()->GenerateProbe(
4810 masm, Code::STORE_IC, code_flags, receiver, key, feedback, receiver_map,
4811 scratch1, scratch2);
4812
4776 __ bind(&miss); 4813 __ bind(&miss);
4777 StoreIC::GenerateMiss(masm); 4814 StoreIC::GenerateMiss(masm);
4815
4816 __ bind(&load_smi_map);
4817 __ Branch(USE_DELAY_SLOT, &compare_map);
4818 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); // In delay slot.
4778 } 4819 }
4779 4820
4780 4821
4781 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) { 4822 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) {
4782 GenerateImpl(masm, false); 4823 GenerateImpl(masm, false);
4783 } 4824 }
4784 4825
4785 4826
4786 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { 4827 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) {
4787 GenerateImpl(masm, true); 4828 GenerateImpl(masm, true);
4788 } 4829 }
4789 4830
4790 4831
4832 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register feedback,
4833 Register receiver_map, Register scratch1,
4834 Register scratch2, Label* miss) {
4835 // feedback initially contains the feedback array
4836 Label next_loop, prepare_next;
4837 Label start_polymorphic;
4838 Label transition_call;
4839
4840 Register cached_map = scratch1;
4841 Register too_far = scratch2;
4842 Register pointer_reg = feedback;
4843 __ lw(too_far, FieldMemOperand(feedback, FixedArray::kLengthOffset));
4844
4845 // +-----+------+------+-----+-----+-----+ ... ----+
4846 // | map | len | wm0 | wt0 | h0 | wm1 | hN |
4847 // +-----+------+------+-----+-----+ ----+ ... ----+
4848 // 0 1 2 len-1
4849 // ^ ^
4850 // | |
4851 // pointer_reg too_far
4852 // aka feedback scratch2
4853 // also need receiver_map
4854 // use cached_map (scratch1) to look in the weak map values.
4855 __ sll(scratch1, too_far, kPointerSizeLog2 - kSmiTagSize);
4856 __ Addu(too_far, feedback, Operand(scratch1));
4857 __ Addu(too_far, too_far, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4858 __ Addu(pointer_reg, feedback,
4859 Operand(FixedArray::OffsetOfElementAt(0) - kHeapObjectTag));
4860
4861 __ bind(&next_loop);
4862 __ lw(cached_map, MemOperand(pointer_reg));
4863 __ lw(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset));
4864 __ Branch(&prepare_next, ne, receiver_map, Operand(cached_map));
4865 // Is it a transitioning store?
4866 __ lw(too_far, MemOperand(pointer_reg, kPointerSize));
4867 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
4868 __ Branch(&transition_call, ne, too_far, Operand(at));
4869 __ lw(pointer_reg, MemOperand(pointer_reg, kPointerSize * 2));
4870 __ Addu(t9, pointer_reg, Operand(Code::kHeaderSize - kHeapObjectTag));
4871 __ Jump(t9);
4872
4873 __ bind(&transition_call);
4874 __ lw(too_far, FieldMemOperand(too_far, WeakCell::kValueOffset));
4875 __ JumpIfSmi(too_far, miss);
4876
4877 __ lw(receiver_map, MemOperand(pointer_reg, kPointerSize * 2));
4878
4879 // Load the map into the correct register.
4880 DCHECK(feedback.is(VectorStoreTransitionDescriptor::MapRegister()));
4881 __ mov(feedback, too_far);
4882
4883 __ Addu(t9, receiver_map, Operand(Code::kHeaderSize - kHeapObjectTag));
4884 __ Jump(t9);
4885
4886 __ bind(&prepare_next);
4887 __ Addu(pointer_reg, pointer_reg, Operand(kPointerSize * 3));
4888 __ Branch(&next_loop, lt, pointer_reg, Operand(too_far));
4889
4890 // We exhausted our array of map handler pairs.
4891 __ jmp(miss);
4892 }
4893
4894
4791 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { 4895 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
4792 Label miss; 4896 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // a1
4897 Register key = VectorStoreICDescriptor::NameRegister(); // a2
4898 Register vector = VectorStoreICDescriptor::VectorRegister(); // a3
4899 Register slot = VectorStoreICDescriptor::SlotRegister(); // t0
4900 DCHECK(VectorStoreICDescriptor::ValueRegister().is(a0)); // a0
4901 Register feedback = t1;
4902 Register receiver_map = t2;
4903 Register scratch1 = t5;
4793 4904
4794 // TODO(mvstanton): Implement. 4905 __ sll(scratch1, slot, kPointerSizeLog2 - kSmiTagSize);
4906 __ Addu(feedback, vector, Operand(scratch1));
4907 __ lw(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4908
4909 // Try to quickly handle the monomorphic case without knowing for sure
4910 // if we have a weak cell in feedback. We do know it's safe to look
4911 // at WeakCell::kValueOffset.
4912 Label try_array, load_smi_map, compare_map;
4913 Label not_array, miss;
4914 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot,
4915 scratch1, &compare_map, &load_smi_map, &try_array);
4916
4917 __ bind(&try_array);
4918 // Is it a fixed array?
4919 __ lw(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4920 __ LoadRoot(at, Heap::kFixedArrayMapRootIndex);
4921 __ Branch(&not_array, ne, scratch1, Operand(at));
4922
4923 // We have a polymorphic element handler.
4924 Label polymorphic, try_poly_name;
4925 __ bind(&polymorphic);
4926
4927 Register scratch2 = t4;
4928
4929 HandlePolymorphicStoreCase(masm, feedback, receiver_map, scratch1, scratch2,
4930 &miss);
4931
4932 __ bind(&not_array);
4933 // Is it generic?
4934 __ LoadRoot(at, Heap::kmegamorphic_symbolRootIndex);
4935 __ Branch(&try_poly_name, ne, feedback, Operand(at));
4936 Handle<Code> megamorphic_stub =
4937 KeyedStoreIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState());
4938 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET);
4939
4940 __ bind(&try_poly_name);
4941 // We might have a name in feedback, and a fixed array in the next slot.
4942 __ Branch(&miss, ne, key, Operand(feedback));
4943 // If the name comparison succeeded, we know we have a fixed array with
4944 // at least one map/handler pair.
4945 __ sll(scratch1, slot, kPointerSizeLog2 - kSmiTagSize);
4946 __ Addu(feedback, vector, Operand(scratch1));
4947 __ lw(feedback,
4948 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize));
4949 HandleArrayCases(masm, feedback, receiver_map, scratch1, scratch2, false,
4950 &miss);
4951
4795 __ bind(&miss); 4952 __ bind(&miss);
4796 KeyedStoreIC::GenerateMiss(masm); 4953 KeyedStoreIC::GenerateMiss(masm);
4954
4955 __ bind(&load_smi_map);
4956 __ Branch(USE_DELAY_SLOT, &compare_map);
4957 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); // In delay slot.
4797 } 4958 }
4798 4959
4799 4960
4800 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { 4961 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) {
4801 if (masm->isolate()->function_entry_hook() != NULL) { 4962 if (masm->isolate()->function_entry_hook() != NULL) {
4802 ProfileEntryHookStub stub(masm->isolate()); 4963 ProfileEntryHookStub stub(masm->isolate());
4803 __ push(ra); 4964 __ push(ra);
4804 __ CallStub(&stub); 4965 __ CallStub(&stub);
4805 __ pop(ra); 4966 __ pop(ra);
4806 } 4967 }
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
5628 MemOperand(fp, 6 * kPointerSize), NULL); 5789 MemOperand(fp, 6 * kPointerSize), NULL);
5629 } 5790 }
5630 5791
5631 5792
5632 #undef __ 5793 #undef __
5633 5794
5634 } // namespace internal 5795 } // namespace internal
5635 } // namespace v8 5796 } // namespace v8
5636 5797
5637 #endif // V8_TARGET_ARCH_MIPS 5798 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/ic/mips64/stub-cache-mips64.cc ('k') | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698