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 |