| 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/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
| 8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
| 9 #include "src/counters.h" | 9 #include "src/counters.h" |
| 10 #include "src/debug/debug.h" | 10 #include "src/debug/debug.h" |
| (...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 } | 844 } |
| 845 | 845 |
| 846 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, | 846 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, |
| 847 bool is_construct) { | 847 bool is_construct) { |
| 848 // Called from Generate_JS_Entry | 848 // Called from Generate_JS_Entry |
| 849 // r0: new.target | 849 // r0: new.target |
| 850 // r1: function | 850 // r1: function |
| 851 // r2: receiver | 851 // r2: receiver |
| 852 // r3: argc | 852 // r3: argc |
| 853 // r4: argv | 853 // r4: argv |
| 854 // r5-r6, r8 (if !FLAG_enable_embedded_constant_pool) and cp may be clobbered | 854 // r5-r6, r8 and cp may be clobbered |
| 855 ProfileEntryHookStub::MaybeCallEntryHook(masm); | 855 ProfileEntryHookStub::MaybeCallEntryHook(masm); |
| 856 | 856 |
| 857 // Enter an internal frame. | 857 // Enter an internal frame. |
| 858 { | 858 { |
| 859 FrameScope scope(masm, StackFrame::INTERNAL); | 859 FrameScope scope(masm, StackFrame::INTERNAL); |
| 860 | 860 |
| 861 // Setup the context (we need to use the caller context from the isolate). | 861 // Setup the context (we need to use the caller context from the isolate). |
| 862 ExternalReference context_address(Isolate::kContextAddress, | 862 ExternalReference context_address(Isolate::kContextAddress, |
| 863 masm->isolate()); | 863 masm->isolate()); |
| 864 __ mov(cp, Operand(context_address)); | 864 __ mov(cp, Operand(context_address)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 894 | 894 |
| 895 // Setup new.target and argc. | 895 // Setup new.target and argc. |
| 896 __ mov(r0, Operand(r3)); | 896 __ mov(r0, Operand(r3)); |
| 897 __ mov(r3, Operand(r5)); | 897 __ mov(r3, Operand(r5)); |
| 898 | 898 |
| 899 // Initialize all JavaScript callee-saved registers, since they will be seen | 899 // Initialize all JavaScript callee-saved registers, since they will be seen |
| 900 // by the garbage collector as part of handlers. | 900 // by the garbage collector as part of handlers. |
| 901 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex); | 901 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex); |
| 902 __ mov(r5, Operand(r4)); | 902 __ mov(r5, Operand(r4)); |
| 903 __ mov(r6, Operand(r4)); | 903 __ mov(r6, Operand(r4)); |
| 904 if (!FLAG_enable_embedded_constant_pool) { | 904 __ mov(r8, Operand(r4)); |
| 905 __ mov(r8, Operand(r4)); | |
| 906 } | |
| 907 if (kR9Available == 1) { | 905 if (kR9Available == 1) { |
| 908 __ mov(r9, Operand(r4)); | 906 __ mov(r9, Operand(r4)); |
| 909 } | 907 } |
| 910 | 908 |
| 911 // Invoke the code. | 909 // Invoke the code. |
| 912 Handle<Code> builtin = is_construct | 910 Handle<Code> builtin = is_construct |
| 913 ? masm->isolate()->builtins()->Construct() | 911 ? masm->isolate()->builtins()->Construct() |
| 914 : masm->isolate()->builtins()->Call(); | 912 : masm->isolate()->builtins()->Call(); |
| 915 __ Call(builtin, RelocInfo::CODE_TARGET); | 913 __ Call(builtin, RelocInfo::CODE_TARGET); |
| 916 | 914 |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1690 } | 1688 } |
| 1691 | 1689 |
| 1692 // Load deoptimization data from the code object. | 1690 // Load deoptimization data from the code object. |
| 1693 // <deopt_data> = <code>[#deoptimization_data_offset] | 1691 // <deopt_data> = <code>[#deoptimization_data_offset] |
| 1694 __ ldr(r1, FieldMemOperand(r0, Code::kDeoptimizationDataOffset)); | 1692 __ ldr(r1, FieldMemOperand(r0, Code::kDeoptimizationDataOffset)); |
| 1695 | 1693 |
| 1696 { | 1694 { |
| 1697 ConstantPoolUnavailableScope constant_pool_unavailable(masm); | 1695 ConstantPoolUnavailableScope constant_pool_unavailable(masm); |
| 1698 __ add(r0, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start | 1696 __ add(r0, r0, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start |
| 1699 | 1697 |
| 1700 if (FLAG_enable_embedded_constant_pool) { | |
| 1701 __ LoadConstantPoolPointerRegisterFromCodeTargetAddress(r0); | |
| 1702 } | |
| 1703 | |
| 1704 // Load the OSR entrypoint offset from the deoptimization data. | 1698 // Load the OSR entrypoint offset from the deoptimization data. |
| 1705 // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] | 1699 // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] |
| 1706 __ ldr(r1, FieldMemOperand( | 1700 __ ldr(r1, FieldMemOperand( |
| 1707 r1, FixedArray::OffsetOfElementAt( | 1701 r1, FixedArray::OffsetOfElementAt( |
| 1708 DeoptimizationInputData::kOsrPcOffsetIndex))); | 1702 DeoptimizationInputData::kOsrPcOffsetIndex))); |
| 1709 | 1703 |
| 1710 // Compute the target address = code start + osr_offset | 1704 // Compute the target address = code start + osr_offset |
| 1711 __ add(lr, r0, Operand::SmiUntag(r1)); | 1705 __ add(lr, r0, Operand::SmiUntag(r1)); |
| 1712 | 1706 |
| 1713 // And "return" to the OSR entry point of the function. | 1707 // And "return" to the OSR entry point of the function. |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1951 { | 1945 { |
| 1952 __ str(r3, MemOperand(sp, 0)); | 1946 __ str(r3, MemOperand(sp, 0)); |
| 1953 __ TailCallRuntime(Runtime::kThrowNotConstructor); | 1947 __ TailCallRuntime(Runtime::kThrowNotConstructor); |
| 1954 } | 1948 } |
| 1955 } | 1949 } |
| 1956 | 1950 |
| 1957 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { | 1951 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { |
| 1958 __ SmiTag(r0); | 1952 __ SmiTag(r0); |
| 1959 __ mov(r4, Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); | 1953 __ mov(r4, Operand(StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR))); |
| 1960 __ stm(db_w, sp, r0.bit() | r1.bit() | r4.bit() | | 1954 __ stm(db_w, sp, r0.bit() | r1.bit() | r4.bit() | |
| 1961 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | | |
| 1962 fp.bit() | lr.bit()); | 1955 fp.bit() | lr.bit()); |
| 1963 __ add(fp, sp, | 1956 __ add(fp, sp, |
| 1964 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize)); | 1957 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize)); |
| 1965 } | 1958 } |
| 1966 | 1959 |
| 1967 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { | 1960 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { |
| 1968 // ----------- S t a t e ------------- | 1961 // ----------- S t a t e ------------- |
| 1969 // -- r0 : result being passed through | 1962 // -- r0 : result being passed through |
| 1970 // ----------------------------------- | 1963 // ----------------------------------- |
| 1971 // Get the number of arguments passed (as a smi), tear down the frame and | 1964 // Get the number of arguments passed (as a smi), tear down the frame and |
| (...skipping 1057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3029 } | 3022 } |
| 3030 // Now jump to the instructions of the returned code object. | 3023 // Now jump to the instructions of the returned code object. |
| 3031 __ Jump(r8); | 3024 __ Jump(r8); |
| 3032 } | 3025 } |
| 3033 #undef __ | 3026 #undef __ |
| 3034 | 3027 |
| 3035 } // namespace internal | 3028 } // namespace internal |
| 3036 } // namespace v8 | 3029 } // namespace v8 |
| 3037 | 3030 |
| 3038 #endif // V8_TARGET_ARCH_ARM | 3031 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |