| 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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 2645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2656 __ mov(r0, Operand(arg_count())); | 2656 __ mov(r0, Operand(arg_count())); |
| 2657 __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3)); | 2657 __ add(r4, r2, Operand::PointerOffsetFromSmiKey(r3)); |
| 2658 __ ldr(r4, FieldMemOperand(r4, FixedArray::kHeaderSize)); | 2658 __ ldr(r4, FieldMemOperand(r4, FixedArray::kHeaderSize)); |
| 2659 | 2659 |
| 2660 // Verify that r4 contains an AllocationSite | 2660 // Verify that r4 contains an AllocationSite |
| 2661 __ ldr(r5, FieldMemOperand(r4, HeapObject::kMapOffset)); | 2661 __ ldr(r5, FieldMemOperand(r4, HeapObject::kMapOffset)); |
| 2662 __ CompareRoot(r5, Heap::kAllocationSiteMapRootIndex); | 2662 __ CompareRoot(r5, Heap::kAllocationSiteMapRootIndex); |
| 2663 __ b(ne, &miss); | 2663 __ b(ne, &miss); |
| 2664 | 2664 |
| 2665 __ mov(r2, r4); | 2665 __ mov(r2, r4); |
| 2666 __ mov(r3, r1); |
| 2666 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 2667 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
| 2667 __ TailCallStub(&stub); | 2668 __ TailCallStub(&stub); |
| 2668 | 2669 |
| 2669 __ bind(&miss); | 2670 __ bind(&miss); |
| 2670 GenerateMiss(masm); | 2671 GenerateMiss(masm); |
| 2671 | 2672 |
| 2672 // The slow case, we need this no matter what to complete a call after a miss. | 2673 // The slow case, we need this no matter what to complete a call after a miss. |
| 2673 CallFunctionNoFeedback(masm, | 2674 CallFunctionNoFeedback(masm, |
| 2674 arg_count(), | 2675 arg_count(), |
| 2675 true, | 2676 true, |
| (...skipping 1890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4566 UNREACHABLE(); | 4567 UNREACHABLE(); |
| 4567 } | 4568 } |
| 4568 } | 4569 } |
| 4569 | 4570 |
| 4570 | 4571 |
| 4571 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 4572 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4572 // ----------- S t a t e ------------- | 4573 // ----------- S t a t e ------------- |
| 4573 // -- r0 : argc (only if argument_count() == ANY) | 4574 // -- r0 : argc (only if argument_count() == ANY) |
| 4574 // -- r1 : constructor | 4575 // -- r1 : constructor |
| 4575 // -- r2 : AllocationSite or undefined | 4576 // -- r2 : AllocationSite or undefined |
| 4577 // -- r3 : original constructor |
| 4576 // -- sp[0] : return address | 4578 // -- sp[0] : return address |
| 4577 // -- sp[4] : last argument | 4579 // -- sp[4] : last argument |
| 4578 // ----------------------------------- | 4580 // ----------------------------------- |
| 4579 | 4581 |
| 4580 if (FLAG_debug_code) { | 4582 if (FLAG_debug_code) { |
| 4581 // The array construct code is only set for the global and natives | 4583 // The array construct code is only set for the global and natives |
| 4582 // builtin Array functions which always have maps. | 4584 // builtin Array functions which always have maps. |
| 4583 | 4585 |
| 4584 // Initial map for the builtin Array function should be a map. | 4586 // Initial map for the builtin Array function should be a map. |
| 4585 __ ldr(r4, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset)); | 4587 __ ldr(r4, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset)); |
| 4586 // Will both indicate a NULL and a Smi. | 4588 // Will both indicate a NULL and a Smi. |
| 4587 __ tst(r4, Operand(kSmiTagMask)); | 4589 __ tst(r4, Operand(kSmiTagMask)); |
| 4588 __ Assert(ne, kUnexpectedInitialMapForArrayFunction); | 4590 __ Assert(ne, kUnexpectedInitialMapForArrayFunction); |
| 4589 __ CompareObjectType(r4, r4, r5, MAP_TYPE); | 4591 __ CompareObjectType(r4, r4, r5, MAP_TYPE); |
| 4590 __ Assert(eq, kUnexpectedInitialMapForArrayFunction); | 4592 __ Assert(eq, kUnexpectedInitialMapForArrayFunction); |
| 4591 | 4593 |
| 4592 // We should either have undefined in r2 or a valid AllocationSite | 4594 // We should either have undefined in r2 or a valid AllocationSite |
| 4593 __ AssertUndefinedOrAllocationSite(r2, r4); | 4595 __ AssertUndefinedOrAllocationSite(r2, r4); |
| 4594 } | 4596 } |
| 4595 | 4597 |
| 4598 Label subclassing; |
| 4599 __ cmp(r3, r1); |
| 4600 __ b(ne, &subclassing); |
| 4601 |
| 4596 Label no_info; | 4602 Label no_info; |
| 4597 // Get the elements kind and case on that. | 4603 // Get the elements kind and case on that. |
| 4598 __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); | 4604 __ CompareRoot(r2, Heap::kUndefinedValueRootIndex); |
| 4599 __ b(eq, &no_info); | 4605 __ b(eq, &no_info); |
| 4600 | 4606 |
| 4601 __ ldr(r3, FieldMemOperand(r2, AllocationSite::kTransitionInfoOffset)); | 4607 __ ldr(r3, FieldMemOperand(r2, AllocationSite::kTransitionInfoOffset)); |
| 4602 __ SmiUntag(r3); | 4608 __ SmiUntag(r3); |
| 4603 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); | 4609 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); |
| 4604 __ and_(r3, r3, Operand(AllocationSite::ElementsKindBits::kMask)); | 4610 __ and_(r3, r3, Operand(AllocationSite::ElementsKindBits::kMask)); |
| 4605 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); | 4611 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); |
| 4606 | 4612 |
| 4607 __ bind(&no_info); | 4613 __ bind(&no_info); |
| 4608 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); | 4614 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
| 4615 |
| 4616 __ bind(&subclassing); |
| 4617 __ TailCallRuntime(Runtime::kThrowArrayNotSubclassableError, 0, 1); |
| 4609 } | 4618 } |
| 4610 | 4619 |
| 4611 | 4620 |
| 4612 void InternalArrayConstructorStub::GenerateCase( | 4621 void InternalArrayConstructorStub::GenerateCase( |
| 4613 MacroAssembler* masm, ElementsKind kind) { | 4622 MacroAssembler* masm, ElementsKind kind) { |
| 4614 __ cmp(r0, Operand(1)); | 4623 __ cmp(r0, Operand(1)); |
| 4615 | 4624 |
| 4616 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); | 4625 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); |
| 4617 __ TailCallStub(&stub0, lo); | 4626 __ TailCallStub(&stub0, lo); |
| 4618 | 4627 |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5002 kStackUnwindSpace, NULL, | 5011 kStackUnwindSpace, NULL, |
| 5003 MemOperand(fp, 6 * kPointerSize), NULL); | 5012 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5004 } | 5013 } |
| 5005 | 5014 |
| 5006 | 5015 |
| 5007 #undef __ | 5016 #undef __ |
| 5008 | 5017 |
| 5009 } } // namespace v8::internal | 5018 } } // namespace v8::internal |
| 5010 | 5019 |
| 5011 #endif // V8_TARGET_ARCH_ARM | 5020 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |