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_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 3534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3545 // If the name comparison succeeded, we know we have a fixed array with | 3545 // If the name comparison succeeded, we know we have a fixed array with |
3546 // at least one map/handler pair. | 3546 // at least one map/handler pair. |
3547 __ mov(feedback, FieldOperand(vector, slot, times_half_pointer_size, | 3547 __ mov(feedback, FieldOperand(vector, slot, times_half_pointer_size, |
3548 FixedArray::kHeaderSize + kPointerSize)); | 3548 FixedArray::kHeaderSize + kPointerSize)); |
3549 HandleArrayCases(masm, receiver, key, vector, slot, feedback, false, &miss); | 3549 HandleArrayCases(masm, receiver, key, vector, slot, feedback, false, &miss); |
3550 | 3550 |
3551 __ bind(&miss); | 3551 __ bind(&miss); |
3552 KeyedLoadIC::GenerateMiss(masm); | 3552 KeyedLoadIC::GenerateMiss(masm); |
3553 } | 3553 } |
3554 | 3554 |
3555 | 3555 void StoreICTrampolineStub::Generate(MacroAssembler* masm) { |
3556 void VectorStoreICTrampolineStub::Generate(MacroAssembler* masm) { | |
3557 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); | 3556 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); |
3558 VectorStoreICStub stub(isolate(), state()); | 3557 StoreICStub stub(isolate(), state()); |
3559 stub.GenerateForTrampoline(masm); | 3558 stub.GenerateForTrampoline(masm); |
3560 } | 3559 } |
3561 | 3560 |
3562 | 3561 void KeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { |
3563 void VectorKeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { | |
3564 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); | 3562 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); |
3565 VectorKeyedStoreICStub stub(isolate(), state()); | 3563 KeyedStoreICStub stub(isolate(), state()); |
3566 stub.GenerateForTrampoline(masm); | 3564 stub.GenerateForTrampoline(masm); |
3567 } | 3565 } |
3568 | 3566 |
| 3567 void StoreICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } |
3569 | 3568 |
3570 void VectorStoreICStub::Generate(MacroAssembler* masm) { | 3569 void StoreICStub::GenerateForTrampoline(MacroAssembler* masm) { |
3571 GenerateImpl(masm, false); | |
3572 } | |
3573 | |
3574 | |
3575 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { | |
3576 GenerateImpl(masm, true); | 3570 GenerateImpl(masm, true); |
3577 } | 3571 } |
3578 | 3572 |
3579 | 3573 |
3580 // value is on the stack already. | 3574 // value is on the stack already. |
3581 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, | 3575 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, |
3582 Register key, Register vector, | 3576 Register key, Register vector, |
3583 Register slot, Register feedback, | 3577 Register slot, Register feedback, |
3584 bool is_polymorphic, Label* miss) { | 3578 bool is_polymorphic, Label* miss) { |
3585 // feedback initially contains the feedback array | 3579 // feedback initially contains the feedback array |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3701 __ j(not_equal, miss); | 3695 __ j(not_equal, miss); |
3702 __ mov(weak_cell, FieldOperand(vector, slot, times_half_pointer_size, | 3696 __ mov(weak_cell, FieldOperand(vector, slot, times_half_pointer_size, |
3703 FixedArray::kHeaderSize + kPointerSize)); | 3697 FixedArray::kHeaderSize + kPointerSize)); |
3704 __ lea(weak_cell, FieldOperand(weak_cell, Code::kHeaderSize)); | 3698 __ lea(weak_cell, FieldOperand(weak_cell, Code::kHeaderSize)); |
3705 __ mov(Operand::StaticVariable(virtual_register), weak_cell); | 3699 __ mov(Operand::StaticVariable(virtual_register), weak_cell); |
3706 __ pop(weak_cell); // Pop "value". | 3700 __ pop(weak_cell); // Pop "value". |
3707 // jump to the handler. | 3701 // jump to the handler. |
3708 __ jmp(Operand::StaticVariable(virtual_register)); | 3702 __ jmp(Operand::StaticVariable(virtual_register)); |
3709 } | 3703 } |
3710 | 3704 |
3711 | 3705 void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
3712 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { | |
3713 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx | 3706 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx |
3714 Register key = VectorStoreICDescriptor::NameRegister(); // ecx | 3707 Register key = VectorStoreICDescriptor::NameRegister(); // ecx |
3715 Register value = VectorStoreICDescriptor::ValueRegister(); // eax | 3708 Register value = VectorStoreICDescriptor::ValueRegister(); // eax |
3716 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx | 3709 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx |
3717 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi | 3710 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi |
3718 Label miss; | 3711 Label miss; |
3719 | 3712 |
3720 __ push(value); | 3713 __ push(value); |
3721 | 3714 |
3722 Register scratch = value; | 3715 Register scratch = value; |
(...skipping 27 matching lines...) Expand all Loading... |
3750 __ pop(slot); | 3743 __ pop(slot); |
3751 Label no_pop_miss; | 3744 Label no_pop_miss; |
3752 __ jmp(&no_pop_miss); | 3745 __ jmp(&no_pop_miss); |
3753 | 3746 |
3754 __ bind(&miss); | 3747 __ bind(&miss); |
3755 __ pop(value); | 3748 __ pop(value); |
3756 __ bind(&no_pop_miss); | 3749 __ bind(&no_pop_miss); |
3757 StoreIC::GenerateMiss(masm); | 3750 StoreIC::GenerateMiss(masm); |
3758 } | 3751 } |
3759 | 3752 |
3760 | 3753 void KeyedStoreICStub::Generate(MacroAssembler* masm) { |
3761 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) { | |
3762 GenerateImpl(masm, false); | 3754 GenerateImpl(masm, false); |
3763 } | 3755 } |
3764 | 3756 |
3765 | 3757 void KeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { |
3766 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { | |
3767 GenerateImpl(masm, true); | 3758 GenerateImpl(masm, true); |
3768 } | 3759 } |
3769 | 3760 |
3770 | 3761 |
3771 static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, | 3762 static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
3772 Register receiver, Register key, | 3763 Register receiver, Register key, |
3773 Register vector, Register slot, | 3764 Register vector, Register slot, |
3774 Register feedback, Label* miss) { | 3765 Register feedback, Label* miss) { |
3775 // feedback initially contains the feedback array | 3766 // feedback initially contains the feedback array |
3776 Label next, next_loop, prepare_next; | 3767 Label next, next_loop, prepare_next; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3869 __ pop(key); | 3860 __ pop(key); |
3870 __ pop(vector); | 3861 __ pop(vector); |
3871 __ pop(receiver); | 3862 __ pop(receiver); |
3872 __ jmp(miss); | 3863 __ jmp(miss); |
3873 | 3864 |
3874 __ bind(&load_smi_map); | 3865 __ bind(&load_smi_map); |
3875 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); | 3866 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); |
3876 __ jmp(&compare_map); | 3867 __ jmp(&compare_map); |
3877 } | 3868 } |
3878 | 3869 |
3879 | 3870 void KeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
3880 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { | |
3881 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx | 3871 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx |
3882 Register key = VectorStoreICDescriptor::NameRegister(); // ecx | 3872 Register key = VectorStoreICDescriptor::NameRegister(); // ecx |
3883 Register value = VectorStoreICDescriptor::ValueRegister(); // eax | 3873 Register value = VectorStoreICDescriptor::ValueRegister(); // eax |
3884 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx | 3874 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx |
3885 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi | 3875 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi |
3886 Label miss; | 3876 Label miss; |
3887 | 3877 |
3888 __ push(value); | 3878 __ push(value); |
3889 | 3879 |
3890 Register scratch = value; | 3880 Register scratch = value; |
(...skipping 1606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5497 kStackUnwindSpace, nullptr, return_value_operand, | 5487 kStackUnwindSpace, nullptr, return_value_operand, |
5498 NULL); | 5488 NULL); |
5499 } | 5489 } |
5500 | 5490 |
5501 #undef __ | 5491 #undef __ |
5502 | 5492 |
5503 } // namespace internal | 5493 } // namespace internal |
5504 } // namespace v8 | 5494 } // namespace v8 |
5505 | 5495 |
5506 #endif // V8_TARGET_ARCH_IA32 | 5496 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |