| 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 | 8 |
| 9 #include "src/api-arguments.h" | 9 #include "src/api-arguments.h" |
| 10 #include "src/assembler-inl.h" | 10 #include "src/assembler-inl.h" |
| (...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 __ cmp(cp, Operand(0)); | 976 __ cmp(cp, Operand(0)); |
| 977 __ str(cp, MemOperand(fp, StandardFrameConstants::kContextOffset), ne); | 977 __ str(cp, MemOperand(fp, StandardFrameConstants::kContextOffset), ne); |
| 978 | 978 |
| 979 // Compute the handler entry address and jump to it. | 979 // Compute the handler entry address and jump to it. |
| 980 ConstantPoolUnavailableScope constant_pool_unavailable(masm); | 980 ConstantPoolUnavailableScope constant_pool_unavailable(masm); |
| 981 __ mov(r1, Operand(pending_handler_code_address)); | 981 __ mov(r1, Operand(pending_handler_code_address)); |
| 982 __ ldr(r1, MemOperand(r1)); | 982 __ ldr(r1, MemOperand(r1)); |
| 983 __ mov(r2, Operand(pending_handler_offset_address)); | 983 __ mov(r2, Operand(pending_handler_offset_address)); |
| 984 __ ldr(r2, MemOperand(r2)); | 984 __ ldr(r2, MemOperand(r2)); |
| 985 __ add(r1, r1, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start | 985 __ add(r1, r1, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start |
| 986 if (FLAG_enable_embedded_constant_pool) { | |
| 987 __ LoadConstantPoolPointerRegisterFromCodeTargetAddress(r1); | |
| 988 } | |
| 989 __ add(pc, r1, r2); | 986 __ add(pc, r1, r2); |
| 990 } | 987 } |
| 991 | 988 |
| 992 | 989 |
| 993 void JSEntryStub::Generate(MacroAssembler* masm) { | 990 void JSEntryStub::Generate(MacroAssembler* masm) { |
| 994 // r0: code entry | 991 // r0: code entry |
| 995 // r1: function | 992 // r1: function |
| 996 // r2: receiver | 993 // r2: receiver |
| 997 // r3: argc | 994 // r3: argc |
| 998 // [sp+0]: argv | 995 // [sp+0]: argv |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1022 offset_to_argv += kNumDoubleCalleeSaved * kDoubleSize; | 1019 offset_to_argv += kNumDoubleCalleeSaved * kDoubleSize; |
| 1023 __ ldr(r4, MemOperand(sp, offset_to_argv)); | 1020 __ ldr(r4, MemOperand(sp, offset_to_argv)); |
| 1024 | 1021 |
| 1025 // Push a frame with special values setup to mark it as an entry frame. | 1022 // Push a frame with special values setup to mark it as an entry frame. |
| 1026 // r0: code entry | 1023 // r0: code entry |
| 1027 // r1: function | 1024 // r1: function |
| 1028 // r2: receiver | 1025 // r2: receiver |
| 1029 // r3: argc | 1026 // r3: argc |
| 1030 // r4: argv | 1027 // r4: argv |
| 1031 StackFrame::Type marker = type(); | 1028 StackFrame::Type marker = type(); |
| 1032 if (FLAG_enable_embedded_constant_pool) { | |
| 1033 __ mov(r8, Operand::Zero()); | |
| 1034 } | |
| 1035 __ mov(r7, Operand(StackFrame::TypeToMarker(marker))); | 1029 __ mov(r7, Operand(StackFrame::TypeToMarker(marker))); |
| 1036 __ mov(r6, Operand(StackFrame::TypeToMarker(marker))); | 1030 __ mov(r6, Operand(StackFrame::TypeToMarker(marker))); |
| 1037 __ mov(r5, | 1031 __ mov(r5, |
| 1038 Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 1032 Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
| 1039 __ ldr(r5, MemOperand(r5)); | 1033 __ ldr(r5, MemOperand(r5)); |
| 1040 __ mov(ip, Operand(-1)); // Push a bad frame pointer to fail if it is used. | 1034 __ mov(ip, Operand(-1)); // Push a bad frame pointer to fail if it is used. |
| 1041 __ stm(db_w, sp, r5.bit() | r6.bit() | r7.bit() | | 1035 __ stm(db_w, sp, r5.bit() | r6.bit() | r7.bit() | |
| 1042 (FLAG_enable_embedded_constant_pool ? r8.bit() : 0) | | |
| 1043 ip.bit()); | 1036 ip.bit()); |
| 1044 | 1037 |
| 1045 // Set up frame pointer for the frame to be pushed. | 1038 // Set up frame pointer for the frame to be pushed. |
| 1046 __ add(fp, sp, Operand(-EntryFrameConstants::kCallerFPOffset)); | 1039 __ add(fp, sp, Operand(-EntryFrameConstants::kCallerFPOffset)); |
| 1047 | 1040 |
| 1048 // If this is the outermost JS call, set js_entry_sp value. | 1041 // If this is the outermost JS call, set js_entry_sp value. |
| 1049 Label non_outermost_js; | 1042 Label non_outermost_js; |
| 1050 ExternalReference js_entry_sp(Isolate::kJSEntrySPAddress, isolate()); | 1043 ExternalReference js_entry_sp(Isolate::kJSEntrySPAddress, isolate()); |
| 1051 __ mov(r5, Operand(ExternalReference(js_entry_sp))); | 1044 __ mov(r5, Operand(ExternalReference(js_entry_sp))); |
| 1052 __ ldr(r6, MemOperand(r5)); | 1045 __ ldr(r6, MemOperand(r5)); |
| (...skipping 1944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2997 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 2990 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 2998 kStackUnwindSpace, NULL, return_value_operand, NULL); | 2991 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 2999 } | 2992 } |
| 3000 | 2993 |
| 3001 #undef __ | 2994 #undef __ |
| 3002 | 2995 |
| 3003 } // namespace internal | 2996 } // namespace internal |
| 3004 } // namespace v8 | 2997 } // namespace v8 |
| 3005 | 2998 |
| 3006 #endif // V8_TARGET_ARCH_ARM | 2999 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |