Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: runtime/vm/stub_code_x64.cc

Issue 200693002: Set VMTag from stubs when transitioning between Dart and Native (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698