| 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/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 1774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1785 | 1785 |
| 1786 void CallICStub::HandleArrayCase(MacroAssembler* masm, Label* miss) { | 1786 void CallICStub::HandleArrayCase(MacroAssembler* masm, Label* miss) { |
| 1787 // r1 - function | 1787 // r1 - function |
| 1788 // r3 - slot id | 1788 // r3 - slot id |
| 1789 // r2 - vector | 1789 // r2 - vector |
| 1790 // r4 - allocation site (loaded from vector[slot]) | 1790 // r4 - allocation site (loaded from vector[slot]) |
| 1791 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, r5); | 1791 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, r5); |
| 1792 __ cmp(r1, r5); | 1792 __ cmp(r1, r5); |
| 1793 __ b(ne, miss); | 1793 __ b(ne, miss); |
| 1794 | 1794 |
| 1795 __ mov(r0, Operand(arg_count())); | |
| 1796 | |
| 1797 // Increment the call count for monomorphic function calls. | 1795 // Increment the call count for monomorphic function calls. |
| 1798 IncrementCallCount(masm, r2, r3); | 1796 IncrementCallCount(masm, r2, r3); |
| 1799 | 1797 |
| 1800 __ mov(r2, r4); | 1798 __ mov(r2, r4); |
| 1801 __ mov(r3, r1); | 1799 __ mov(r3, r1); |
| 1802 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 1800 __ mov(r0, Operand(arg_count())); |
| 1801 ArrayConstructorStub stub(masm->isolate()); |
| 1803 __ TailCallStub(&stub); | 1802 __ TailCallStub(&stub); |
| 1804 } | 1803 } |
| 1805 | 1804 |
| 1806 | 1805 |
| 1807 void CallICStub::Generate(MacroAssembler* masm) { | 1806 void CallICStub::Generate(MacroAssembler* masm) { |
| 1808 // r1 - function | 1807 // r1 - function |
| 1809 // r3 - slot id (Smi) | 1808 // r3 - slot id (Smi) |
| 1810 // r2 - vector | 1809 // r2 - vector |
| 1811 Label extra_checks_or_miss, call, call_function, call_count_incremented; | 1810 Label extra_checks_or_miss, call, call_function, call_count_incremented; |
| 1812 int argc = arg_count(); | 1811 int argc = arg_count(); |
| (...skipping 1886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3699 stubh1.GetCode(); | 3698 stubh1.GetCode(); |
| 3700 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); | 3699 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); |
| 3701 stubh2.GetCode(); | 3700 stubh2.GetCode(); |
| 3702 } | 3701 } |
| 3703 } | 3702 } |
| 3704 | 3703 |
| 3705 | 3704 |
| 3706 void ArrayConstructorStub::GenerateDispatchToArrayStub( | 3705 void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| 3707 MacroAssembler* masm, | 3706 MacroAssembler* masm, |
| 3708 AllocationSiteOverrideMode mode) { | 3707 AllocationSiteOverrideMode mode) { |
| 3709 if (argument_count() == ANY) { | 3708 Label not_zero_case, not_one_case; |
| 3710 Label not_zero_case, not_one_case; | 3709 __ tst(r0, r0); |
| 3711 __ tst(r0, r0); | 3710 __ b(ne, ¬_zero_case); |
| 3712 __ b(ne, ¬_zero_case); | 3711 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 3713 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | |
| 3714 | 3712 |
| 3715 __ bind(¬_zero_case); | 3713 __ bind(¬_zero_case); |
| 3716 __ cmp(r0, Operand(1)); | 3714 __ cmp(r0, Operand(1)); |
| 3717 __ b(gt, ¬_one_case); | 3715 __ b(gt, ¬_one_case); |
| 3718 CreateArrayDispatchOneArgument(masm, mode); | 3716 CreateArrayDispatchOneArgument(masm, mode); |
| 3719 | 3717 |
| 3720 __ bind(¬_one_case); | 3718 __ bind(¬_one_case); |
| 3721 ArrayNArgumentsConstructorStub stub(masm->isolate()); | 3719 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 3722 __ TailCallStub(&stub); | 3720 __ TailCallStub(&stub); |
| 3723 } else if (argument_count() == NONE) { | |
| 3724 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | |
| 3725 } else if (argument_count() == ONE) { | |
| 3726 CreateArrayDispatchOneArgument(masm, mode); | |
| 3727 } else if (argument_count() == MORE_THAN_ONE) { | |
| 3728 ArrayNArgumentsConstructorStub stub(masm->isolate()); | |
| 3729 __ TailCallStub(&stub); | |
| 3730 } else { | |
| 3731 UNREACHABLE(); | |
| 3732 } | |
| 3733 } | 3721 } |
| 3734 | 3722 |
| 3735 | 3723 |
| 3736 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 3724 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 3737 // ----------- S t a t e ------------- | 3725 // ----------- S t a t e ------------- |
| 3738 // -- r0 : argc (only if argument_count() == ANY) | 3726 // -- r0 : argc (only if argument_count() == ANY) |
| 3739 // -- r1 : constructor | 3727 // -- r1 : constructor |
| 3740 // -- r2 : AllocationSite or undefined | 3728 // -- r2 : AllocationSite or undefined |
| 3741 // -- r3 : new target | 3729 // -- r3 : new target |
| 3742 // -- sp[0] : return address | 3730 // -- sp[0] : return address |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3774 __ ldr(r3, FieldMemOperand(r2, AllocationSite::kTransitionInfoOffset)); | 3762 __ ldr(r3, FieldMemOperand(r2, AllocationSite::kTransitionInfoOffset)); |
| 3775 __ SmiUntag(r3); | 3763 __ SmiUntag(r3); |
| 3776 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); | 3764 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); |
| 3777 __ and_(r3, r3, Operand(AllocationSite::ElementsKindBits::kMask)); | 3765 __ and_(r3, r3, Operand(AllocationSite::ElementsKindBits::kMask)); |
| 3778 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); | 3766 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); |
| 3779 | 3767 |
| 3780 __ bind(&no_info); | 3768 __ bind(&no_info); |
| 3781 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); | 3769 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
| 3782 | 3770 |
| 3783 __ bind(&subclassing); | 3771 __ bind(&subclassing); |
| 3784 switch (argument_count()) { | 3772 __ str(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2)); |
| 3785 case ANY: | 3773 __ add(r0, r0, Operand(3)); |
| 3786 case MORE_THAN_ONE: | |
| 3787 __ str(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2)); | |
| 3788 __ add(r0, r0, Operand(3)); | |
| 3789 break; | |
| 3790 case NONE: | |
| 3791 __ str(r1, MemOperand(sp, 0 * kPointerSize)); | |
| 3792 __ mov(r0, Operand(3)); | |
| 3793 break; | |
| 3794 case ONE: | |
| 3795 __ str(r1, MemOperand(sp, 1 * kPointerSize)); | |
| 3796 __ mov(r0, Operand(4)); | |
| 3797 break; | |
| 3798 } | |
| 3799 __ Push(r3, r2); | 3774 __ Push(r3, r2); |
| 3800 __ JumpToExternalReference(ExternalReference(Runtime::kNewArray, isolate())); | 3775 __ JumpToExternalReference(ExternalReference(Runtime::kNewArray, isolate())); |
| 3801 } | 3776 } |
| 3802 | 3777 |
| 3803 | 3778 |
| 3804 void InternalArrayConstructorStub::GenerateCase( | 3779 void InternalArrayConstructorStub::GenerateCase( |
| 3805 MacroAssembler* masm, ElementsKind kind) { | 3780 MacroAssembler* masm, ElementsKind kind) { |
| 3806 __ cmp(r0, Operand(1)); | 3781 __ cmp(r0, Operand(1)); |
| 3807 | 3782 |
| 3808 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); | 3783 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); |
| (...skipping 1104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4913 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 4888 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 4914 kStackUnwindSpace, NULL, return_value_operand, NULL); | 4889 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 4915 } | 4890 } |
| 4916 | 4891 |
| 4917 #undef __ | 4892 #undef __ |
| 4918 | 4893 |
| 4919 } // namespace internal | 4894 } // namespace internal |
| 4920 } // namespace v8 | 4895 } // namespace v8 |
| 4921 | 4896 |
| 4922 #endif // V8_TARGET_ARCH_ARM | 4897 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |