OLD | NEW |
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/codegen.h" | 7 #include "src/codegen.h" |
8 #include "src/ic/ic.h" | 8 #include "src/ic/ic.h" |
9 #include "src/ic/ic-compiler.h" | 9 #include "src/ic/ic-compiler.h" |
10 #include "src/ic/stub-cache.h" | 10 #include "src/ic/stub-cache.h" |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 PropertyICCompiler::GenerateRuntimeSetProperty(masm, language_mode); | 643 PropertyICCompiler::GenerateRuntimeSetProperty(masm, language_mode); |
644 // Never returns to here. | 644 // Never returns to here. |
645 | 645 |
646 __ bind(&maybe_name_key); | 646 __ bind(&maybe_name_key); |
647 __ lw(t0, FieldMemOperand(key, HeapObject::kMapOffset)); | 647 __ lw(t0, FieldMemOperand(key, HeapObject::kMapOffset)); |
648 __ lb(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); | 648 __ lb(t0, FieldMemOperand(t0, Map::kInstanceTypeOffset)); |
649 __ JumpIfNotUniqueNameInstanceType(t0, &slow); | 649 __ JumpIfNotUniqueNameInstanceType(t0, &slow); |
650 | 650 |
651 // The handlers in the stub cache expect a vector and slot. Since we won't | 651 // The handlers in the stub cache expect a vector and slot. Since we won't |
652 // change the IC from any downstream misses, a dummy vector can be used. | 652 // change the IC from any downstream misses, a dummy vector can be used. |
653 Register vector = VectorStoreICDescriptor::VectorRegister(); | 653 Register vector = StoreWithVectorDescriptor::VectorRegister(); |
654 Register slot = VectorStoreICDescriptor::SlotRegister(); | 654 Register slot = StoreWithVectorDescriptor::SlotRegister(); |
655 DCHECK(!AreAliased(vector, slot, t1, t2, t4, t5)); | 655 DCHECK(!AreAliased(vector, slot, t1, t2, t4, t5)); |
656 Handle<TypeFeedbackVector> dummy_vector = | 656 Handle<TypeFeedbackVector> dummy_vector = |
657 TypeFeedbackVector::DummyVector(masm->isolate()); | 657 TypeFeedbackVector::DummyVector(masm->isolate()); |
658 int slot_index = dummy_vector->GetIndex( | 658 int slot_index = dummy_vector->GetIndex( |
659 FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)); | 659 FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)); |
660 __ LoadRoot(vector, Heap::kDummyVectorRootIndex); | 660 __ LoadRoot(vector, Heap::kDummyVectorRootIndex); |
661 __ li(slot, Operand(Smi::FromInt(slot_index))); | 661 __ li(slot, Operand(Smi::FromInt(slot_index))); |
662 | 662 |
663 masm->isolate()->store_stub_cache()->GenerateProbe(masm, receiver, key, t1, | 663 masm->isolate()->store_stub_cache()->GenerateProbe(masm, receiver, key, t1, |
664 t2, t4, t5); | 664 t2, t4, t5); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 receiver_map, elements_map, elements); | 705 receiver_map, elements_map, elements); |
706 | 706 |
707 __ bind(&miss); | 707 __ bind(&miss); |
708 GenerateMiss(masm); | 708 GenerateMiss(masm); |
709 } | 709 } |
710 | 710 |
711 | 711 |
712 static void StoreIC_PushArgs(MacroAssembler* masm) { | 712 static void StoreIC_PushArgs(MacroAssembler* masm) { |
713 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 713 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
714 StoreDescriptor::ValueRegister(), | 714 StoreDescriptor::ValueRegister(), |
715 VectorStoreICDescriptor::SlotRegister(), | 715 StoreWithVectorDescriptor::SlotRegister(), |
716 VectorStoreICDescriptor::VectorRegister()); | 716 StoreWithVectorDescriptor::VectorRegister()); |
717 } | 717 } |
718 | 718 |
719 | 719 |
720 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 720 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
721 StoreIC_PushArgs(masm); | 721 StoreIC_PushArgs(masm); |
722 | 722 |
723 __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss); | 723 __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss); |
724 } | 724 } |
725 | 725 |
726 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 726 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
727 StoreIC_PushArgs(masm); | 727 StoreIC_PushArgs(masm); |
728 | 728 |
729 // Perform tail call to the entry. | 729 // Perform tail call to the entry. |
730 __ TailCallRuntime(Runtime::kStoreIC_Miss); | 730 __ TailCallRuntime(Runtime::kStoreIC_Miss); |
731 } | 731 } |
732 | 732 |
733 | 733 |
734 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 734 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
735 Label miss; | 735 Label miss; |
736 Register receiver = StoreDescriptor::ReceiverRegister(); | 736 Register receiver = StoreDescriptor::ReceiverRegister(); |
737 Register name = StoreDescriptor::NameRegister(); | 737 Register name = StoreDescriptor::NameRegister(); |
738 Register value = StoreDescriptor::ValueRegister(); | 738 Register value = StoreDescriptor::ValueRegister(); |
739 Register dictionary = t1; | 739 Register dictionary = t1; |
740 DCHECK(receiver.is(a1)); | 740 DCHECK(receiver.is(a1)); |
741 DCHECK(name.is(a2)); | 741 DCHECK(name.is(a2)); |
742 DCHECK(value.is(a0)); | 742 DCHECK(value.is(a0)); |
743 DCHECK(VectorStoreICDescriptor::VectorRegister().is(a3)); | 743 DCHECK(StoreWithVectorDescriptor::VectorRegister().is(a3)); |
744 DCHECK(VectorStoreICDescriptor::SlotRegister().is(t0)); | 744 DCHECK(StoreWithVectorDescriptor::SlotRegister().is(t0)); |
745 | 745 |
746 __ lw(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); | 746 __ lw(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset)); |
747 | 747 |
748 GenerateDictionaryStore(masm, &miss, dictionary, name, value, t2, t5); | 748 GenerateDictionaryStore(masm, &miss, dictionary, name, value, t2, t5); |
749 Counters* counters = masm->isolate()->counters(); | 749 Counters* counters = masm->isolate()->counters(); |
750 __ IncrementCounter(counters->ic_store_normal_hit(), 1, t2, t5); | 750 __ IncrementCounter(counters->ic_store_normal_hit(), 1, t2, t5); |
751 __ Ret(); | 751 __ Ret(); |
752 | 752 |
753 __ bind(&miss); | 753 __ bind(&miss); |
754 __ IncrementCounter(counters->ic_store_normal_miss(), 1, t2, t5); | 754 __ IncrementCounter(counters->ic_store_normal_miss(), 1, t2, t5); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 break; | 879 break; |
880 default: | 880 default: |
881 UNIMPLEMENTED(); | 881 UNIMPLEMENTED(); |
882 } | 882 } |
883 patcher.ChangeBranchCondition(branch_instr, opcode); | 883 patcher.ChangeBranchCondition(branch_instr, opcode); |
884 } | 884 } |
885 } // namespace internal | 885 } // namespace internal |
886 } // namespace v8 | 886 } // namespace v8 |
887 | 887 |
888 #endif // V8_TARGET_ARCH_MIPS | 888 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |