| 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_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 4323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4334 | 4334 |
| 4335 | 4335 |
| 4336 void LoadICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } | 4336 void LoadICStub::Generate(MacroAssembler* masm) { GenerateImpl(masm, false); } |
| 4337 | 4337 |
| 4338 | 4338 |
| 4339 void LoadICStub::GenerateForTrampoline(MacroAssembler* masm) { | 4339 void LoadICStub::GenerateForTrampoline(MacroAssembler* masm) { |
| 4340 GenerateImpl(masm, true); | 4340 GenerateImpl(masm, true); |
| 4341 } | 4341 } |
| 4342 | 4342 |
| 4343 | 4343 |
| 4344 static void HandleArrayCases(MacroAssembler* masm, Register receiver, | 4344 static void HandleArrayCases(MacroAssembler* masm, Register feedback, |
| 4345 Register key, Register vector, Register slot, | 4345 Register receiver_map, Register scratch1, |
| 4346 Register feedback, Register receiver_map, | 4346 Register scratch2, bool is_polymorphic, |
| 4347 Register scratch1, Register scratch2, | 4347 Label* miss) { |
| 4348 bool is_polymorphic, Label* miss) { | |
| 4349 // feedback initially contains the feedback array | 4348 // feedback initially contains the feedback array |
| 4350 Label next_loop, prepare_next; | 4349 Label next_loop, prepare_next; |
| 4351 Label start_polymorphic; | 4350 Label start_polymorphic; |
| 4352 | 4351 |
| 4353 Register cached_map = scratch1; | 4352 Register cached_map = scratch1; |
| 4354 | 4353 |
| 4355 __ ldr(cached_map, | 4354 __ ldr(cached_map, |
| 4356 FieldMemOperand(feedback, FixedArray::OffsetOfElementAt(0))); | 4355 FieldMemOperand(feedback, FixedArray::OffsetOfElementAt(0))); |
| 4357 __ ldr(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset)); | 4356 __ ldr(cached_map, FieldMemOperand(cached_map, WeakCell::kValueOffset)); |
| 4358 __ cmp(receiver_map, cached_map); | 4357 __ cmp(receiver_map, cached_map); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4448 Label try_array, load_smi_map, compare_map; | 4447 Label try_array, load_smi_map, compare_map; |
| 4449 Label not_array, miss; | 4448 Label not_array, miss; |
| 4450 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, | 4449 HandleMonomorphicCase(masm, receiver, receiver_map, feedback, vector, slot, |
| 4451 scratch1, &compare_map, &load_smi_map, &try_array); | 4450 scratch1, &compare_map, &load_smi_map, &try_array); |
| 4452 | 4451 |
| 4453 // Is it a fixed array? | 4452 // Is it a fixed array? |
| 4454 __ bind(&try_array); | 4453 __ bind(&try_array); |
| 4455 __ ldr(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset)); | 4454 __ ldr(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset)); |
| 4456 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex); | 4455 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex); |
| 4457 __ b(ne, ¬_array); | 4456 __ b(ne, ¬_array); |
| 4458 HandleArrayCases(masm, receiver, name, vector, slot, feedback, receiver_map, | 4457 HandleArrayCases(masm, feedback, receiver_map, scratch1, r9, true, &miss); |
| 4459 scratch1, r9, true, &miss); | |
| 4460 | 4458 |
| 4461 __ bind(¬_array); | 4459 __ bind(¬_array); |
| 4462 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex); | 4460 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex); |
| 4463 __ b(ne, &miss); | 4461 __ b(ne, &miss); |
| 4464 Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags( | 4462 Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags( |
| 4465 Code::ComputeHandlerFlags(Code::LOAD_IC)); | 4463 Code::ComputeHandlerFlags(Code::LOAD_IC)); |
| 4466 masm->isolate()->stub_cache()->GenerateProbe(masm, Code::LOAD_IC, code_flags, | 4464 masm->isolate()->stub_cache()->GenerateProbe(masm, Code::LOAD_IC, code_flags, |
| 4467 receiver, name, feedback, | 4465 receiver, name, feedback, |
| 4468 receiver_map, scratch1, r9); | 4466 receiver_map, scratch1, r9); |
| 4469 | 4467 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4509 | 4507 |
| 4510 __ bind(&try_array); | 4508 __ bind(&try_array); |
| 4511 // Is it a fixed array? | 4509 // Is it a fixed array? |
| 4512 __ ldr(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset)); | 4510 __ ldr(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset)); |
| 4513 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex); | 4511 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex); |
| 4514 __ b(ne, ¬_array); | 4512 __ b(ne, ¬_array); |
| 4515 | 4513 |
| 4516 // We have a polymorphic element handler. | 4514 // We have a polymorphic element handler. |
| 4517 Label polymorphic, try_poly_name; | 4515 Label polymorphic, try_poly_name; |
| 4518 __ bind(&polymorphic); | 4516 __ bind(&polymorphic); |
| 4519 HandleArrayCases(masm, receiver, key, vector, slot, feedback, receiver_map, | 4517 HandleArrayCases(masm, feedback, receiver_map, scratch1, r9, true, &miss); |
| 4520 scratch1, r9, true, &miss); | |
| 4521 | 4518 |
| 4522 __ bind(¬_array); | 4519 __ bind(¬_array); |
| 4523 // Is it generic? | 4520 // Is it generic? |
| 4524 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex); | 4521 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex); |
| 4525 __ b(ne, &try_poly_name); | 4522 __ b(ne, &try_poly_name); |
| 4526 Handle<Code> megamorphic_stub = | 4523 Handle<Code> megamorphic_stub = |
| 4527 KeyedLoadIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState()); | 4524 KeyedLoadIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState()); |
| 4528 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET); | 4525 __ Jump(megamorphic_stub, RelocInfo::CODE_TARGET); |
| 4529 | 4526 |
| 4530 __ bind(&try_poly_name); | 4527 __ bind(&try_poly_name); |
| 4531 // We might have a name in feedback, and a fixed array in the next slot. | 4528 // We might have a name in feedback, and a fixed array in the next slot. |
| 4532 __ cmp(key, feedback); | 4529 __ cmp(key, feedback); |
| 4533 __ b(ne, &miss); | 4530 __ b(ne, &miss); |
| 4534 // If the name comparison succeeded, we know we have a fixed array with | 4531 // If the name comparison succeeded, we know we have a fixed array with |
| 4535 // at least one map/handler pair. | 4532 // at least one map/handler pair. |
| 4536 __ add(feedback, vector, Operand::PointerOffsetFromSmiKey(slot)); | 4533 __ add(feedback, vector, Operand::PointerOffsetFromSmiKey(slot)); |
| 4537 __ ldr(feedback, | 4534 __ ldr(feedback, |
| 4538 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize)); | 4535 FieldMemOperand(feedback, FixedArray::kHeaderSize + kPointerSize)); |
| 4539 HandleArrayCases(masm, receiver, key, vector, slot, feedback, receiver_map, | 4536 HandleArrayCases(masm, feedback, receiver_map, scratch1, r9, false, &miss); |
| 4540 scratch1, r9, false, &miss); | |
| 4541 | 4537 |
| 4542 __ bind(&miss); | 4538 __ bind(&miss); |
| 4543 KeyedLoadIC::GenerateMiss(masm); | 4539 KeyedLoadIC::GenerateMiss(masm); |
| 4544 | 4540 |
| 4545 __ bind(&load_smi_map); | 4541 __ bind(&load_smi_map); |
| 4546 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); | 4542 __ LoadRoot(receiver_map, Heap::kHeapNumberMapRootIndex); |
| 4547 __ jmp(&compare_map); | 4543 __ jmp(&compare_map); |
| 4548 } | 4544 } |
| 4549 | 4545 |
| 4550 | 4546 |
| (...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5455 MemOperand(fp, 6 * kPointerSize), NULL); | 5451 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5456 } | 5452 } |
| 5457 | 5453 |
| 5458 | 5454 |
| 5459 #undef __ | 5455 #undef __ |
| 5460 | 5456 |
| 5461 } // namespace internal | 5457 } // namespace internal |
| 5462 } // namespace v8 | 5458 } // namespace v8 |
| 5463 | 5459 |
| 5464 #endif // V8_TARGET_ARCH_ARM | 5460 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |