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

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

Issue 418433002: Profiler tweaks (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 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_arm64.cc ('k') | runtime/vm/stub_code_mips.cc » ('j') | 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_IA32) 6 #if defined(TARGET_ARCH_IA32)
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"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 // Save current Context pointer into Isolate structure. 70 // Save current Context pointer into Isolate structure.
71 __ movl(Address(EAX, Isolate::top_context_offset()), CTX); 71 __ movl(Address(EAX, Isolate::top_context_offset()), CTX);
72 72
73 // Cache Isolate pointer into CTX while executing runtime code. 73 // Cache Isolate pointer into CTX while executing runtime code.
74 __ movl(CTX, EAX); 74 __ movl(CTX, EAX);
75 75
76 #if defined(DEBUG) 76 #if defined(DEBUG)
77 { Label ok; 77 { Label ok;
78 // Check that we are always entering from Dart code. 78 // Check that we are always entering from Dart code.
79 __ movl(EAX, Address(CTX, Isolate::vm_tag_offset())); 79 __ movl(EAX, Address(CTX, Isolate::vm_tag_offset()));
80 __ cmpl(EAX, Immediate(VMTag::kScriptTagId)); 80 __ cmpl(EAX, Immediate(VMTag::kDartTagId));
81 __ j(EQUAL, &ok, Assembler::kNearJump); 81 __ j(EQUAL, &ok, Assembler::kNearJump);
82 __ Stop("Not coming from Dart code."); 82 __ Stop("Not coming from Dart code.");
83 __ Bind(&ok); 83 __ Bind(&ok);
84 } 84 }
85 #endif 85 #endif
86 86
87 // Mark that the isolate is executing VM code. 87 // Mark that the isolate is executing VM code.
88 __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX); 88 __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
89 89
90 // Reserve space for arguments and align frame before entering C++ world. 90 // Reserve space for arguments and align frame before entering C++ world.
91 __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments))); 91 __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments)));
92 if (OS::ActivationFrameAlignment() > 1) { 92 if (OS::ActivationFrameAlignment() > 1) {
93 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1))); 93 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
94 } 94 }
95 95
96 // Pass NativeArguments structure by value and call runtime. 96 // Pass NativeArguments structure by value and call runtime.
97 __ movl(Address(ESP, isolate_offset), CTX); // Set isolate in NativeArgs. 97 __ movl(Address(ESP, isolate_offset), CTX); // Set isolate in NativeArgs.
98 // There are no runtime calls to closures, so we do not need to set the tag 98 // There are no runtime calls to closures, so we do not need to set the tag
99 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. 99 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
100 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments. 100 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments.
101 __ leal(EAX, Address(EBP, EDX, TIMES_4, 1 * kWordSize)); // Compute argv. 101 __ leal(EAX, Address(EBP, EDX, TIMES_4, 1 * kWordSize)); // Compute argv.
102 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments. 102 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments.
103 __ addl(EAX, Immediate(1 * kWordSize)); // Retval is next to 1st argument. 103 __ addl(EAX, Immediate(1 * kWordSize)); // Retval is next to 1st argument.
104 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments. 104 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
105 __ call(ECX); 105 __ call(ECX);
106 106
107 // Mark that the isolate is executing Dart code. 107 // Mark that the isolate is executing Dart code.
108 __ movl(Address(CTX, Isolate::vm_tag_offset()), 108 __ movl(Address(CTX, Isolate::vm_tag_offset()),
109 Immediate(VMTag::kScriptTagId)); 109 Immediate(VMTag::kDartTagId));
110 110
111 // Reset exit frame information in Isolate structure. 111 // Reset exit frame information in Isolate structure.
112 __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); 112 __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
113 113
114 // Load Context pointer from Isolate structure into ECX. 114 // Load Context pointer from Isolate structure into ECX.
115 __ movl(ECX, Address(CTX, Isolate::top_context_offset())); 115 __ movl(ECX, Address(CTX, Isolate::top_context_offset()));
116 116
117 // Reset Context pointer in Isolate structure. 117 // Reset Context pointer in Isolate structure.
118 const Immediate& raw_null = 118 const Immediate& raw_null =
119 Immediate(reinterpret_cast<intptr_t>(Object::null())); 119 Immediate(reinterpret_cast<intptr_t>(Object::null()));
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 // Save current Context pointer into Isolate structure. 192 // Save current Context pointer into Isolate structure.
193 __ movl(Address(EDI, Isolate::top_context_offset()), CTX); 193 __ movl(Address(EDI, Isolate::top_context_offset()), CTX);
194 194
195 // Cache Isolate pointer into CTX while executing native code. 195 // Cache Isolate pointer into CTX while executing native code.
196 __ movl(CTX, EDI); 196 __ movl(CTX, EDI);
197 197
198 #if defined(DEBUG) 198 #if defined(DEBUG)
199 { Label ok; 199 { Label ok;
200 // Check that we are always entering from Dart code. 200 // Check that we are always entering from Dart code.
201 __ movl(EDI, Address(CTX, Isolate::vm_tag_offset())); 201 __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
202 __ cmpl(EDI, Immediate(VMTag::kScriptTagId)); 202 __ cmpl(EDI, Immediate(VMTag::kDartTagId));
203 __ j(EQUAL, &ok, Assembler::kNearJump); 203 __ j(EQUAL, &ok, Assembler::kNearJump);
204 __ Stop("Not coming from Dart code."); 204 __ Stop("Not coming from Dart code.");
205 __ Bind(&ok); 205 __ Bind(&ok);
206 } 206 }
207 #endif 207 #endif
208 208
209 // Mark that the isolate is executing Native code. 209 // Mark that the isolate is executing Native code.
210 __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX); 210 __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
211 211
212 // Reserve space for the native arguments structure, the outgoing parameters 212 // Reserve space for the native arguments structure, the outgoing parameters
(...skipping 11 matching lines...) Expand all
224 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr. 224 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr.
225 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments. 225 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
226 __ leal(EAX, Address(ESP, 2 * kWordSize)); // Pointer to the NativeArguments. 226 __ leal(EAX, Address(ESP, 2 * kWordSize)); // Pointer to the NativeArguments.
227 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments. 227 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments.
228 228
229 __ movl(Address(ESP, kWordSize), ECX); // Function to call. 229 __ movl(Address(ESP, kWordSize), ECX); // Function to call.
230 __ call(&NativeEntry::NativeCallWrapperLabel()); 230 __ call(&NativeEntry::NativeCallWrapperLabel());
231 231
232 // Mark that the isolate is executing Dart code. 232 // Mark that the isolate is executing Dart code.
233 __ movl(Address(CTX, Isolate::vm_tag_offset()), 233 __ movl(Address(CTX, Isolate::vm_tag_offset()),
234 Immediate(VMTag::kScriptTagId)); 234 Immediate(VMTag::kDartTagId));
235 235
236 // Reset exit frame information in Isolate structure. 236 // Reset exit frame information in Isolate structure.
237 __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); 237 __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
238 238
239 // Load Context pointer from Isolate structure into EDI. 239 // Load Context pointer from Isolate structure into EDI.
240 __ movl(EDI, Address(CTX, Isolate::top_context_offset())); 240 __ movl(EDI, Address(CTX, Isolate::top_context_offset()));
241 241
242 // Reset Context pointer in Isolate structure. 242 // Reset Context pointer in Isolate structure.
243 const Immediate& raw_null = 243 const Immediate& raw_null =
244 Immediate(reinterpret_cast<intptr_t>(Object::null())); 244 Immediate(reinterpret_cast<intptr_t>(Object::null()));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 // Save current Context pointer into Isolate structure. 296 // Save current Context pointer into Isolate structure.
297 __ movl(Address(EDI, Isolate::top_context_offset()), CTX); 297 __ movl(Address(EDI, Isolate::top_context_offset()), CTX);
298 298
299 // Cache Isolate pointer into CTX while executing native code. 299 // Cache Isolate pointer into CTX while executing native code.
300 __ movl(CTX, EDI); 300 __ movl(CTX, EDI);
301 301
302 #if defined(DEBUG) 302 #if defined(DEBUG)
303 { Label ok; 303 { Label ok;
304 // Check that we are always entering from Dart code. 304 // Check that we are always entering from Dart code.
305 __ movl(EDI, Address(CTX, Isolate::vm_tag_offset())); 305 __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
306 __ cmpl(EDI, Immediate(VMTag::kScriptTagId)); 306 __ cmpl(EDI, Immediate(VMTag::kDartTagId));
307 __ j(EQUAL, &ok, Assembler::kNearJump); 307 __ j(EQUAL, &ok, Assembler::kNearJump);
308 __ Stop("Not coming from Dart code."); 308 __ Stop("Not coming from Dart code.");
309 __ Bind(&ok); 309 __ Bind(&ok);
310 } 310 }
311 #endif 311 #endif
312 312
313 // Mark that the isolate is executing Native code. 313 // Mark that the isolate is executing Native code.
314 __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX); 314 __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
315 315
316 // Reserve space for the native arguments structure, the outgoing parameter 316 // Reserve space for the native arguments structure, the outgoing parameter
317 // (pointer to the native arguments structure) and align frame before 317 // (pointer to the native arguments structure) and align frame before
318 // entering the C++ world. 318 // entering the C++ world.
319 __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments) - kWordSize)); 319 __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments) - kWordSize));
320 if (OS::ActivationFrameAlignment() > 1) { 320 if (OS::ActivationFrameAlignment() > 1) {
321 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1))); 321 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
322 } 322 }
323 323
324 // Pass NativeArguments structure by value and call native function. 324 // Pass NativeArguments structure by value and call native function.
325 __ movl(Address(ESP, isolate_offset), CTX); // Set isolate in NativeArgs. 325 __ movl(Address(ESP, isolate_offset), CTX); // Set isolate in NativeArgs.
326 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments. 326 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments.
327 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments. 327 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments.
328 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr. 328 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr.
329 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments. 329 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
330 __ leal(EAX, Address(ESP, kWordSize)); // Pointer to the NativeArguments. 330 __ leal(EAX, Address(ESP, kWordSize)); // Pointer to the NativeArguments.
331 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments. 331 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments.
332 __ call(ECX); 332 __ call(ECX);
333 333
334 // Mark that the isolate is executing Dart code. 334 // Mark that the isolate is executing Dart code.
335 __ movl(Address(CTX, Isolate::vm_tag_offset()), 335 __ movl(Address(CTX, Isolate::vm_tag_offset()),
336 Immediate(VMTag::kScriptTagId)); 336 Immediate(VMTag::kDartTagId));
337 337
338 // Reset exit frame information in Isolate structure. 338 // Reset exit frame information in Isolate structure.
339 __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0)); 339 __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
340 340
341 // Load Context pointer from Isolate structure into EDI. 341 // Load Context pointer from Isolate structure into EDI.
342 __ movl(EDI, Address(CTX, Isolate::top_context_offset())); 342 __ movl(EDI, Address(CTX, Isolate::top_context_offset()));
343 343
344 // Reset Context pointer in Isolate structure. 344 // Reset Context pointer in Isolate structure.
345 const Immediate& raw_null = 345 const Immediate& raw_null =
346 Immediate(reinterpret_cast<intptr_t>(Object::null())); 346 Immediate(reinterpret_cast<intptr_t>(Object::null()));
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 // Load Isolate pointer from Context structure into EDI. 761 // Load Isolate pointer from Context structure into EDI.
762 __ movl(EDI, FieldAddress(CTX, Context::isolate_offset())); 762 __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
763 763
764 // Save the current VMTag on the stack. 764 // Save the current VMTag on the stack.
765 ASSERT(kSavedVMTagSlotFromEntryFp == -4); 765 ASSERT(kSavedVMTagSlotFromEntryFp == -4);
766 __ movl(ECX, Address(EDI, Isolate::vm_tag_offset())); 766 __ movl(ECX, Address(EDI, Isolate::vm_tag_offset()));
767 __ pushl(ECX); 767 __ pushl(ECX);
768 768
769 // Mark that the isolate is executing Dart code. 769 // Mark that the isolate is executing Dart code.
770 __ movl(Address(EDI, Isolate::vm_tag_offset()), 770 __ movl(Address(EDI, Isolate::vm_tag_offset()),
771 Immediate(VMTag::kScriptTagId)); 771 Immediate(VMTag::kDartTagId));
772 772
773 // Save the top exit frame info. Use EDX as a temporary register. 773 // Save the top exit frame info. Use EDX as a temporary register.
774 // StackFrameIterator reads the top exit frame info saved in this frame. 774 // StackFrameIterator reads the top exit frame info saved in this frame.
775 // The constant kExitLinkSlotFromEntryFp must be kept in sync with the 775 // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
776 // code below. 776 // code below.
777 ASSERT(kExitLinkSlotFromEntryFp == -5); 777 ASSERT(kExitLinkSlotFromEntryFp == -5);
778 __ movl(EDX, Address(EDI, Isolate::top_exit_frame_info_offset())); 778 __ movl(EDX, Address(EDI, Isolate::top_exit_frame_info_offset()));
779 __ pushl(EDX); 779 __ pushl(EDX);
780 __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0)); 780 __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
781 781
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 ASSERT(kExceptionObjectReg == EAX); 1791 ASSERT(kExceptionObjectReg == EAX);
1792 ASSERT(kStackTraceObjectReg == EDX); 1792 ASSERT(kStackTraceObjectReg == EDX);
1793 __ movl(EDI, Address(ESP, 6 * kWordSize)); // Load target isolate. 1793 __ movl(EDI, Address(ESP, 6 * kWordSize)); // Load target isolate.
1794 __ movl(kStackTraceObjectReg, Address(ESP, 5 * kWordSize)); 1794 __ movl(kStackTraceObjectReg, Address(ESP, 5 * kWordSize));
1795 __ movl(kExceptionObjectReg, Address(ESP, 4 * kWordSize)); 1795 __ movl(kExceptionObjectReg, Address(ESP, 4 * kWordSize));
1796 __ movl(EBP, Address(ESP, 3 * kWordSize)); // Load target frame_pointer. 1796 __ movl(EBP, Address(ESP, 3 * kWordSize)); // Load target frame_pointer.
1797 __ movl(EBX, Address(ESP, 1 * kWordSize)); // Load target PC into EBX. 1797 __ movl(EBX, Address(ESP, 1 * kWordSize)); // Load target PC into EBX.
1798 __ movl(ESP, Address(ESP, 2 * kWordSize)); // Load target stack_pointer. 1798 __ movl(ESP, Address(ESP, 2 * kWordSize)); // Load target stack_pointer.
1799 // Set tag. 1799 // Set tag.
1800 __ movl(Address(EDI, Isolate::vm_tag_offset()), 1800 __ movl(Address(EDI, Isolate::vm_tag_offset()),
1801 Immediate(VMTag::kScriptTagId)); 1801 Immediate(VMTag::kDartTagId));
1802 // Clear top exit frame. 1802 // Clear top exit frame.
1803 __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0)); 1803 __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
1804 __ jmp(EBX); // Jump to the exception handler code. 1804 __ jmp(EBX); // Jump to the exception handler code.
1805 } 1805 }
1806 1806
1807 1807
1808 // Calls to the runtime to optimize the given function. 1808 // Calls to the runtime to optimize the given function.
1809 // EDI: function to be reoptimized. 1809 // EDI: function to be reoptimized.
1810 // EDX: argument descriptor (preserved). 1810 // EDX: argument descriptor (preserved).
1811 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) { 1811 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 const Register temp = ECX; 1940 const Register temp = ECX;
1941 __ movl(left, Address(ESP, 2 * kWordSize)); 1941 __ movl(left, Address(ESP, 2 * kWordSize));
1942 __ movl(right, Address(ESP, 1 * kWordSize)); 1942 __ movl(right, Address(ESP, 1 * kWordSize));
1943 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 1943 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
1944 __ ret(); 1944 __ ret();
1945 } 1945 }
1946 1946
1947 } // namespace dart 1947 } // namespace dart
1948 1948
1949 #endif // defined TARGET_ARCH_IA32 1949 #endif // defined TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_arm64.cc ('k') | runtime/vm/stub_code_mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698