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_X87 | 5 #if V8_TARGET_ARCH_X87 |
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 3346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3357 // If the name comparison succeeded, we know we have a fixed array with | 3357 // If the name comparison succeeded, we know we have a fixed array with |
3358 // at least one map/handler pair. | 3358 // at least one map/handler pair. |
3359 __ mov(feedback, FieldOperand(vector, slot, times_half_pointer_size, | 3359 __ mov(feedback, FieldOperand(vector, slot, times_half_pointer_size, |
3360 FixedArray::kHeaderSize + kPointerSize)); | 3360 FixedArray::kHeaderSize + kPointerSize)); |
3361 HandleArrayCases(masm, receiver, key, vector, slot, feedback, false, &miss); | 3361 HandleArrayCases(masm, receiver, key, vector, slot, feedback, false, &miss); |
3362 | 3362 |
3363 __ bind(&miss); | 3363 __ bind(&miss); |
3364 KeyedLoadIC::GenerateMiss(masm); | 3364 KeyedLoadIC::GenerateMiss(masm); |
3365 } | 3365 } |
3366 | 3366 |
3367 | 3367 void StoreICTrampolineStub::Generate(MacroAssembler* masm) { |
3368 void VectorStoreICTrampolineStub::Generate(MacroAssembler* masm) { | |
3369 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); | 3368 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); |
3370 VectorStoreICStub stub(isolate(), state()); | 3369 StoreICStub stub(isolate(), state()); |
3371 stub.GenerateForTrampoline(masm); | 3370 stub.GenerateForTrampoline(masm); |
3372 } | 3371 } |
3373 | 3372 |
3374 | 3373 void KeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { |
3375 void VectorKeyedStoreICTrampolineStub::Generate(MacroAssembler* masm) { | |
3376 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); | 3374 __ EmitLoadTypeFeedbackVector(VectorStoreICDescriptor::VectorRegister()); |
3377 VectorKeyedStoreICStub stub(isolate(), state()); | 3375 KeyedStoreICStub stub(isolate(), state()); |
3378 stub.GenerateForTrampoline(masm); | 3376 stub.GenerateForTrampoline(masm); |
3379 } | 3377 } |
3380 | 3378 |
| 3379 void StoreICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } |
3381 | 3380 |
3382 void VectorStoreICStub::Generate(MacroAssembler* masm) { | 3381 void StoreICStub::GenerateForTrampoline(MacroAssembler* masm) { |
3383 GenerateImpl(masm, false); | |
3384 } | |
3385 | |
3386 | |
3387 void VectorStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { | |
3388 GenerateImpl(masm, true); | 3382 GenerateImpl(masm, true); |
3389 } | 3383 } |
3390 | 3384 |
3391 | 3385 |
3392 // value is on the stack already. | 3386 // value is on the stack already. |
3393 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, | 3387 static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, |
3394 Register key, Register vector, | 3388 Register key, Register vector, |
3395 Register slot, Register feedback, | 3389 Register slot, Register feedback, |
3396 bool is_polymorphic, Label* miss) { | 3390 bool is_polymorphic, Label* miss) { |
3397 // feedback initially contains the feedback array | 3391 // feedback initially contains the feedback array |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3513 __ j(not_equal, miss); | 3507 __ j(not_equal, miss); |
3514 __ mov(weak_cell, FieldOperand(vector, slot, times_half_pointer_size, | 3508 __ mov(weak_cell, FieldOperand(vector, slot, times_half_pointer_size, |
3515 FixedArray::kHeaderSize + kPointerSize)); | 3509 FixedArray::kHeaderSize + kPointerSize)); |
3516 __ lea(weak_cell, FieldOperand(weak_cell, Code::kHeaderSize)); | 3510 __ lea(weak_cell, FieldOperand(weak_cell, Code::kHeaderSize)); |
3517 __ mov(Operand::StaticVariable(virtual_register), weak_cell); | 3511 __ mov(Operand::StaticVariable(virtual_register), weak_cell); |
3518 __ pop(weak_cell); // Pop "value". | 3512 __ pop(weak_cell); // Pop "value". |
3519 // jump to the handler. | 3513 // jump to the handler. |
3520 __ jmp(Operand::StaticVariable(virtual_register)); | 3514 __ jmp(Operand::StaticVariable(virtual_register)); |
3521 } | 3515 } |
3522 | 3516 |
3523 | 3517 void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
3524 void VectorStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { | |
3525 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx | 3518 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx |
3526 Register key = VectorStoreICDescriptor::NameRegister(); // ecx | 3519 Register key = VectorStoreICDescriptor::NameRegister(); // ecx |
3527 Register value = VectorStoreICDescriptor::ValueRegister(); // eax | 3520 Register value = VectorStoreICDescriptor::ValueRegister(); // eax |
3528 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx | 3521 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx |
3529 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi | 3522 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi |
3530 Label miss; | 3523 Label miss; |
3531 | 3524 |
3532 __ push(value); | 3525 __ push(value); |
3533 | 3526 |
3534 Register scratch = value; | 3527 Register scratch = value; |
(...skipping 27 matching lines...) Expand all Loading... |
3562 __ pop(slot); | 3555 __ pop(slot); |
3563 Label no_pop_miss; | 3556 Label no_pop_miss; |
3564 __ jmp(&no_pop_miss); | 3557 __ jmp(&no_pop_miss); |
3565 | 3558 |
3566 __ bind(&miss); | 3559 __ bind(&miss); |
3567 __ pop(value); | 3560 __ pop(value); |
3568 __ bind(&no_pop_miss); | 3561 __ bind(&no_pop_miss); |
3569 StoreIC::GenerateMiss(masm); | 3562 StoreIC::GenerateMiss(masm); |
3570 } | 3563 } |
3571 | 3564 |
3572 | 3565 void KeyedStoreICStub::Generate(MacroAssembler* masm) { |
3573 void VectorKeyedStoreICStub::Generate(MacroAssembler* masm) { | |
3574 GenerateImpl(masm, false); | 3566 GenerateImpl(masm, false); |
3575 } | 3567 } |
3576 | 3568 |
3577 | 3569 void KeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { |
3578 void VectorKeyedStoreICStub::GenerateForTrampoline(MacroAssembler* masm) { | |
3579 GenerateImpl(masm, true); | 3570 GenerateImpl(masm, true); |
3580 } | 3571 } |
3581 | 3572 |
3582 | 3573 |
3583 static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, | 3574 static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
3584 Register receiver, Register key, | 3575 Register receiver, Register key, |
3585 Register vector, Register slot, | 3576 Register vector, Register slot, |
3586 Register feedback, Label* miss) { | 3577 Register feedback, Label* miss) { |
3587 // feedback initially contains the feedback array | 3578 // feedback initially contains the feedback array |
3588 Label next, next_loop, prepare_next; | 3579 Label next, next_loop, prepare_next; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3681 __ pop(key); | 3672 __ pop(key); |
3682 __ pop(vector); | 3673 __ pop(vector); |
3683 __ pop(receiver); | 3674 __ pop(receiver); |
3684 __ jmp(miss); | 3675 __ jmp(miss); |
3685 | 3676 |
3686 __ bind(&load_smi_map); | 3677 __ bind(&load_smi_map); |
3687 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); | 3678 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); |
3688 __ jmp(&compare_map); | 3679 __ jmp(&compare_map); |
3689 } | 3680 } |
3690 | 3681 |
3691 void VectorKeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { | 3682 void KeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
3692 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx | 3683 Register receiver = VectorStoreICDescriptor::ReceiverRegister(); // edx |
3693 Register key = VectorStoreICDescriptor::NameRegister(); // ecx | 3684 Register key = VectorStoreICDescriptor::NameRegister(); // ecx |
3694 Register value = VectorStoreICDescriptor::ValueRegister(); // eax | 3685 Register value = VectorStoreICDescriptor::ValueRegister(); // eax |
3695 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx | 3686 Register vector = VectorStoreICDescriptor::VectorRegister(); // ebx |
3696 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi | 3687 Register slot = VectorStoreICDescriptor::SlotRegister(); // edi |
3697 Label miss; | 3688 Label miss; |
3698 | 3689 |
3699 __ push(value); | 3690 __ push(value); |
3700 | 3691 |
3701 Register scratch = value; | 3692 Register scratch = value; |
(...skipping 1585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5287 kStackUnwindSpace, nullptr, return_value_operand, | 5278 kStackUnwindSpace, nullptr, return_value_operand, |
5288 NULL); | 5279 NULL); |
5289 } | 5280 } |
5290 | 5281 |
5291 #undef __ | 5282 #undef __ |
5292 | 5283 |
5293 } // namespace internal | 5284 } // namespace internal |
5294 } // namespace v8 | 5285 } // namespace v8 |
5295 | 5286 |
5296 #endif // V8_TARGET_ARCH_X87 | 5287 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |