| 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 |