| 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 |