OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) { | 39 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) { |
40 const intptr_t thread_offset = NativeArguments::thread_offset(); | 40 const intptr_t thread_offset = NativeArguments::thread_offset(); |
41 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 41 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
42 const intptr_t argv_offset = NativeArguments::argv_offset(); | 42 const intptr_t argv_offset = NativeArguments::argv_offset(); |
43 const intptr_t retval_offset = NativeArguments::retval_offset(); | 43 const intptr_t retval_offset = NativeArguments::retval_offset(); |
44 | 44 |
45 __ SetPrologueOffset(); | 45 __ SetPrologueOffset(); |
46 __ Comment("CallToRuntimeStub"); | 46 __ Comment("CallToRuntimeStub"); |
47 __ EnterStubFrame(); | 47 __ EnterStubFrame(); |
48 | 48 |
49 COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R28)) != 0); | |
50 __ LoadIsolate(R28); | |
51 | |
52 // Save exit frame information to enable stack walking as we are about | 49 // Save exit frame information to enable stack walking as we are about |
53 // to transition to Dart VM C++ code. | 50 // to transition to Dart VM C++ code. |
54 __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset()); | 51 __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset()); |
55 | 52 |
56 #if defined(DEBUG) | 53 #if defined(DEBUG) |
57 { Label ok; | 54 { Label ok; |
58 // Check that we are always entering from Dart code. | 55 // Check that we are always entering from Dart code. |
59 __ LoadFromOffset(R8, R28, Isolate::vm_tag_offset()); | 56 __ LoadFromOffset(R8, THR, Thread::vm_tag_offset()); |
60 __ CompareImmediate(R8, VMTag::kDartTagId); | 57 __ CompareImmediate(R8, VMTag::kDartTagId); |
61 __ b(&ok, EQ); | 58 __ b(&ok, EQ); |
62 __ Stop("Not coming from Dart code."); | 59 __ Stop("Not coming from Dart code."); |
63 __ Bind(&ok); | 60 __ Bind(&ok); |
64 } | 61 } |
65 #endif | 62 #endif |
66 | 63 |
67 // Mark that the isolate is executing VM code. | 64 // Mark that the thread is executing VM code. |
68 __ StoreToOffset(R5, R28, Isolate::vm_tag_offset()); | 65 __ StoreToOffset(R5, THR, Thread::vm_tag_offset()); |
69 | 66 |
70 // Reserve space for arguments and align frame before entering C++ world. | 67 // Reserve space for arguments and align frame before entering C++ world. |
71 // NativeArguments are passed in registers. | 68 // NativeArguments are passed in registers. |
72 __ Comment("align stack"); | 69 __ Comment("align stack"); |
73 // Reserve space for arguments. | 70 // Reserve space for arguments. |
74 ASSERT(sizeof(NativeArguments) == 4 * kWordSize); | 71 ASSERT(sizeof(NativeArguments) == 4 * kWordSize); |
75 __ ReserveAlignedFrameSpace(sizeof(NativeArguments)); | 72 __ ReserveAlignedFrameSpace(sizeof(NativeArguments)); |
76 | 73 |
77 // Pass NativeArguments structure by value and call runtime. | 74 // Pass NativeArguments structure by value and call runtime. |
78 // Registers R0, R1, R2, and R3 are used. | 75 // Registers R0, R1, R2, and R3 are used. |
(...skipping 29 matching lines...) Expand all Loading... |
108 __ mov(CSP, SP); | 105 __ mov(CSP, SP); |
109 | 106 |
110 __ blr(R5); | 107 __ blr(R5); |
111 __ Comment("CallToRuntimeStub return"); | 108 __ Comment("CallToRuntimeStub return"); |
112 | 109 |
113 // Restore SP and CSP. | 110 // Restore SP and CSP. |
114 __ mov(SP, CSP); | 111 __ mov(SP, CSP); |
115 __ mov(CSP, R26); | 112 __ mov(CSP, R26); |
116 | 113 |
117 // Retval is next to 1st argument. | 114 // Retval is next to 1st argument. |
118 // Mark that the isolate is executing Dart code. | 115 // Mark that the thread is executing Dart code. |
119 __ LoadImmediate(R2, VMTag::kDartTagId); | 116 __ LoadImmediate(R2, VMTag::kDartTagId); |
120 __ StoreToOffset(R2, R28, Isolate::vm_tag_offset()); | 117 __ StoreToOffset(R2, THR, Thread::vm_tag_offset()); |
121 | 118 |
122 // Reset exit frame information in Isolate structure. | 119 // Reset exit frame information in Isolate structure. |
123 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); | 120 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); |
124 | 121 |
125 __ LeaveStubFrame(); | 122 __ LeaveStubFrame(); |
126 __ ret(); | 123 __ ret(); |
127 } | 124 } |
128 | 125 |
129 | 126 |
130 // Print the stop message. | 127 // Print the stop message. |
(...skipping 15 matching lines...) Expand all Loading... |
146 // R2 : address of first argument in argument array. | 143 // R2 : address of first argument in argument array. |
147 // R1 : argc_tag including number of arguments and function kind. | 144 // R1 : argc_tag including number of arguments and function kind. |
148 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { | 145 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { |
149 const intptr_t thread_offset = NativeArguments::thread_offset(); | 146 const intptr_t thread_offset = NativeArguments::thread_offset(); |
150 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 147 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
151 const intptr_t argv_offset = NativeArguments::argv_offset(); | 148 const intptr_t argv_offset = NativeArguments::argv_offset(); |
152 const intptr_t retval_offset = NativeArguments::retval_offset(); | 149 const intptr_t retval_offset = NativeArguments::retval_offset(); |
153 | 150 |
154 __ EnterStubFrame(); | 151 __ EnterStubFrame(); |
155 | 152 |
156 COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R28)) != 0); | |
157 __ LoadIsolate(R28); | |
158 | |
159 // Save exit frame information to enable stack walking as we are about | 153 // Save exit frame information to enable stack walking as we are about |
160 // to transition to native code. | 154 // to transition to native code. |
161 __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset()); | 155 __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset()); |
162 | 156 |
163 #if defined(DEBUG) | 157 #if defined(DEBUG) |
164 { Label ok; | 158 { Label ok; |
165 // Check that we are always entering from Dart code. | 159 // Check that we are always entering from Dart code. |
166 __ LoadFromOffset(R6, R28, Isolate::vm_tag_offset()); | 160 __ LoadFromOffset(R6, THR, Thread::vm_tag_offset()); |
167 __ CompareImmediate(R6, VMTag::kDartTagId); | 161 __ CompareImmediate(R6, VMTag::kDartTagId); |
168 __ b(&ok, EQ); | 162 __ b(&ok, EQ); |
169 __ Stop("Not coming from Dart code."); | 163 __ Stop("Not coming from Dart code."); |
170 __ Bind(&ok); | 164 __ Bind(&ok); |
171 } | 165 } |
172 #endif | 166 #endif |
173 | 167 |
174 // Mark that the isolate is executing Native code. | 168 // Mark that the thread is executing native code. |
175 __ StoreToOffset(R5, R28, Isolate::vm_tag_offset()); | 169 __ StoreToOffset(R5, THR, Thread::vm_tag_offset()); |
176 | 170 |
177 // Reserve space for the native arguments structure passed on the stack (the | 171 // Reserve space for the native arguments structure passed on the stack (the |
178 // outgoing pointer parameter to the native arguments structure is passed in | 172 // outgoing pointer parameter to the native arguments structure is passed in |
179 // R0) and align frame before entering the C++ world. | 173 // R0) and align frame before entering the C++ world. |
180 __ ReserveAlignedFrameSpace(sizeof(NativeArguments)); | 174 __ ReserveAlignedFrameSpace(sizeof(NativeArguments)); |
181 | 175 |
182 // Initialize NativeArguments structure and call native function. | 176 // Initialize NativeArguments structure and call native function. |
183 // Registers R0, R1, R2, and R3 are used. | 177 // Registers R0, R1, R2, and R3 are used. |
184 | 178 |
185 ASSERT(thread_offset == 0 * kWordSize); | 179 ASSERT(thread_offset == 0 * kWordSize); |
(...skipping 30 matching lines...) Expand all Loading... |
216 __ mov(R1, R5); // Pass the function entrypoint to call. | 210 __ mov(R1, R5); // Pass the function entrypoint to call. |
217 | 211 |
218 // Call native function invocation wrapper or redirection via simulator. | 212 // Call native function invocation wrapper or redirection via simulator. |
219 __ ldr(LR, Address(THR, Thread::native_call_wrapper_entry_point_offset())); | 213 __ ldr(LR, Address(THR, Thread::native_call_wrapper_entry_point_offset())); |
220 __ blr(LR); | 214 __ blr(LR); |
221 | 215 |
222 // Restore SP and CSP. | 216 // Restore SP and CSP. |
223 __ mov(SP, CSP); | 217 __ mov(SP, CSP); |
224 __ mov(CSP, R26); | 218 __ mov(CSP, R26); |
225 | 219 |
226 // Mark that the isolate is executing Dart code. | 220 // Mark that the thread is executing Dart code. |
227 __ LoadImmediate(R2, VMTag::kDartTagId); | 221 __ LoadImmediate(R2, VMTag::kDartTagId); |
228 __ StoreToOffset(R2, R28, Isolate::vm_tag_offset()); | 222 __ StoreToOffset(R2, THR, Thread::vm_tag_offset()); |
229 | 223 |
230 // Reset exit frame information in Isolate structure. | 224 // Reset exit frame information in Isolate structure. |
231 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); | 225 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); |
232 | 226 |
233 __ LeaveStubFrame(); | 227 __ LeaveStubFrame(); |
234 __ ret(); | 228 __ ret(); |
235 } | 229 } |
236 | 230 |
237 | 231 |
238 // Input parameters: | 232 // Input parameters: |
239 // LR : return address. | 233 // LR : return address. |
240 // SP : address of return value. | 234 // SP : address of return value. |
241 // R5 : address of the native function to call. | 235 // R5 : address of the native function to call. |
242 // R2 : address of first argument in argument array. | 236 // R2 : address of first argument in argument array. |
243 // R1 : argc_tag including number of arguments and function kind. | 237 // R1 : argc_tag including number of arguments and function kind. |
244 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { | 238 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { |
245 const intptr_t thread_offset = NativeArguments::thread_offset(); | 239 const intptr_t thread_offset = NativeArguments::thread_offset(); |
246 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 240 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
247 const intptr_t argv_offset = NativeArguments::argv_offset(); | 241 const intptr_t argv_offset = NativeArguments::argv_offset(); |
248 const intptr_t retval_offset = NativeArguments::retval_offset(); | 242 const intptr_t retval_offset = NativeArguments::retval_offset(); |
249 | 243 |
250 __ EnterStubFrame(); | 244 __ EnterStubFrame(); |
251 | 245 |
252 COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R28)) != 0); | |
253 __ LoadIsolate(R28); | |
254 | |
255 // Save exit frame information to enable stack walking as we are about | 246 // Save exit frame information to enable stack walking as we are about |
256 // to transition to native code. | 247 // to transition to native code. |
257 __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset()); | 248 __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset()); |
258 | 249 |
259 #if defined(DEBUG) | 250 #if defined(DEBUG) |
260 { Label ok; | 251 { Label ok; |
261 // Check that we are always entering from Dart code. | 252 // Check that we are always entering from Dart code. |
262 __ LoadFromOffset(R6, R28, Isolate::vm_tag_offset()); | 253 __ LoadFromOffset(R6, THR, Thread::vm_tag_offset()); |
263 __ CompareImmediate(R6, VMTag::kDartTagId); | 254 __ CompareImmediate(R6, VMTag::kDartTagId); |
264 __ b(&ok, EQ); | 255 __ b(&ok, EQ); |
265 __ Stop("Not coming from Dart code."); | 256 __ Stop("Not coming from Dart code."); |
266 __ Bind(&ok); | 257 __ Bind(&ok); |
267 } | 258 } |
268 #endif | 259 #endif |
269 | 260 |
270 // Mark that the isolate is executing Native code. | 261 // Mark that the thread is executing native code. |
271 __ StoreToOffset(R5, R28, Isolate::vm_tag_offset()); | 262 __ StoreToOffset(R5, THR, Thread::vm_tag_offset()); |
272 | 263 |
273 // Reserve space for the native arguments structure passed on the stack (the | 264 // Reserve space for the native arguments structure passed on the stack (the |
274 // outgoing pointer parameter to the native arguments structure is passed in | 265 // outgoing pointer parameter to the native arguments structure is passed in |
275 // R0) and align frame before entering the C++ world. | 266 // R0) and align frame before entering the C++ world. |
276 __ ReserveAlignedFrameSpace(sizeof(NativeArguments)); | 267 __ ReserveAlignedFrameSpace(sizeof(NativeArguments)); |
277 | 268 |
278 // Initialize NativeArguments structure and call native function. | 269 // Initialize NativeArguments structure and call native function. |
279 // Registers R0, R1, R2, and R3 are used. | 270 // Registers R0, R1, R2, and R3 are used. |
280 | 271 |
281 ASSERT(thread_offset == 0 * kWordSize); | 272 ASSERT(thread_offset == 0 * kWordSize); |
(...skipping 27 matching lines...) Expand all Loading... |
309 __ mov(R26, CSP); | 300 __ mov(R26, CSP); |
310 __ mov(CSP, SP); | 301 __ mov(CSP, SP); |
311 | 302 |
312 // Call native function or redirection via simulator. | 303 // Call native function or redirection via simulator. |
313 __ blr(R5); | 304 __ blr(R5); |
314 | 305 |
315 // Restore SP and CSP. | 306 // Restore SP and CSP. |
316 __ mov(SP, CSP); | 307 __ mov(SP, CSP); |
317 __ mov(CSP, R26); | 308 __ mov(CSP, R26); |
318 | 309 |
319 // Mark that the isolate is executing Dart code. | 310 // Mark that the thread is executing Dart code. |
320 __ LoadImmediate(R2, VMTag::kDartTagId); | 311 __ LoadImmediate(R2, VMTag::kDartTagId); |
321 __ StoreToOffset(R2, R28, Isolate::vm_tag_offset()); | 312 __ StoreToOffset(R2, THR, Thread::vm_tag_offset()); |
322 | 313 |
323 // Reset exit frame information in Isolate structure. | 314 // Reset exit frame information in Isolate structure. |
324 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); | 315 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); |
325 | 316 |
326 __ LeaveStubFrame(); | 317 __ LeaveStubFrame(); |
327 __ ret(); | 318 __ ret(); |
328 } | 319 } |
329 | 320 |
330 | 321 |
331 // Input parameters: | 322 // Input parameters: |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
814 // Save the bottom 64-bits of callee-saved V registers. | 805 // Save the bottom 64-bits of callee-saved V registers. |
815 for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) { | 806 for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) { |
816 const VRegister r = static_cast<VRegister>(i); | 807 const VRegister r = static_cast<VRegister>(i); |
817 __ PushDouble(r); | 808 __ PushDouble(r); |
818 } | 809 } |
819 | 810 |
820 // Set up THR, which caches the current thread in Dart code. | 811 // Set up THR, which caches the current thread in Dart code. |
821 if (THR != R3) { | 812 if (THR != R3) { |
822 __ mov(THR, R3); | 813 __ mov(THR, R3); |
823 } | 814 } |
824 // Load Isolate pointer into temporary register R5. | |
825 __ LoadIsolate(R5); | |
826 | 815 |
827 // Save the current VMTag on the stack. | 816 // Save the current VMTag on the stack. |
828 __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset()); | 817 __ LoadFromOffset(R4, THR, Thread::vm_tag_offset()); |
829 __ Push(R4); | 818 __ Push(R4); |
830 | 819 |
831 // Mark that the isolate is executing Dart code. | 820 // Mark that the thread is executing Dart code. |
832 __ LoadImmediate(R6, VMTag::kDartTagId); | 821 __ LoadImmediate(R6, VMTag::kDartTagId); |
833 __ StoreToOffset(R6, R5, Isolate::vm_tag_offset()); | 822 __ StoreToOffset(R6, THR, Thread::vm_tag_offset()); |
834 | 823 |
835 // Save top resource and top exit frame info. Use R6 as a temporary register. | 824 // Save top resource and top exit frame info. Use R6 as a temporary register. |
836 // StackFrameIterator reads the top exit frame info saved in this frame. | 825 // StackFrameIterator reads the top exit frame info saved in this frame. |
837 __ LoadFromOffset(R6, THR, Thread::top_resource_offset()); | 826 __ LoadFromOffset(R6, THR, Thread::top_resource_offset()); |
838 __ StoreToOffset(ZR, THR, Thread::top_resource_offset()); | 827 __ StoreToOffset(ZR, THR, Thread::top_resource_offset()); |
839 __ Push(R6); | 828 __ Push(R6); |
840 __ LoadFromOffset(R6, THR, Thread::top_exit_frame_info_offset()); | 829 __ LoadFromOffset(R6, THR, Thread::top_exit_frame_info_offset()); |
841 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); | 830 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); |
842 // kExitLinkSlotFromEntryFp must be kept in sync with the code below. | 831 // kExitLinkSlotFromEntryFp must be kept in sync with the code below. |
843 ASSERT(kExitLinkSlotFromEntryFp == -22); | 832 ASSERT(kExitLinkSlotFromEntryFp == -22); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 | 865 |
877 // Call the Dart code entrypoint. | 866 // Call the Dart code entrypoint. |
878 __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle)); | 867 __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle)); |
879 __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 868 __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
880 __ blr(R0); // R4 is the arguments descriptor array. | 869 __ blr(R0); // R4 is the arguments descriptor array. |
881 __ Comment("InvokeDartCodeStub return"); | 870 __ Comment("InvokeDartCodeStub return"); |
882 | 871 |
883 // Get rid of arguments pushed on the stack. | 872 // Get rid of arguments pushed on the stack. |
884 __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize); | 873 __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize); |
885 | 874 |
886 __ LoadIsolate(R28); | |
887 | |
888 // Restore the saved top exit frame info and top resource back into the | 875 // Restore the saved top exit frame info and top resource back into the |
889 // Isolate structure. Uses R6 as a temporary register for this. | 876 // Isolate structure. Uses R6 as a temporary register for this. |
890 __ Pop(R6); | 877 __ Pop(R6); |
891 __ StoreToOffset(R6, THR, Thread::top_exit_frame_info_offset()); | 878 __ StoreToOffset(R6, THR, Thread::top_exit_frame_info_offset()); |
892 __ Pop(R6); | 879 __ Pop(R6); |
893 __ StoreToOffset(R6, THR, Thread::top_resource_offset()); | 880 __ StoreToOffset(R6, THR, Thread::top_resource_offset()); |
894 | 881 |
895 // Restore the current VMTag from the stack. | 882 // Restore the current VMTag from the stack. |
896 __ Pop(R4); | 883 __ Pop(R4); |
897 __ StoreToOffset(R4, R28, Isolate::vm_tag_offset()); | 884 __ StoreToOffset(R4, THR, Thread::vm_tag_offset()); |
898 | 885 |
899 // Restore the bottom 64-bits of callee-saved V registers. | 886 // Restore the bottom 64-bits of callee-saved V registers. |
900 for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) { | 887 for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) { |
901 const VRegister r = static_cast<VRegister>(i); | 888 const VRegister r = static_cast<VRegister>(i); |
902 __ PopDouble(r); | 889 __ PopDouble(r); |
903 } | 890 } |
904 | 891 |
905 // Restore C++ ABI callee-saved registers. | 892 // Restore C++ ABI callee-saved registers. |
906 for (int i = kAbiLastPreservedCpuReg; i >= kAbiFirstPreservedCpuReg; i--) { | 893 for (int i = kAbiLastPreservedCpuReg; i >= kAbiFirstPreservedCpuReg; i--) { |
907 Register r = static_cast<Register>(i); | 894 Register r = static_cast<Register>(i); |
(...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1966 // Does not return. | 1953 // Does not return. |
1967 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) { | 1954 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) { |
1968 ASSERT(kExceptionObjectReg == R0); | 1955 ASSERT(kExceptionObjectReg == R0); |
1969 ASSERT(kStackTraceObjectReg == R1); | 1956 ASSERT(kStackTraceObjectReg == R1); |
1970 __ mov(LR, R0); // Program counter. | 1957 __ mov(LR, R0); // Program counter. |
1971 __ mov(SP, R1); // Stack pointer. | 1958 __ mov(SP, R1); // Stack pointer. |
1972 __ mov(FP, R2); // Frame_pointer. | 1959 __ mov(FP, R2); // Frame_pointer. |
1973 __ mov(R0, R3); // Exception object. | 1960 __ mov(R0, R3); // Exception object. |
1974 __ mov(R1, R4); // StackTrace object. | 1961 __ mov(R1, R4); // StackTrace object. |
1975 __ mov(THR, R5); | 1962 __ mov(THR, R5); |
1976 __ LoadIsolate(R5); | |
1977 // Set the tag. | 1963 // Set the tag. |
1978 __ LoadImmediate(R2, VMTag::kDartTagId); | 1964 __ LoadImmediate(R2, VMTag::kDartTagId); |
1979 __ StoreToOffset(R2, R5, Isolate::vm_tag_offset()); | 1965 __ StoreToOffset(R2, THR, Thread::vm_tag_offset()); |
1980 // Clear top exit frame. | 1966 // Clear top exit frame. |
1981 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); | 1967 __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset()); |
1982 __ ret(); // Jump to the exception handler code. | 1968 __ ret(); // Jump to the exception handler code. |
1983 } | 1969 } |
1984 | 1970 |
1985 | 1971 |
1986 // Calls to the runtime to optimize the given function. | 1972 // Calls to the runtime to optimize the given function. |
1987 // R6: function to be re-optimized. | 1973 // R6: function to be re-optimized. |
1988 // R4: argument descriptor (preserved). | 1974 // R4: argument descriptor (preserved). |
1989 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) { | 1975 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2159 // Result: | 2145 // Result: |
2160 // R1: entry point. | 2146 // R1: entry point. |
2161 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2147 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { |
2162 EmitMegamorphicLookup(assembler, R0, R1, R1); | 2148 EmitMegamorphicLookup(assembler, R0, R1, R1); |
2163 __ ret(); | 2149 __ ret(); |
2164 } | 2150 } |
2165 | 2151 |
2166 } // namespace dart | 2152 } // namespace dart |
2167 | 2153 |
2168 #endif // defined TARGET_ARCH_ARM64 | 2154 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |