| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
| 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 << S2)) != 0); | |
| 50 __ LoadIsolate(S2); | |
| 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 __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset())); | 51 __ sw(FP, Address(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 __ lw(T0, Address(S2, Isolate::vm_tag_offset())); | 56 __ lw(T0, Assembler::VMTagAddress()); |
| 60 __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok); | 57 __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok); |
| 61 __ Stop("Not coming from Dart code."); | 58 __ Stop("Not coming from Dart code."); |
| 62 __ Bind(&ok); | 59 __ Bind(&ok); |
| 63 } | 60 } |
| 64 #endif | 61 #endif |
| 65 | 62 |
| 66 // Mark that the isolate is executing VM code. | 63 // Mark that the thread is executing VM code. |
| 67 __ sw(S5, Address(S2, Isolate::vm_tag_offset())); | 64 __ sw(S5, Assembler::VMTagAddress()); |
| 68 | 65 |
| 69 // Reserve space for arguments and align frame before entering C++ world. | 66 // Reserve space for arguments and align frame before entering C++ world. |
| 70 // NativeArguments are passed in registers. | 67 // NativeArguments are passed in registers. |
| 71 ASSERT(sizeof(NativeArguments) == 4 * kWordSize); | 68 ASSERT(sizeof(NativeArguments) == 4 * kWordSize); |
| 72 __ ReserveAlignedFrameSpace(4 * kWordSize); // Reserve space for arguments. | 69 __ ReserveAlignedFrameSpace(4 * kWordSize); // Reserve space for arguments. |
| 73 | 70 |
| 74 // Pass NativeArguments structure by value and call runtime. | 71 // Pass NativeArguments structure by value and call runtime. |
| 75 // Registers A0, A1, A2, and A3 are used. | 72 // Registers A0, A1, A2, and A3 are used. |
| 76 | 73 |
| 77 ASSERT(thread_offset == 0 * kWordSize); | 74 ASSERT(thread_offset == 0 * kWordSize); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 94 // We defensively always jalr through T9 because it is sometimes required by | 91 // We defensively always jalr through T9 because it is sometimes required by |
| 95 // the MIPS ABI. | 92 // the MIPS ABI. |
| 96 __ mov(T9, S5); | 93 __ mov(T9, S5); |
| 97 __ jalr(T9); | 94 __ jalr(T9); |
| 98 | 95 |
| 99 ASSERT(retval_offset == 3 * kWordSize); | 96 ASSERT(retval_offset == 3 * kWordSize); |
| 100 // Retval is next to 1st argument. | 97 // Retval is next to 1st argument. |
| 101 __ delay_slot()->addiu(A3, A2, Immediate(kWordSize)); | 98 __ delay_slot()->addiu(A3, A2, Immediate(kWordSize)); |
| 102 __ Comment("CallToRuntimeStub return"); | 99 __ Comment("CallToRuntimeStub return"); |
| 103 | 100 |
| 104 // Mark that the isolate is executing Dart code. | 101 // Mark that the thread is executing Dart code. |
| 105 __ LoadImmediate(A2, VMTag::kDartTagId); | 102 __ LoadImmediate(A2, VMTag::kDartTagId); |
| 106 __ sw(A2, Address(S2, Isolate::vm_tag_offset())); | 103 __ sw(A2, Assembler::VMTagAddress()); |
| 107 | 104 |
| 108 // Reset exit frame information in Isolate structure. | 105 // Reset exit frame information in Isolate structure. |
| 109 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); | 106 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); |
| 110 | 107 |
| 111 __ LeaveStubFrameAndReturn(); | 108 __ LeaveStubFrameAndReturn(); |
| 112 } | 109 } |
| 113 | 110 |
| 114 | 111 |
| 115 // Print the stop message. | 112 // Print the stop message. |
| 116 DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) { | 113 DEFINE_LEAF_RUNTIME_ENTRY(void, PrintStopMessage, 1, const char* message) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 140 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { | 137 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { |
| 141 const intptr_t thread_offset = NativeArguments::thread_offset(); | 138 const intptr_t thread_offset = NativeArguments::thread_offset(); |
| 142 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 139 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
| 143 const intptr_t argv_offset = NativeArguments::argv_offset(); | 140 const intptr_t argv_offset = NativeArguments::argv_offset(); |
| 144 const intptr_t retval_offset = NativeArguments::retval_offset(); | 141 const intptr_t retval_offset = NativeArguments::retval_offset(); |
| 145 | 142 |
| 146 __ SetPrologueOffset(); | 143 __ SetPrologueOffset(); |
| 147 __ Comment("CallNativeCFunctionStub"); | 144 __ Comment("CallNativeCFunctionStub"); |
| 148 __ EnterStubFrame(); | 145 __ EnterStubFrame(); |
| 149 | 146 |
| 150 COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S2)) != 0); | |
| 151 __ LoadIsolate(S2); | |
| 152 | |
| 153 // Save exit frame information to enable stack walking as we are about | 147 // Save exit frame information to enable stack walking as we are about |
| 154 // to transition to native code. | 148 // to transition to native code. |
| 155 __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset())); | 149 __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset())); |
| 156 | 150 |
| 157 #if defined(DEBUG) | 151 #if defined(DEBUG) |
| 158 { Label ok; | 152 { Label ok; |
| 159 // Check that we are always entering from Dart code. | 153 // Check that we are always entering from Dart code. |
| 160 __ lw(T0, Address(S2, Isolate::vm_tag_offset())); | 154 __ lw(T0, Assembler::VMTagAddress()); |
| 161 __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok); | 155 __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok); |
| 162 __ Stop("Not coming from Dart code."); | 156 __ Stop("Not coming from Dart code."); |
| 163 __ Bind(&ok); | 157 __ Bind(&ok); |
| 164 } | 158 } |
| 165 #endif | 159 #endif |
| 166 | 160 |
| 167 // Mark that the isolate is executing Native code. | 161 // Mark that the thread is executing native code. |
| 168 __ sw(T5, Address(S2, Isolate::vm_tag_offset())); | 162 __ sw(T5, Assembler::VMTagAddress()); |
| 169 | 163 |
| 170 // Initialize NativeArguments structure and call native function. | 164 // Initialize NativeArguments structure and call native function. |
| 171 // Registers A0, A1, A2, and A3 are used. | 165 // Registers A0, A1, A2, and A3 are used. |
| 172 | 166 |
| 173 ASSERT(thread_offset == 0 * kWordSize); | 167 ASSERT(thread_offset == 0 * kWordSize); |
| 174 // Set thread in NativeArgs. | 168 // Set thread in NativeArgs. |
| 175 __ mov(A0, THR); | 169 __ mov(A0, THR); |
| 176 | 170 |
| 177 // There are no native calls to closures, so we do not need to set the tag | 171 // There are no native calls to closures, so we do not need to set the tag |
| 178 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. | 172 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 198 | 192 |
| 199 | 193 |
| 200 __ mov(A1, T5); // Pass the function entrypoint. | 194 __ mov(A1, T5); // Pass the function entrypoint. |
| 201 __ ReserveAlignedFrameSpace(2 * kWordSize); // Just passing A0, A1. | 195 __ ReserveAlignedFrameSpace(2 * kWordSize); // Just passing A0, A1. |
| 202 | 196 |
| 203 // Call native wrapper function or redirection via simulator. | 197 // Call native wrapper function or redirection via simulator. |
| 204 __ lw(T9, Address(THR, Thread::native_call_wrapper_entry_point_offset())); | 198 __ lw(T9, Address(THR, Thread::native_call_wrapper_entry_point_offset())); |
| 205 __ jalr(T9); | 199 __ jalr(T9); |
| 206 __ Comment("CallNativeCFunctionStub return"); | 200 __ Comment("CallNativeCFunctionStub return"); |
| 207 | 201 |
| 208 // Mark that the isolate is executing Dart code. | 202 // Mark that the thread is executing Dart code. |
| 209 __ LoadImmediate(A2, VMTag::kDartTagId); | 203 __ LoadImmediate(A2, VMTag::kDartTagId); |
| 210 __ sw(A2, Address(S2, Isolate::vm_tag_offset())); | 204 __ sw(A2, Assembler::VMTagAddress()); |
| 211 | 205 |
| 212 // Reset exit frame information in Isolate structure. | 206 // Reset exit frame information in Isolate structure. |
| 213 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); | 207 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); |
| 214 | 208 |
| 215 __ LeaveStubFrameAndReturn(); | 209 __ LeaveStubFrameAndReturn(); |
| 216 } | 210 } |
| 217 | 211 |
| 218 | 212 |
| 219 // Input parameters: | 213 // Input parameters: |
| 220 // RA : return address. | 214 // RA : return address. |
| 221 // SP : address of return value. | 215 // SP : address of return value. |
| 222 // T5 : address of the native function to call. | 216 // T5 : address of the native function to call. |
| 223 // A2 : address of first argument in argument array. | 217 // A2 : address of first argument in argument array. |
| 224 // A1 : argc_tag including number of arguments and function kind. | 218 // A1 : argc_tag including number of arguments and function kind. |
| 225 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { | 219 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { |
| 226 const intptr_t thread_offset = NativeArguments::thread_offset(); | 220 const intptr_t thread_offset = NativeArguments::thread_offset(); |
| 227 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); | 221 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); |
| 228 const intptr_t argv_offset = NativeArguments::argv_offset(); | 222 const intptr_t argv_offset = NativeArguments::argv_offset(); |
| 229 const intptr_t retval_offset = NativeArguments::retval_offset(); | 223 const intptr_t retval_offset = NativeArguments::retval_offset(); |
| 230 | 224 |
| 231 __ SetPrologueOffset(); | 225 __ SetPrologueOffset(); |
| 232 __ Comment("CallNativeCFunctionStub"); | 226 __ Comment("CallNativeCFunctionStub"); |
| 233 __ EnterStubFrame(); | 227 __ EnterStubFrame(); |
| 234 | 228 |
| 235 COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S2)) != 0); | |
| 236 __ LoadIsolate(S2); | |
| 237 | |
| 238 // Save exit frame information to enable stack walking as we are about | 229 // Save exit frame information to enable stack walking as we are about |
| 239 // to transition to native code. | 230 // to transition to native code. |
| 240 __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset())); | 231 __ sw(FP, Address(THR, Thread::top_exit_frame_info_offset())); |
| 241 | 232 |
| 242 #if defined(DEBUG) | 233 #if defined(DEBUG) |
| 243 { Label ok; | 234 { Label ok; |
| 244 // Check that we are always entering from Dart code. | 235 // Check that we are always entering from Dart code. |
| 245 __ lw(T0, Address(S2, Isolate::vm_tag_offset())); | 236 __ lw(T0, Assembler::VMTagAddress()); |
| 246 __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok); | 237 __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok); |
| 247 __ Stop("Not coming from Dart code."); | 238 __ Stop("Not coming from Dart code."); |
| 248 __ Bind(&ok); | 239 __ Bind(&ok); |
| 249 } | 240 } |
| 250 #endif | 241 #endif |
| 251 | 242 |
| 252 // Mark that the isolate is executing Native code. | 243 // Mark that the thread is executing native code. |
| 253 __ sw(T5, Address(S2, Isolate::vm_tag_offset())); | 244 __ sw(T5, Assembler::VMTagAddress()); |
| 254 | 245 |
| 255 // Initialize NativeArguments structure and call native function. | 246 // Initialize NativeArguments structure and call native function. |
| 256 // Registers A0, A1, A2, and A3 are used. | 247 // Registers A0, A1, A2, and A3 are used. |
| 257 | 248 |
| 258 ASSERT(thread_offset == 0 * kWordSize); | 249 ASSERT(thread_offset == 0 * kWordSize); |
| 259 // Set thread in NativeArgs. | 250 // Set thread in NativeArgs. |
| 260 __ mov(A0, THR); | 251 __ mov(A0, THR); |
| 261 | 252 |
| 262 // There are no native calls to closures, so we do not need to set the tag | 253 // There are no native calls to closures, so we do not need to set the tag |
| 263 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. | 254 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 284 __ ReserveAlignedFrameSpace(kWordSize); // Just passing A0. | 275 __ ReserveAlignedFrameSpace(kWordSize); // Just passing A0. |
| 285 | 276 |
| 286 // Call native function or redirection via simulator. | 277 // Call native function or redirection via simulator. |
| 287 | 278 |
| 288 // We defensively always jalr through T9 because it is sometimes required by | 279 // We defensively always jalr through T9 because it is sometimes required by |
| 289 // the MIPS ABI. | 280 // the MIPS ABI. |
| 290 __ mov(T9, T5); | 281 __ mov(T9, T5); |
| 291 __ jalr(T9); | 282 __ jalr(T9); |
| 292 __ Comment("CallNativeCFunctionStub return"); | 283 __ Comment("CallNativeCFunctionStub return"); |
| 293 | 284 |
| 294 // Mark that the isolate is executing Dart code. | 285 // Mark that the thread is executing Dart code. |
| 295 __ LoadImmediate(A2, VMTag::kDartTagId); | 286 __ LoadImmediate(A2, VMTag::kDartTagId); |
| 296 __ sw(A2, Address(S2, Isolate::vm_tag_offset())); | 287 __ sw(A2, Assembler::VMTagAddress()); |
| 297 | 288 |
| 298 // Reset exit frame information in Isolate structure. | 289 // Reset exit frame information in Isolate structure. |
| 299 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); | 290 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); |
| 300 | 291 |
| 301 __ LeaveStubFrameAndReturn(); | 292 __ LeaveStubFrameAndReturn(); |
| 302 } | 293 } |
| 303 | 294 |
| 304 | 295 |
| 305 // Input parameters: | 296 // Input parameters: |
| 306 // S4: arguments descriptor array. | 297 // S4: arguments descriptor array. |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 } | 819 } |
| 829 | 820 |
| 830 // We now load the pool pointer(PP) with a GC safe value as we are about | 821 // We now load the pool pointer(PP) with a GC safe value as we are about |
| 831 // to invoke dart code. | 822 // to invoke dart code. |
| 832 __ LoadImmediate(PP, 0); | 823 __ LoadImmediate(PP, 0); |
| 833 | 824 |
| 834 // Set up THR, which caches the current thread in Dart code. | 825 // Set up THR, which caches the current thread in Dart code. |
| 835 if (THR != A3) { | 826 if (THR != A3) { |
| 836 __ mov(THR, A3); | 827 __ mov(THR, A3); |
| 837 } | 828 } |
| 838 __ LoadIsolate(T2); | |
| 839 | 829 |
| 840 // Save the current VMTag on the stack. | 830 // Save the current VMTag on the stack. |
| 841 __ lw(T1, Address(T2, Isolate::vm_tag_offset())); | 831 __ lw(T1, Assembler::VMTagAddress()); |
| 842 __ sw(T1, Address(SP, 2 * kWordSize)); | 832 __ sw(T1, Address(SP, 2 * kWordSize)); |
| 843 | 833 |
| 844 // Mark that the isolate is executing Dart code. | 834 // Mark that the thread is executing Dart code. |
| 845 __ LoadImmediate(T0, VMTag::kDartTagId); | 835 __ LoadImmediate(T0, VMTag::kDartTagId); |
| 846 __ sw(T0, Address(T2, Isolate::vm_tag_offset())); | 836 __ sw(T0, Assembler::VMTagAddress()); |
| 847 | 837 |
| 848 // Save top resource and top exit frame info. Use T0 as a temporary register. | 838 // Save top resource and top exit frame info. Use T0 as a temporary register. |
| 849 // StackFrameIterator reads the top exit frame info saved in this frame. | 839 // StackFrameIterator reads the top exit frame info saved in this frame. |
| 850 __ lw(T0, Address(THR, Thread::top_resource_offset())); | 840 __ lw(T0, Address(THR, Thread::top_resource_offset())); |
| 851 __ sw(ZR, Address(THR, Thread::top_resource_offset())); | 841 __ sw(ZR, Address(THR, Thread::top_resource_offset())); |
| 852 __ sw(T0, Address(SP, 1 * kWordSize)); | 842 __ sw(T0, Address(SP, 1 * kWordSize)); |
| 853 __ lw(T0, Address(THR, Thread::top_exit_frame_info_offset())); | 843 __ lw(T0, Address(THR, Thread::top_exit_frame_info_offset())); |
| 854 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); | 844 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); |
| 855 // kExitLinkSlotFromEntryFp must be kept in sync with the code below. | 845 // kExitLinkSlotFromEntryFp must be kept in sync with the code below. |
| 856 ASSERT(kExitLinkSlotFromEntryFp == -24); | 846 ASSERT(kExitLinkSlotFromEntryFp == -24); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 // We are calling into Dart code, here, so there is no need to call through | 879 // We are calling into Dart code, here, so there is no need to call through |
| 890 // T9 to match the ABI. | 880 // T9 to match the ABI. |
| 891 __ lw(CODE_REG, Address(A0, VMHandles::kOffsetOfRawPtrInHandle)); | 881 __ lw(CODE_REG, Address(A0, VMHandles::kOffsetOfRawPtrInHandle)); |
| 892 __ lw(A0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 882 __ lw(A0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
| 893 __ jalr(A0); // S4 is the arguments descriptor array. | 883 __ jalr(A0); // S4 is the arguments descriptor array. |
| 894 __ Comment("InvokeDartCodeStub return"); | 884 __ Comment("InvokeDartCodeStub return"); |
| 895 | 885 |
| 896 // Get rid of arguments pushed on the stack. | 886 // Get rid of arguments pushed on the stack. |
| 897 __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize); | 887 __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize); |
| 898 | 888 |
| 899 __ LoadIsolate(S2); | |
| 900 | 889 |
| 901 // Restore the current VMTag from the stack. | 890 // Restore the current VMTag from the stack. |
| 902 __ lw(T1, Address(SP, 2 * kWordSize)); | 891 __ lw(T1, Address(SP, 2 * kWordSize)); |
| 903 __ sw(T1, Address(S2, Isolate::vm_tag_offset())); | 892 __ sw(T1, Assembler::VMTagAddress()); |
| 904 | 893 |
| 905 // Restore the saved top resource and top exit frame info back into the | 894 // Restore the saved top resource and top exit frame info back into the |
| 906 // Isolate structure. Uses T0 as a temporary register for this. | 895 // Isolate structure. Uses T0 as a temporary register for this. |
| 907 __ lw(T0, Address(SP, 1 * kWordSize)); | 896 __ lw(T0, Address(SP, 1 * kWordSize)); |
| 908 __ sw(T0, Address(THR, Thread::top_resource_offset())); | 897 __ sw(T0, Address(THR, Thread::top_resource_offset())); |
| 909 __ lw(T0, Address(SP, 0 * kWordSize)); | 898 __ lw(T0, Address(SP, 0 * kWordSize)); |
| 910 __ sw(T0, Address(THR, Thread::top_exit_frame_info_offset())); | 899 __ sw(T0, Address(THR, Thread::top_exit_frame_info_offset())); |
| 911 | 900 |
| 912 // Restore C++ ABI callee-saved registers. | 901 // Restore C++ ABI callee-saved registers. |
| 913 for (int i = S0; i <= S7; i++) { | 902 for (int i = S0; i <= S7; i++) { |
| (...skipping 1127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 // Does not return. | 2030 // Does not return. |
| 2042 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) { | 2031 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) { |
| 2043 ASSERT(kExceptionObjectReg == V0); | 2032 ASSERT(kExceptionObjectReg == V0); |
| 2044 ASSERT(kStackTraceObjectReg == V1); | 2033 ASSERT(kStackTraceObjectReg == V1); |
| 2045 __ mov(V0, A3); // Exception object. | 2034 __ mov(V0, A3); // Exception object. |
| 2046 // MIPS ABI reserves stack space for all arguments. The StackTrace object is | 2035 // MIPS ABI reserves stack space for all arguments. The StackTrace object is |
| 2047 // the last of five arguments, so it is first pushed on the stack. | 2036 // the last of five arguments, so it is first pushed on the stack. |
| 2048 __ lw(V1, Address(SP, 4 * kWordSize)); // StackTrace object. | 2037 __ lw(V1, Address(SP, 4 * kWordSize)); // StackTrace object. |
| 2049 __ mov(FP, A2); // Frame_pointer. | 2038 __ mov(FP, A2); // Frame_pointer. |
| 2050 __ lw(THR, Address(SP, 5 * kWordSize)); // Thread. | 2039 __ lw(THR, Address(SP, 5 * kWordSize)); // Thread. |
| 2051 __ LoadIsolate(A3); | |
| 2052 // Set tag. | 2040 // Set tag. |
| 2053 __ LoadImmediate(A2, VMTag::kDartTagId); | 2041 __ LoadImmediate(A2, VMTag::kDartTagId); |
| 2054 __ sw(A2, Address(A3, Isolate::vm_tag_offset())); | 2042 __ sw(A2, Assembler::VMTagAddress()); |
| 2055 // Clear top exit frame. | 2043 // Clear top exit frame. |
| 2056 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); | 2044 __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset())); |
| 2057 | 2045 |
| 2058 __ jr(A0); // Jump to the exception handler code. | 2046 __ jr(A0); // Jump to the exception handler code. |
| 2059 __ delay_slot()->mov(SP, A1); // Stack pointer. | 2047 __ delay_slot()->mov(SP, A1); // Stack pointer. |
| 2060 } | 2048 } |
| 2061 | 2049 |
| 2062 | 2050 |
| 2063 // Calls to the runtime to optimize the given function. | 2051 // Calls to the runtime to optimize the given function. |
| 2064 // T0: function to be reoptimized. | 2052 // T0: function to be reoptimized. |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2271 // Result: | 2259 // Result: |
| 2272 // T1: entry point. | 2260 // T1: entry point. |
| 2273 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2261 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { |
| 2274 EmitMegamorphicLookup(assembler, T0, T1, T1); | 2262 EmitMegamorphicLookup(assembler, T0, T1, T1); |
| 2275 __ Ret(); | 2263 __ Ret(); |
| 2276 } | 2264 } |
| 2277 | 2265 |
| 2278 } // namespace dart | 2266 } // namespace dart |
| 2279 | 2267 |
| 2280 #endif // defined TARGET_ARCH_MIPS | 2268 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |