| 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_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| 11 #include "vm/flow_graph_compiler.h" | 11 #include "vm/flow_graph_compiler.h" |
| 12 #include "vm/heap.h" | 12 #include "vm/heap.h" |
| 13 #include "vm/instructions.h" | 13 #include "vm/instructions.h" |
| 14 #include "vm/object_store.h" | 14 #include "vm/object_store.h" |
| 15 #include "vm/resolver.h" | 15 #include "vm/resolver.h" |
| 16 #include "vm/scavenger.h" | 16 #include "vm/scavenger.h" |
| 17 #include "vm/stack_frame.h" | 17 #include "vm/stack_frame.h" |
| 18 #include "vm/stub_code.h" | 18 #include "vm/stub_code.h" |
| 19 | 19 #include "vm/tags.h" |
| 20 | 20 |
| 21 #define __ assembler-> | 21 #define __ assembler-> |
| 22 | 22 |
| 23 namespace dart { | 23 namespace dart { |
| 24 | 24 |
| 25 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects."); | 25 DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects."); |
| 26 DEFINE_FLAG(bool, use_slow_path, false, | 26 DEFINE_FLAG(bool, use_slow_path, false, |
| 27 "Set to true for debugging & verifying the slow paths."); | 27 "Set to true for debugging & verifying the slow paths."); |
| 28 DECLARE_FLAG(bool, trace_optimized_ic_calls); | 28 DECLARE_FLAG(bool, trace_optimized_ic_calls); |
| 29 | 29 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 51 // Save exit frame information to enable stack walking as we are about | 51 // Save exit frame information to enable stack walking as we are about |
| 52 // to transition to Dart VM C++ code. | 52 // to transition to Dart VM C++ code. |
| 53 __ movq(Address(RAX, Isolate::top_exit_frame_info_offset()), RSP); | 53 __ movq(Address(RAX, Isolate::top_exit_frame_info_offset()), RSP); |
| 54 | 54 |
| 55 // Save current Context pointer into Isolate structure. | 55 // Save current Context pointer into Isolate structure. |
| 56 __ movq(Address(RAX, Isolate::top_context_offset()), CTX); | 56 __ movq(Address(RAX, Isolate::top_context_offset()), CTX); |
| 57 | 57 |
| 58 // Cache Isolate pointer into CTX while executing runtime code. | 58 // Cache Isolate pointer into CTX while executing runtime code. |
| 59 __ movq(CTX, RAX); | 59 __ movq(CTX, RAX); |
| 60 | 60 |
| 61 #if defined(DEBUG) |
| 62 { Label ok; |
| 63 // Check that we are always entering from Dart code. |
| 64 __ movq(RAX, Immediate(VMTag::kScriptTagId)); |
| 65 __ cmpq(RAX, Address(CTX, Isolate::vm_tag_offset())); |
| 66 __ j(EQUAL, &ok, Assembler::kNearJump); |
| 67 __ Stop("Not coming from Dart code."); |
| 68 __ Bind(&ok); |
| 69 } |
| 70 #endif |
| 71 |
| 72 // Mark that the isolate is executing VM code. |
| 73 __ movq(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId)); |
| 74 |
| 61 // Reserve space for arguments and align frame before entering C++ world. | 75 // Reserve space for arguments and align frame before entering C++ world. |
| 62 __ subq(RSP, Immediate(sizeof(NativeArguments))); | 76 __ subq(RSP, Immediate(sizeof(NativeArguments))); |
| 63 if (OS::ActivationFrameAlignment() > 1) { | 77 if (OS::ActivationFrameAlignment() > 1) { |
| 64 __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1))); | 78 __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1))); |
| 65 } | 79 } |
| 66 | 80 |
| 67 // Pass NativeArguments structure by value and call runtime. | 81 // Pass NativeArguments structure by value and call runtime. |
| 68 __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. | 82 __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. |
| 69 // There are no runtime calls to closures, so we do not need to set the tag | 83 // There are no runtime calls to closures, so we do not need to set the tag |
| 70 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. | 84 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. |
| 71 __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. | 85 __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. |
| 72 __ leaq(RAX, Address(RBP, R10, TIMES_8, 1 * kWordSize)); // Compute argv. | 86 __ leaq(RAX, Address(RBP, R10, TIMES_8, 1 * kWordSize)); // Compute argv. |
| 73 __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. | 87 __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. |
| 74 __ addq(RAX, Immediate(1 * kWordSize)); // Retval is next to 1st argument. | 88 __ addq(RAX, Immediate(1 * kWordSize)); // Retval is next to 1st argument. |
| 75 __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments. | 89 __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments. |
| 76 __ call(RBX); | 90 __ call(RBX); |
| 77 | 91 |
| 92 // Mark that the isolate is executing Dart code. |
| 93 __ movq(Address(CTX, Isolate::vm_tag_offset()), |
| 94 Immediate(VMTag::kScriptTagId)); |
| 95 |
| 78 // Reset exit frame information in Isolate structure. | 96 // Reset exit frame information in Isolate structure. |
| 79 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); | 97 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
| 80 | 98 |
| 81 // Load Context pointer from Isolate structure into RBX. | 99 // Load Context pointer from Isolate structure into RBX. |
| 82 __ movq(RBX, Address(CTX, Isolate::top_context_offset())); | 100 __ movq(RBX, Address(CTX, Isolate::top_context_offset())); |
| 83 | 101 |
| 84 // Reset Context pointer in Isolate structure. | 102 // Reset Context pointer in Isolate structure. |
| 85 __ LoadObject(R12, Object::null_object(), PP); | 103 __ LoadObject(R12, Object::null_object(), PP); |
| 86 __ movq(Address(CTX, Isolate::top_context_offset()), R12); | 104 __ movq(Address(CTX, Isolate::top_context_offset()), R12); |
| 87 | 105 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 | 150 |
| 133 __ EnterFrame(0); | 151 __ EnterFrame(0); |
| 134 | 152 |
| 135 // Load current Isolate pointer from Context structure into R8. | 153 // Load current Isolate pointer from Context structure into R8. |
| 136 __ movq(R8, FieldAddress(CTX, Context::isolate_offset())); | 154 __ movq(R8, FieldAddress(CTX, Context::isolate_offset())); |
| 137 | 155 |
| 138 // Save exit frame information to enable stack walking as we are about | 156 // Save exit frame information to enable stack walking as we are about |
| 139 // to transition to native code. | 157 // to transition to native code. |
| 140 __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP); | 158 __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP); |
| 141 | 159 |
| 142 // Save current Context pointer into Isolate structure. | 160 // Save current Context pointer into Isolate structure. |
| 143 __ movq(Address(R8, Isolate::top_context_offset()), CTX); | 161 __ movq(Address(R8, Isolate::top_context_offset()), CTX); |
| 144 | 162 |
| 145 // Cache Isolate pointer into CTX while executing native code. | 163 // Cache Isolate pointer into CTX while executing native code. |
| 146 __ movq(CTX, R8); | 164 __ movq(CTX, R8); |
| 147 | 165 |
| 166 #if defined(DEBUG) |
| 167 { Label ok; |
| 168 // Check that we are always entering from Dart code. |
| 169 __ movq(R8, Immediate(VMTag::kScriptTagId)); |
| 170 __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset())); |
| 171 __ j(EQUAL, &ok, Assembler::kNearJump); |
| 172 __ Stop("Not coming from Dart code."); |
| 173 __ Bind(&ok); |
| 174 } |
| 175 #endif |
| 176 |
| 177 // Mark that the isolate is executing Native code. |
| 178 __ movq(Address(CTX, Isolate::vm_tag_offset()), |
| 179 Immediate(VMTag::kRuntimeNativeTagId)); |
| 180 |
| 148 // Reserve space for the native arguments structure passed on the stack (the | 181 // Reserve space for the native arguments structure passed on the stack (the |
| 149 // outgoing pointer parameter to the native arguments structure is passed in | 182 // outgoing pointer parameter to the native arguments structure is passed in |
| 150 // RDI) and align frame before entering the C++ world. | 183 // RDI) and align frame before entering the C++ world. |
| 151 __ subq(RSP, Immediate(sizeof(NativeArguments))); | 184 __ subq(RSP, Immediate(sizeof(NativeArguments))); |
| 152 if (OS::ActivationFrameAlignment() > 1) { | 185 if (OS::ActivationFrameAlignment() > 1) { |
| 153 __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1))); | 186 __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1))); |
| 154 } | 187 } |
| 155 | 188 |
| 156 // Pass NativeArguments structure by value and call native function. | 189 // Pass NativeArguments structure by value and call native function. |
| 157 __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. | 190 __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. |
| 158 __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. | 191 __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. |
| 159 __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. | 192 __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. |
| 160 __ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr. | 193 __ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr. |
| 161 __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments. | 194 __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments. |
| 162 __ movq(RDI, RSP); // Pass the pointer to the NativeArguments. | 195 __ movq(RDI, RSP); // Pass the pointer to the NativeArguments. |
| 163 | 196 |
| 164 // Call native function (setsup scope if not leaf function). | 197 // Call native function (setsup scope if not leaf function). |
| 165 Label leaf_call; | 198 Label leaf_call; |
| 166 Label done; | 199 Label done; |
| 167 __ testq(R10, Immediate(NativeArguments::AutoSetupScopeMask())); | 200 __ testq(R10, Immediate(NativeArguments::AutoSetupScopeMask())); |
| 168 __ j(ZERO, &leaf_call); | 201 __ j(ZERO, &leaf_call); |
| 169 __ movq(RSI, RBX); // Pass pointer to function entrypoint. | 202 __ movq(RSI, RBX); // Pass pointer to function entrypoint. |
| 170 __ call(&NativeEntry::NativeCallWrapperLabel()); | 203 __ call(&NativeEntry::NativeCallWrapperLabel()); |
| 171 __ jmp(&done); | 204 __ jmp(&done); |
| 172 __ Bind(&leaf_call); | 205 __ Bind(&leaf_call); |
| 173 __ call(RBX); | 206 __ call(RBX); |
| 174 __ Bind(&done); | 207 __ Bind(&done); |
| 175 | 208 |
| 209 // Mark that the isolate is executing Dart code. |
| 210 __ movq(Address(CTX, Isolate::vm_tag_offset()), |
| 211 Immediate(VMTag::kScriptTagId)); |
| 212 |
| 176 // Reset exit frame information in Isolate structure. | 213 // Reset exit frame information in Isolate structure. |
| 177 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); | 214 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
| 178 | 215 |
| 179 // Load Context pointer from Isolate structure into R8. | 216 // Load Context pointer from Isolate structure into R8. |
| 180 __ movq(R8, Address(CTX, Isolate::top_context_offset())); | 217 __ movq(R8, Address(CTX, Isolate::top_context_offset())); |
| 181 | 218 |
| 182 // Reset Context pointer in Isolate structure. | 219 // Reset Context pointer in Isolate structure. |
| 183 __ LoadObject(R12, Object::null_object(), PP); | 220 __ LoadObject(R12, Object::null_object(), PP); |
| 184 __ movq(Address(CTX, Isolate::top_context_offset()), R12); | 221 __ movq(Address(CTX, Isolate::top_context_offset()), R12); |
| 185 | 222 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 216 // Save exit frame information to enable stack walking as we are about | 253 // Save exit frame information to enable stack walking as we are about |
| 217 // to transition to native code. | 254 // to transition to native code. |
| 218 __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP); | 255 __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP); |
| 219 | 256 |
| 220 // Save current Context pointer into Isolate structure. | 257 // Save current Context pointer into Isolate structure. |
| 221 __ movq(Address(R8, Isolate::top_context_offset()), CTX); | 258 __ movq(Address(R8, Isolate::top_context_offset()), CTX); |
| 222 | 259 |
| 223 // Cache Isolate pointer into CTX while executing native code. | 260 // Cache Isolate pointer into CTX while executing native code. |
| 224 __ movq(CTX, R8); | 261 __ movq(CTX, R8); |
| 225 | 262 |
| 263 #if defined(DEBUG) |
| 264 { Label ok; |
| 265 // Check that we are always entering from Dart code. |
| 266 __ movq(R8, Immediate(VMTag::kScriptTagId)); |
| 267 __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset())); |
| 268 __ j(EQUAL, &ok, Assembler::kNearJump); |
| 269 __ Stop("Not coming from Dart code."); |
| 270 __ Bind(&ok); |
| 271 } |
| 272 #endif |
| 273 |
| 274 // Mark that the isolate is executing Native code. |
| 275 __ movq(Address(CTX, Isolate::vm_tag_offset()), |
| 276 Immediate(VMTag::kRuntimeNativeTagId)); |
| 277 |
| 226 // Reserve space for the native arguments structure passed on the stack (the | 278 // Reserve space for the native arguments structure passed on the stack (the |
| 227 // outgoing pointer parameter to the native arguments structure is passed in | 279 // outgoing pointer parameter to the native arguments structure is passed in |
| 228 // RDI) and align frame before entering the C++ world. | 280 // RDI) and align frame before entering the C++ world. |
| 229 __ subq(RSP, Immediate(sizeof(NativeArguments))); | 281 __ subq(RSP, Immediate(sizeof(NativeArguments))); |
| 230 if (OS::ActivationFrameAlignment() > 1) { | 282 if (OS::ActivationFrameAlignment() > 1) { |
| 231 __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1))); | 283 __ andq(RSP, Immediate(~(OS::ActivationFrameAlignment() - 1))); |
| 232 } | 284 } |
| 233 | 285 |
| 234 // Pass NativeArguments structure by value and call native function. | 286 // Pass NativeArguments structure by value and call native function. |
| 235 __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. | 287 __ movq(Address(RSP, isolate_offset), CTX); // Set isolate in NativeArgs. |
| 236 __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. | 288 __ movq(Address(RSP, argc_tag_offset), R10); // Set argc in NativeArguments. |
| 237 __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. | 289 __ movq(Address(RSP, argv_offset), RAX); // Set argv in NativeArguments. |
| 238 __ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr. | 290 __ leaq(RAX, Address(RBP, 2 * kWordSize)); // Compute return value addr. |
| 239 __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments. | 291 __ movq(Address(RSP, retval_offset), RAX); // Set retval in NativeArguments. |
| 240 __ movq(RDI, RSP); // Pass the pointer to the NativeArguments. | 292 __ movq(RDI, RSP); // Pass the pointer to the NativeArguments. |
| 241 __ call(RBX); | 293 __ call(RBX); |
| 242 | 294 |
| 295 // Mark that the isolate is executing Dart code. |
| 296 __ movq(Address(CTX, Isolate::vm_tag_offset()), |
| 297 Immediate(VMTag::kScriptTagId)); |
| 298 |
| 243 // Reset exit frame information in Isolate structure. | 299 // Reset exit frame information in Isolate structure. |
| 244 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); | 300 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
| 245 | 301 |
| 246 // Load Context pointer from Isolate structure into R8. | 302 // Load Context pointer from Isolate structure into R8. |
| 247 __ movq(R8, Address(CTX, Isolate::top_context_offset())); | 303 __ movq(R8, Address(CTX, Isolate::top_context_offset())); |
| 248 | 304 |
| 249 // Reset Context pointer in Isolate structure. | 305 // Reset Context pointer in Isolate structure. |
| 250 __ LoadObject(R12, Object::null_object(), PP); | 306 __ LoadObject(R12, Object::null_object(), PP); |
| 251 __ movq(Address(CTX, Isolate::top_context_offset()), R12); | 307 __ movq(Address(CTX, Isolate::top_context_offset()), R12); |
| 252 | 308 |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 // available in generated code and calls to Isolate::Current() need not be | 868 // available in generated code and calls to Isolate::Current() need not be |
| 813 // done. The assumption is that this register will never be clobbered by | 869 // done. The assumption is that this register will never be clobbered by |
| 814 // compiled or runtime stub code. | 870 // compiled or runtime stub code. |
| 815 | 871 |
| 816 // Cache the new Context pointer into CTX while executing Dart code. | 872 // Cache the new Context pointer into CTX while executing Dart code. |
| 817 __ movq(CTX, Address(RCX, VMHandles::kOffsetOfRawPtrInHandle)); | 873 __ movq(CTX, Address(RCX, VMHandles::kOffsetOfRawPtrInHandle)); |
| 818 | 874 |
| 819 // Load Isolate pointer from Context structure into R8. | 875 // Load Isolate pointer from Context structure into R8. |
| 820 __ movq(R8, FieldAddress(CTX, Context::isolate_offset())); | 876 __ movq(R8, FieldAddress(CTX, Context::isolate_offset())); |
| 821 | 877 |
| 878 // Save the current VMTag on the stack. |
| 879 ASSERT(kSavedVMTagSlotFromEntryFp == -8); |
| 880 __ movq(RAX, Address(R8, Isolate::vm_tag_offset())); |
| 881 __ pushq(RAX); |
| 882 |
| 883 // Mark that the isolate is executing Dart code. |
| 884 __ movq(Address(R8, Isolate::vm_tag_offset()), |
| 885 Immediate(VMTag::kScriptTagId)); |
| 886 |
| 822 // Save the top exit frame info. Use RAX as a temporary register. | 887 // Save the top exit frame info. Use RAX as a temporary register. |
| 823 // StackFrameIterator reads the top exit frame info saved in this frame. | 888 // StackFrameIterator reads the top exit frame info saved in this frame. |
| 824 // The constant kExitLinkSlotFromEntryFp must be kept in sync with the | 889 // The constant kExitLinkSlotFromEntryFp must be kept in sync with the |
| 825 // code below. | 890 // code below. |
| 826 ASSERT(kExitLinkSlotFromEntryFp == -8); | 891 ASSERT(kExitLinkSlotFromEntryFp == -9); |
| 827 __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset())); | 892 __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset())); |
| 828 __ pushq(RAX); | 893 __ pushq(RAX); |
| 829 __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0)); | 894 __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0)); |
| 830 | 895 |
| 831 // Save the old Context pointer. Use RAX as a temporary register. | 896 // Save the old Context pointer. Use RAX as a temporary register. |
| 832 // Note that VisitObjectPointers will find this saved Context pointer during | 897 // Note that VisitObjectPointers will find this saved Context pointer during |
| 833 // GC marking, since it traverses any information between SP and | 898 // GC marking, since it traverses any information between SP and |
| 834 // FP - kExitLinkSlotFromEntryFp * kWordSize. | 899 // FP - kExitLinkSlotFromEntryFp * kWordSize. |
| 835 // EntryFrame::SavedContext reads the context saved in this frame. | 900 // EntryFrame::SavedContext reads the context saved in this frame. |
| 836 // The constant kSavedContextSlotFromEntryFp must be kept in sync with | 901 // The constant kSavedContextSlotFromEntryFp must be kept in sync with |
| 837 // the code below. | 902 // the code below. |
| 838 ASSERT(kSavedContextSlotFromEntryFp == -9); | 903 ASSERT(kSavedContextSlotFromEntryFp == -10); |
| 839 __ movq(RAX, Address(R8, Isolate::top_context_offset())); | 904 __ movq(RAX, Address(R8, Isolate::top_context_offset())); |
| 840 __ pushq(RAX); | 905 __ pushq(RAX); |
| 841 | 906 |
| 842 // Load arguments descriptor array into R10, which is passed to Dart code. | 907 // Load arguments descriptor array into R10, which is passed to Dart code. |
| 843 __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle)); | 908 __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle)); |
| 844 | 909 |
| 845 // Load number of arguments into RBX. | 910 // Load number of arguments into RBX. |
| 846 __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset())); | 911 __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset())); |
| 847 __ SmiUntag(RBX); | 912 __ SmiUntag(RBX); |
| 848 | 913 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 // Restore the saved Context pointer into the Isolate structure. | 950 // Restore the saved Context pointer into the Isolate structure. |
| 886 // Uses RCX as a temporary register for this. | 951 // Uses RCX as a temporary register for this. |
| 887 __ popq(RCX); | 952 __ popq(RCX); |
| 888 __ movq(Address(CTX, Isolate::top_context_offset()), RCX); | 953 __ movq(Address(CTX, Isolate::top_context_offset()), RCX); |
| 889 | 954 |
| 890 // Restore the saved top exit frame info back into the Isolate structure. | 955 // Restore the saved top exit frame info back into the Isolate structure. |
| 891 // Uses RDX as a temporary register for this. | 956 // Uses RDX as a temporary register for this. |
| 892 __ popq(RDX); | 957 __ popq(RDX); |
| 893 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX); | 958 __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX); |
| 894 | 959 |
| 960 // Restore the current VMTag from the stack. |
| 961 __ popq(RDX); |
| 962 __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX); |
| 963 |
| 895 // Restore C++ ABI callee-saved registers. | 964 // Restore C++ ABI callee-saved registers. |
| 896 __ popq(R15); | 965 __ popq(R15); |
| 897 __ popq(R14); | 966 __ popq(R14); |
| 898 __ popq(R13); | 967 __ popq(R13); |
| 899 __ popq(R12); | 968 __ popq(R12); |
| 900 __ popq(RBX); | 969 __ popq(RBX); |
| 901 | 970 |
| 902 // Restore the frame pointer. | 971 // Restore the frame pointer. |
| 903 __ LeaveFrame(); | 972 __ LeaveFrame(); |
| 904 | 973 |
| (...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1940 | 2009 |
| 1941 __ movq(left, Address(RSP, 2 * kWordSize)); | 2010 __ movq(left, Address(RSP, 2 * kWordSize)); |
| 1942 __ movq(right, Address(RSP, 1 * kWordSize)); | 2011 __ movq(right, Address(RSP, 1 * kWordSize)); |
| 1943 GenerateIdenticalWithNumberCheckStub(assembler, left, right); | 2012 GenerateIdenticalWithNumberCheckStub(assembler, left, right); |
| 1944 __ ret(); | 2013 __ ret(); |
| 1945 } | 2014 } |
| 1946 | 2015 |
| 1947 } // namespace dart | 2016 } // namespace dart |
| 1948 | 2017 |
| 1949 #endif // defined TARGET_ARCH_X64 | 2018 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |