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/debug.h" | 10 #include "src/debug.h" |
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 | 867 |
868 | 868 |
869 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, | 869 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, |
870 bool is_construct) { | 870 bool is_construct) { |
871 // Called from Generate_JS_Entry | 871 // Called from Generate_JS_Entry |
872 // r0: code entry | 872 // r0: code entry |
873 // r1: function | 873 // r1: function |
874 // r2: receiver | 874 // r2: receiver |
875 // r3: argc | 875 // r3: argc |
876 // r4: argv | 876 // r4: argv |
877 // r5-r6, r8 (if not FLAG_enable_ool_constant_pool) and cp may be clobbered | 877 // r5-r6, r8 (if !FLAG_enable_embedded_constant_pool) and cp may be clobbered |
878 ProfileEntryHookStub::MaybeCallEntryHook(masm); | 878 ProfileEntryHookStub::MaybeCallEntryHook(masm); |
879 | 879 |
880 // Clear the context before we push it when entering the internal frame. | 880 // Clear the context before we push it when entering the internal frame. |
881 __ mov(cp, Operand::Zero()); | 881 __ mov(cp, Operand::Zero()); |
882 | 882 |
883 // Enter an internal frame. | 883 // Enter an internal frame. |
884 { | 884 { |
885 FrameScope scope(masm, StackFrame::INTERNAL); | 885 FrameScope scope(masm, StackFrame::INTERNAL); |
886 | 886 |
887 // Set up the context from the function argument. | 887 // Set up the context from the function argument. |
(...skipping 27 matching lines...) Expand all Loading... |
915 __ push(r0); // push parameter | 915 __ push(r0); // push parameter |
916 __ bind(&entry); | 916 __ bind(&entry); |
917 __ cmp(r4, r2); | 917 __ cmp(r4, r2); |
918 __ b(ne, &loop); | 918 __ b(ne, &loop); |
919 | 919 |
920 // Initialize all JavaScript callee-saved registers, since they will be seen | 920 // Initialize all JavaScript callee-saved registers, since they will be seen |
921 // by the garbage collector as part of handlers. | 921 // by the garbage collector as part of handlers. |
922 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex); | 922 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex); |
923 __ mov(r5, Operand(r4)); | 923 __ mov(r5, Operand(r4)); |
924 __ mov(r6, Operand(r4)); | 924 __ mov(r6, Operand(r4)); |
925 if (!FLAG_enable_ool_constant_pool) { | 925 if (!FLAG_enable_embedded_constant_pool) { |
926 __ mov(r8, Operand(r4)); | 926 __ mov(r8, Operand(r4)); |
927 } | 927 } |
928 if (kR9Available == 1) { | 928 if (kR9Available == 1) { |
929 __ mov(r9, Operand(r4)); | 929 __ mov(r9, Operand(r4)); |
930 } | 930 } |
931 | 931 |
932 // Invoke the code and pass argc as r0. | 932 // Invoke the code and pass argc as r0. |
933 __ mov(r0, Operand(r3)); | 933 __ mov(r0, Operand(r3)); |
934 if (is_construct) { | 934 if (is_construct) { |
935 // No type feedback cell is available | 935 // No type feedback cell is available |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 __ b(ne, &skip); | 1159 __ b(ne, &skip); |
1160 __ Ret(); | 1160 __ Ret(); |
1161 | 1161 |
1162 __ bind(&skip); | 1162 __ bind(&skip); |
1163 | 1163 |
1164 // Load deoptimization data from the code object. | 1164 // Load deoptimization data from the code object. |
1165 // <deopt_data> = <code>[#deoptimization_data_offset] | 1165 // <deopt_data> = <code>[#deoptimization_data_offset] |
1166 __ ldr(r1, FieldMemOperand(r0, Code::kDeoptimizationDataOffset)); | 1166 __ ldr(r1, FieldMemOperand(r0, Code::kDeoptimizationDataOffset)); |
1167 | 1167 |
1168 { ConstantPoolUnavailableScope constant_pool_unavailable(masm); | 1168 { ConstantPoolUnavailableScope constant_pool_unavailable(masm); |
1169 if (FLAG_enable_ool_constant_pool) { | 1169 if (FLAG_enable_embedded_constant_pool) { |
1170 __ ldr(pp, FieldMemOperand(r0, Code::kConstantPoolOffset)); | 1170 __ LoadConstantPoolPointerRegisterFromCodeTargetAddress(r0); |
1171 } | 1171 } |
1172 | 1172 |
1173 // Load the OSR entrypoint offset from the deoptimization data. | 1173 // Load the OSR entrypoint offset from the deoptimization data. |
1174 // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] | 1174 // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] |
1175 __ ldr(r1, FieldMemOperand(r1, FixedArray::OffsetOfElementAt( | 1175 __ ldr(r1, FieldMemOperand(r1, FixedArray::OffsetOfElementAt( |
1176 DeoptimizationInputData::kOsrPcOffsetIndex))); | 1176 DeoptimizationInputData::kOsrPcOffsetIndex))); |
1177 | 1177 |
1178 // Compute the target address = code_obj + header_size + osr_offset | 1178 // Compute the target address = code_obj + header_size + osr_offset |
1179 // <entry_addr> = <code_obj> + #header_size + <osr_offset> | 1179 // <entry_addr> = <code_obj> + #header_size + <osr_offset> |
1180 __ add(r0, r0, Operand::SmiUntag(r1)); | 1180 __ add(r0, r0, Operand::SmiUntag(r1)); |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1642 // Check if the arguments will overflow the stack. | 1642 // Check if the arguments will overflow the stack. |
1643 __ cmp(r5, Operand(r2, LSL, kPointerSizeLog2)); | 1643 __ cmp(r5, Operand(r2, LSL, kPointerSizeLog2)); |
1644 __ b(le, stack_overflow); // Signed comparison. | 1644 __ b(le, stack_overflow); // Signed comparison. |
1645 } | 1645 } |
1646 | 1646 |
1647 | 1647 |
1648 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { | 1648 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { |
1649 __ SmiTag(r0); | 1649 __ SmiTag(r0); |
1650 __ mov(r4, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 1650 __ mov(r4, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
1651 __ stm(db_w, sp, r0.bit() | r1.bit() | r4.bit() | | 1651 __ stm(db_w, sp, r0.bit() | r1.bit() | r4.bit() | |
1652 (FLAG_enable_ool_constant_pool ? pp.bit() : 0) | | 1652 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | |
1653 fp.bit() | lr.bit()); | 1653 fp.bit() | lr.bit()); |
1654 __ add(fp, sp, | 1654 __ add(fp, sp, |
1655 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize)); | 1655 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize)); |
1656 } | 1656 } |
1657 | 1657 |
1658 | 1658 |
1659 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { | 1659 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { |
1660 // ----------- S t a t e ------------- | 1660 // ----------- S t a t e ------------- |
1661 // -- r0 : result being passed through | 1661 // -- r0 : result being passed through |
1662 // ----------------------------------- | 1662 // ----------------------------------- |
1663 // Get the number of arguments passed (as a smi), tear down the frame and | 1663 // Get the number of arguments passed (as a smi), tear down the frame and |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1810 } | 1810 } |
1811 } | 1811 } |
1812 | 1812 |
1813 | 1813 |
1814 #undef __ | 1814 #undef __ |
1815 | 1815 |
1816 } // namespace internal | 1816 } // namespace internal |
1817 } // namespace v8 | 1817 } // namespace v8 |
1818 | 1818 |
1819 #endif // V8_TARGET_ARCH_ARM | 1819 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |