| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM | 7 #if V8_TARGET_ARCH_ARM |
| 8 | 8 |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 r3); | 457 r3); |
| 458 __ Ret(); | 458 __ Ret(); |
| 459 | 459 |
| 460 __ bind(&index_name); | 460 __ bind(&index_name); |
| 461 __ IndexFromHash(r3, key); | 461 __ IndexFromHash(r3, key); |
| 462 // Now jump to the place where smi keys are handled. | 462 // Now jump to the place where smi keys are handled. |
| 463 __ jmp(&index_smi); | 463 __ jmp(&index_smi); |
| 464 } | 464 } |
| 465 | 465 |
| 466 | 466 |
| 467 static void StoreIC_PushArgs(MacroAssembler* masm) { |
| 468 if (FLAG_vector_stores) { |
| 469 __ Push(StoreDescriptor::ReceiverRegister(), |
| 470 StoreDescriptor::NameRegister(), StoreDescriptor::ValueRegister(), |
| 471 VectorStoreICDescriptor::SlotRegister(), |
| 472 VectorStoreICDescriptor::VectorRegister()); |
| 473 } else { |
| 474 __ Push(StoreDescriptor::ReceiverRegister(), |
| 475 StoreDescriptor::NameRegister(), StoreDescriptor::ValueRegister()); |
| 476 } |
| 477 } |
| 478 |
| 479 |
| 467 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 480 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
| 468 // Push receiver, key and value for runtime call. | 481 StoreIC_PushArgs(masm); |
| 469 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | |
| 470 StoreDescriptor::ValueRegister()); | |
| 471 | 482 |
| 472 __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, 3, 1); | 483 int args = FLAG_vector_stores ? 5 : 3; |
| 484 __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, args, 1); |
| 473 } | 485 } |
| 474 | 486 |
| 475 | 487 |
| 476 static void KeyedStoreGenerateMegamorphicHelper( | 488 static void KeyedStoreGenerateMegamorphicHelper( |
| 477 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, | 489 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, |
| 478 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length, | 490 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length, |
| 479 Register value, Register key, Register receiver, Register receiver_map, | 491 Register value, Register key, Register receiver, Register receiver_map, |
| 480 Register elements_map, Register elements) { | 492 Register elements_map, Register elements) { |
| 481 Label transition_smi_elements; | 493 Label transition_smi_elements; |
| 482 Label finish_object_store, non_double_value, transition_double_elements; | 494 Label finish_object_store, non_double_value, transition_double_elements; |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 | 772 |
| 761 masm->isolate()->stub_cache()->GenerateProbe( | 773 masm->isolate()->stub_cache()->GenerateProbe( |
| 762 masm, Code::STORE_IC, flags, false, receiver, name, r3, r4, r5, r6); | 774 masm, Code::STORE_IC, flags, false, receiver, name, r3, r4, r5, r6); |
| 763 | 775 |
| 764 // Cache miss: Jump to runtime. | 776 // Cache miss: Jump to runtime. |
| 765 GenerateMiss(masm); | 777 GenerateMiss(masm); |
| 766 } | 778 } |
| 767 | 779 |
| 768 | 780 |
| 769 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 781 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
| 770 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 782 StoreIC_PushArgs(masm); |
| 771 StoreDescriptor::ValueRegister()); | |
| 772 | 783 |
| 773 // Perform tail call to the entry. | 784 // Perform tail call to the entry. |
| 774 __ TailCallRuntime(Runtime::kStoreIC_Miss, 3, 1); | 785 int args = FLAG_vector_stores ? 5 : 3; |
| 786 __ TailCallRuntime(Runtime::kStoreIC_Miss, args, 1); |
| 775 } | 787 } |
| 776 | 788 |
| 777 | 789 |
| 778 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 790 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
| 779 Label miss; | 791 Label miss; |
| 780 Register receiver = StoreDescriptor::ReceiverRegister(); | 792 Register receiver = StoreDescriptor::ReceiverRegister(); |
| 781 Register name = StoreDescriptor::NameRegister(); | 793 Register name = StoreDescriptor::NameRegister(); |
| 782 Register value = StoreDescriptor::ValueRegister(); | 794 Register value = StoreDescriptor::ValueRegister(); |
| 783 Register dictionary = r3; | 795 Register dictionary = r3; |
| 784 DCHECK(receiver.is(r1)); | 796 DCHECK(receiver.is(r1)); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 patcher.EmitCondition(ne); | 901 patcher.EmitCondition(ne); |
| 890 } else { | 902 } else { |
| 891 DCHECK(Assembler::GetCondition(branch_instr) == ne); | 903 DCHECK(Assembler::GetCondition(branch_instr) == ne); |
| 892 patcher.EmitCondition(eq); | 904 patcher.EmitCondition(eq); |
| 893 } | 905 } |
| 894 } | 906 } |
| 895 } // namespace internal | 907 } // namespace internal |
| 896 } // namespace v8 | 908 } // namespace v8 |
| 897 | 909 |
| 898 #endif // V8_TARGET_ARCH_ARM | 910 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |