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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 } else { | 276 } else { |
277 __ Push(receiver, name); | 277 __ Push(receiver, name); |
278 } | 278 } |
279 } | 279 } |
280 | 280 |
281 | 281 |
282 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 282 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
283 // The return address is in lr. | 283 // The return address is in lr. |
284 Isolate* isolate = masm->isolate(); | 284 Isolate* isolate = masm->isolate(); |
285 | 285 |
286 __ IncrementCounter(isolate->counters()->load_miss(), 1, r3, r4); | 286 DCHECK(!FLAG_vector_ics || |
| 287 !AreAliased(r4, r5, VectorLoadICDescriptor::SlotRegister(), |
| 288 VectorLoadICDescriptor::VectorRegister())); |
| 289 __ IncrementCounter(isolate->counters()->load_miss(), 1, r4, r5); |
287 | 290 |
288 LoadIC_PushArgs(masm); | 291 LoadIC_PushArgs(masm); |
289 | 292 |
290 // Perform tail call to the entry. | 293 // Perform tail call to the entry. |
291 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); | 294 ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); |
292 int arg_count = FLAG_vector_ics ? 4 : 2; | 295 int arg_count = FLAG_vector_ics ? 4 : 2; |
293 __ TailCallExternalReference(ref, arg_count, 1); | 296 __ TailCallExternalReference(ref, arg_count, 1); |
294 } | 297 } |
295 | 298 |
296 | 299 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 __ Ret(); | 413 __ Ret(); |
411 __ bind(&slow); | 414 __ bind(&slow); |
412 GenerateMiss(masm); | 415 GenerateMiss(masm); |
413 } | 416 } |
414 | 417 |
415 | 418 |
416 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { | 419 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
417 // The return address is in lr. | 420 // The return address is in lr. |
418 Isolate* isolate = masm->isolate(); | 421 Isolate* isolate = masm->isolate(); |
419 | 422 |
420 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, r3, r4); | 423 DCHECK(!FLAG_vector_ics || |
| 424 !AreAliased(r4, r5, VectorLoadICDescriptor::SlotRegister(), |
| 425 VectorLoadICDescriptor::VectorRegister())); |
| 426 __ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, r4, r5); |
421 | 427 |
422 LoadIC_PushArgs(masm); | 428 LoadIC_PushArgs(masm); |
423 | 429 |
424 // Perform tail call to the entry. | 430 // Perform tail call to the entry. |
425 ExternalReference ref = | 431 ExternalReference ref = |
426 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); | 432 ExternalReference(IC_Utility(kKeyedLoadIC_Miss), isolate); |
427 int arg_count = FLAG_vector_ics ? 4 : 2; | 433 int arg_count = FLAG_vector_ics ? 4 : 2; |
428 __ TailCallExternalReference(ref, arg_count, 1); | 434 __ TailCallExternalReference(ref, arg_count, 1); |
429 } | 435 } |
430 | 436 |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 // r2: receiver. | 817 // r2: receiver. |
812 PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode); | 818 PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode); |
813 // Never returns to here. | 819 // Never returns to here. |
814 | 820 |
815 __ bind(&maybe_name_key); | 821 __ bind(&maybe_name_key); |
816 __ ldr(r4, FieldMemOperand(key, HeapObject::kMapOffset)); | 822 __ ldr(r4, FieldMemOperand(key, HeapObject::kMapOffset)); |
817 __ ldrb(r4, FieldMemOperand(r4, Map::kInstanceTypeOffset)); | 823 __ ldrb(r4, FieldMemOperand(r4, Map::kInstanceTypeOffset)); |
818 __ JumpIfNotUniqueNameInstanceType(r4, &slow); | 824 __ JumpIfNotUniqueNameInstanceType(r4, &slow); |
819 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 825 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
820 Code::ComputeHandlerFlags(Code::STORE_IC)); | 826 Code::ComputeHandlerFlags(Code::STORE_IC)); |
821 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver, | 827 masm->isolate()->stub_cache()->GenerateProbe( |
822 key, r3, r4, r5, r6); | 828 masm, Code::STORE_IC, flags, false, receiver, key, r3, r4, r5, r6); |
823 // Cache miss. | 829 // Cache miss. |
824 __ b(&miss); | 830 __ b(&miss); |
825 | 831 |
826 // Extra capacity case: Check if there is extra capacity to | 832 // Extra capacity case: Check if there is extra capacity to |
827 // perform the store and update the length. Used for adding one | 833 // perform the store and update the length. Used for adding one |
828 // element to the array by writing to array[array.length]. | 834 // element to the array by writing to array[array.length]. |
829 __ bind(&extra); | 835 __ bind(&extra); |
830 // Condition code from comparing key and array length is still available. | 836 // Condition code from comparing key and array length is still available. |
831 __ b(ne, &slow); // Only support writing to writing to array[array.length]. | 837 __ b(ne, &slow); // Only support writing to writing to array[array.length]. |
832 // Check for room in the elements backing store. | 838 // Check for room in the elements backing store. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 Register receiver = StoreDescriptor::ReceiverRegister(); | 879 Register receiver = StoreDescriptor::ReceiverRegister(); |
874 Register name = StoreDescriptor::NameRegister(); | 880 Register name = StoreDescriptor::NameRegister(); |
875 DCHECK(receiver.is(r1)); | 881 DCHECK(receiver.is(r1)); |
876 DCHECK(name.is(r2)); | 882 DCHECK(name.is(r2)); |
877 DCHECK(StoreDescriptor::ValueRegister().is(r0)); | 883 DCHECK(StoreDescriptor::ValueRegister().is(r0)); |
878 | 884 |
879 // Get the receiver from the stack and probe the stub cache. | 885 // Get the receiver from the stack and probe the stub cache. |
880 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 886 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
881 Code::ComputeHandlerFlags(Code::STORE_IC)); | 887 Code::ComputeHandlerFlags(Code::STORE_IC)); |
882 | 888 |
883 masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver, | 889 masm->isolate()->stub_cache()->GenerateProbe( |
884 name, r3, r4, r5, r6); | 890 masm, Code::STORE_IC, flags, false, receiver, name, r3, r4, r5, r6); |
885 | 891 |
886 // Cache miss: Jump to runtime. | 892 // Cache miss: Jump to runtime. |
887 GenerateMiss(masm); | 893 GenerateMiss(masm); |
888 } | 894 } |
889 | 895 |
890 | 896 |
891 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 897 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
892 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), | 898 __ Push(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister(), |
893 StoreDescriptor::ValueRegister()); | 899 StoreDescriptor::ValueRegister()); |
894 | 900 |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 patcher.EmitCondition(ne); | 1019 patcher.EmitCondition(ne); |
1014 } else { | 1020 } else { |
1015 DCHECK(Assembler::GetCondition(branch_instr) == ne); | 1021 DCHECK(Assembler::GetCondition(branch_instr) == ne); |
1016 patcher.EmitCondition(eq); | 1022 patcher.EmitCondition(eq); |
1017 } | 1023 } |
1018 } | 1024 } |
1019 } | 1025 } |
1020 } // namespace v8::internal | 1026 } // namespace v8::internal |
1021 | 1027 |
1022 #endif // V8_TARGET_ARCH_ARM | 1028 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |