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

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

Issue 1156143003: Refactor Isolate -> Thread in NativeArguments and exception handler jump. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fix comment; remove unused accessor. Created 5 years, 7 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
« 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 23 matching lines...) Expand all
34 34
35 // Input parameters: 35 // Input parameters:
36 // ESP : points to return address. 36 // ESP : points to return address.
37 // ESP + 4 : address of last argument in argument array. 37 // ESP + 4 : address of last argument in argument array.
38 // ESP + 4*EDX : address of first argument in argument array. 38 // ESP + 4*EDX : address of first argument in argument array.
39 // ESP + 4*EDX + 4 : address of return value. 39 // ESP + 4*EDX + 4 : address of return value.
40 // ECX : address of the runtime function to call. 40 // ECX : address of the runtime function to call.
41 // EDX : number of arguments to the call. 41 // EDX : number of arguments to the call.
42 // Must preserve callee saved registers EDI and EBX. 42 // Must preserve callee saved registers EDI and EBX.
43 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) { 43 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
44 const intptr_t isolate_offset = NativeArguments::isolate_offset(); 44 const intptr_t thread_offset = NativeArguments::thread_offset();
45 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset(); 45 const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
46 const intptr_t argv_offset = NativeArguments::argv_offset(); 46 const intptr_t argv_offset = NativeArguments::argv_offset();
47 const intptr_t retval_offset = NativeArguments::retval_offset(); 47 const intptr_t retval_offset = NativeArguments::retval_offset();
48 48
49 __ EnterFrame(0); 49 __ EnterFrame(0);
50 50
51 __ LoadIsolate(EDI); 51 __ LoadIsolate(EDI);
52 52
53 // Save exit frame information to enable stack walking as we are about 53 // Save exit frame information to enable stack walking as we are about
54 // to transition to Dart VM C++ code. 54 // to transition to Dart VM C++ code.
(...skipping 13 matching lines...) Expand all
68 // Mark that the isolate is executing VM code. 68 // Mark that the isolate is executing VM code.
69 __ movl(Address(EDI, Isolate::vm_tag_offset()), ECX); 69 __ movl(Address(EDI, Isolate::vm_tag_offset()), ECX);
70 70
71 // Reserve space for arguments and align frame before entering C++ world. 71 // Reserve space for arguments and align frame before entering C++ world.
72 __ AddImmediate(ESP, Immediate(-INT32_SIZEOF(NativeArguments))); 72 __ AddImmediate(ESP, Immediate(-INT32_SIZEOF(NativeArguments)));
73 if (OS::ActivationFrameAlignment() > 1) { 73 if (OS::ActivationFrameAlignment() > 1) {
74 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1))); 74 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
75 } 75 }
76 76
77 // Pass NativeArguments structure by value and call runtime. 77 // Pass NativeArguments structure by value and call runtime.
78 __ movl(Address(ESP, isolate_offset), EDI); // Set isolate in NativeArgs. 78 __ movl(Address(ESP, thread_offset), THR); // Set thread in NativeArgs.
79 // There are no runtime calls to closures, so we do not need to set the tag 79 // There are no runtime calls to closures, so we do not need to set the tag
80 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_. 80 // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
81 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments. 81 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments.
82 __ leal(EAX, Address(EBP, EDX, TIMES_4, 1 * kWordSize)); // Compute argv. 82 __ leal(EAX, Address(EBP, EDX, TIMES_4, 1 * kWordSize)); // Compute argv.
83 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments. 83 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments.
84 __ addl(EAX, Immediate(1 * kWordSize)); // Retval is next to 1st argument. 84 __ addl(EAX, Immediate(1 * kWordSize)); // Retval is next to 1st argument.
85 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments. 85 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
86 __ call(ECX); 86 __ call(ECX);
87 87
88 // Mark that the isolate is executing Dart code. EDI is callee saved. 88 // Mark that the isolate is executing Dart code. EDI is callee saved.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 // Input parameters: 120 // Input parameters:
121 // ESP : points to return address. 121 // ESP : points to return address.
122 // ESP + 4 : address of return value. 122 // ESP + 4 : address of return value.
123 // EAX : address of first argument in argument array. 123 // EAX : address of first argument in argument array.
124 // ECX : address of the native function to call. 124 // ECX : address of the native function to call.
125 // EDX : argc_tag including number of arguments and function kind. 125 // EDX : argc_tag including number of arguments and function kind.
126 // Uses EDI. 126 // Uses EDI.
127 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { 127 void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
128 const intptr_t native_args_struct_offset = 128 const intptr_t native_args_struct_offset =
129 NativeEntry::kNumCallWrapperArguments * kWordSize; 129 NativeEntry::kNumCallWrapperArguments * kWordSize;
130 const intptr_t isolate_offset = 130 const intptr_t thread_offset =
131 NativeArguments::isolate_offset() + native_args_struct_offset; 131 NativeArguments::thread_offset() + native_args_struct_offset;
132 const intptr_t argc_tag_offset = 132 const intptr_t argc_tag_offset =
133 NativeArguments::argc_tag_offset() + native_args_struct_offset; 133 NativeArguments::argc_tag_offset() + native_args_struct_offset;
134 const intptr_t argv_offset = 134 const intptr_t argv_offset =
135 NativeArguments::argv_offset() + native_args_struct_offset; 135 NativeArguments::argv_offset() + native_args_struct_offset;
136 const intptr_t retval_offset = 136 const intptr_t retval_offset =
137 NativeArguments::retval_offset() + native_args_struct_offset; 137 NativeArguments::retval_offset() + native_args_struct_offset;
138 138
139 __ EnterFrame(0); 139 __ EnterFrame(0);
140 140
141 __ LoadIsolate(EDI); 141 __ LoadIsolate(EDI);
(...skipping 19 matching lines...) Expand all
161 // Reserve space for the native arguments structure, the outgoing parameters 161 // Reserve space for the native arguments structure, the outgoing parameters
162 // (pointer to the native arguments structure, the C function entry point) 162 // (pointer to the native arguments structure, the C function entry point)
163 // and align frame before entering the C++ world. 163 // and align frame before entering the C++ world.
164 __ AddImmediate(ESP, 164 __ AddImmediate(ESP,
165 Immediate(-INT32_SIZEOF(NativeArguments) - (2 * kWordSize))); 165 Immediate(-INT32_SIZEOF(NativeArguments) - (2 * kWordSize)));
166 if (OS::ActivationFrameAlignment() > 1) { 166 if (OS::ActivationFrameAlignment() > 1) {
167 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1))); 167 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
168 } 168 }
169 169
170 // Pass NativeArguments structure by value and call native function. 170 // Pass NativeArguments structure by value and call native function.
171 __ movl(Address(ESP, isolate_offset), EDI); // Set isolate in NativeArgs. 171 __ movl(Address(ESP, thread_offset), THR); // Set thread in NativeArgs.
172 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments. 172 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments.
173 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments. 173 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments.
174 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr. 174 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr.
175 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments. 175 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
176 __ leal(EAX, Address(ESP, 2 * kWordSize)); // Pointer to the NativeArguments. 176 __ leal(EAX, Address(ESP, 2 * kWordSize)); // Pointer to the NativeArguments.
177 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments. 177 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments.
178 178
179 __ movl(Address(ESP, kWordSize), ECX); // Function to call. 179 __ movl(Address(ESP, kWordSize), ECX); // Function to call.
180 __ call(&NativeEntry::NativeCallWrapperLabel()); 180 __ call(&NativeEntry::NativeCallWrapperLabel());
181 181
(...skipping 11 matching lines...) Expand all
193 193
194 // Input parameters: 194 // Input parameters:
195 // ESP : points to return address. 195 // ESP : points to return address.
196 // ESP + 4 : address of return value. 196 // ESP + 4 : address of return value.
197 // EAX : address of first argument in argument array. 197 // EAX : address of first argument in argument array.
198 // ECX : address of the native function to call. 198 // ECX : address of the native function to call.
199 // EDX : argc_tag including number of arguments and function kind. 199 // EDX : argc_tag including number of arguments and function kind.
200 // Uses EDI. 200 // Uses EDI.
201 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) { 201 void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
202 const intptr_t native_args_struct_offset = kWordSize; 202 const intptr_t native_args_struct_offset = kWordSize;
203 const intptr_t isolate_offset = 203 const intptr_t thread_offset =
204 NativeArguments::isolate_offset() + native_args_struct_offset; 204 NativeArguments::thread_offset() + native_args_struct_offset;
205 const intptr_t argc_tag_offset = 205 const intptr_t argc_tag_offset =
206 NativeArguments::argc_tag_offset() + native_args_struct_offset; 206 NativeArguments::argc_tag_offset() + native_args_struct_offset;
207 const intptr_t argv_offset = 207 const intptr_t argv_offset =
208 NativeArguments::argv_offset() + native_args_struct_offset; 208 NativeArguments::argv_offset() + native_args_struct_offset;
209 const intptr_t retval_offset = 209 const intptr_t retval_offset =
210 NativeArguments::retval_offset() + native_args_struct_offset; 210 NativeArguments::retval_offset() + native_args_struct_offset;
211 211
212 __ EnterFrame(0); 212 __ EnterFrame(0);
213 213
214 __ LoadIsolate(EDI); 214 __ LoadIsolate(EDI);
(...skipping 18 matching lines...) Expand all
233 233
234 // Reserve space for the native arguments structure, the outgoing parameter 234 // Reserve space for the native arguments structure, the outgoing parameter
235 // (pointer to the native arguments structure) and align frame before 235 // (pointer to the native arguments structure) and align frame before
236 // entering the C++ world. 236 // entering the C++ world.
237 __ AddImmediate(ESP, Immediate(-INT32_SIZEOF(NativeArguments) - kWordSize)); 237 __ AddImmediate(ESP, Immediate(-INT32_SIZEOF(NativeArguments) - kWordSize));
238 if (OS::ActivationFrameAlignment() > 1) { 238 if (OS::ActivationFrameAlignment() > 1) {
239 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1))); 239 __ andl(ESP, Immediate(~(OS::ActivationFrameAlignment() - 1)));
240 } 240 }
241 241
242 // Pass NativeArguments structure by value and call native function. 242 // Pass NativeArguments structure by value and call native function.
243 __ movl(Address(ESP, isolate_offset), EDI); // Set isolate in NativeArgs. 243 __ movl(Address(ESP, thread_offset), THR); // Set thread in NativeArgs.
244 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments. 244 __ movl(Address(ESP, argc_tag_offset), EDX); // Set argc in NativeArguments.
245 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments. 245 __ movl(Address(ESP, argv_offset), EAX); // Set argv in NativeArguments.
246 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr. 246 __ leal(EAX, Address(EBP, 2 * kWordSize)); // Compute return value addr.
247 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments. 247 __ movl(Address(ESP, retval_offset), EAX); // Set retval in NativeArguments.
248 __ leal(EAX, Address(ESP, kWordSize)); // Pointer to the NativeArguments. 248 __ leal(EAX, Address(ESP, kWordSize)); // Pointer to the NativeArguments.
249 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments. 249 __ movl(Address(ESP, 0), EAX); // Pass the pointer to the NativeArguments.
250 __ call(ECX); 250 __ call(ECX);
251 251
252 // Mark that the isolate is executing Dart code. EDI is callee saved. 252 // Mark that the isolate is executing Dart code. EDI is callee saved.
253 __ movl(Address(EDI, Isolate::vm_tag_offset()), 253 __ movl(Address(EDI, Isolate::vm_tag_offset()),
(...skipping 1651 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 } 1905 }
1906 1906
1907 1907
1908 // Jump to the exception or error handler. 1908 // Jump to the exception or error handler.
1909 // TOS + 0: return address 1909 // TOS + 0: return address
1910 // TOS + 1: program_counter 1910 // TOS + 1: program_counter
1911 // TOS + 2: stack_pointer 1911 // TOS + 2: stack_pointer
1912 // TOS + 3: frame_pointer 1912 // TOS + 3: frame_pointer
1913 // TOS + 4: exception object 1913 // TOS + 4: exception object
1914 // TOS + 5: stacktrace object 1914 // TOS + 5: stacktrace object
1915 // TOS + 6: isolate 1915 // TOS + 6: thread
1916 // No Result. 1916 // No Result.
1917 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) { 1917 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
1918 ASSERT(kExceptionObjectReg == EAX); 1918 ASSERT(kExceptionObjectReg == EAX);
1919 ASSERT(kStackTraceObjectReg == EDX); 1919 ASSERT(kStackTraceObjectReg == EDX);
1920 __ movl(EDI, Address(ESP, 6 * kWordSize)); // Load target isolate. 1920 __ movl(THR, Address(ESP, 6 * kWordSize)); // Load target thread.
1921 __ movl(kStackTraceObjectReg, Address(ESP, 5 * kWordSize)); 1921 __ movl(kStackTraceObjectReg, Address(ESP, 5 * kWordSize));
1922 __ movl(kExceptionObjectReg, Address(ESP, 4 * kWordSize)); 1922 __ movl(kExceptionObjectReg, Address(ESP, 4 * kWordSize));
1923 __ movl(EBP, Address(ESP, 3 * kWordSize)); // Load target frame_pointer. 1923 __ movl(EBP, Address(ESP, 3 * kWordSize)); // Load target frame_pointer.
1924 __ movl(EBX, Address(ESP, 1 * kWordSize)); // Load target PC into EBX. 1924 __ movl(EBX, Address(ESP, 1 * kWordSize)); // Load target PC into EBX.
1925 __ movl(ESP, Address(ESP, 2 * kWordSize)); // Load target stack_pointer. 1925 __ movl(ESP, Address(ESP, 2 * kWordSize)); // Load target stack_pointer.
1926 // TODO(koda): Pass thread instead of isolate. 1926 // TODO(koda): Pass thread instead of isolate.
1927 __ movl(THR, Address(EDI, Isolate::mutator_thread_offset())); 1927 __ LoadIsolate(EDI);
1928 // Set tag. 1928 // Set tag.
1929 __ movl(Address(EDI, Isolate::vm_tag_offset()), 1929 __ movl(Address(EDI, Isolate::vm_tag_offset()),
1930 Immediate(VMTag::kDartTagId)); 1930 Immediate(VMTag::kDartTagId));
1931 // Clear top exit frame. 1931 // Clear top exit frame.
1932 __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0)); 1932 __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
1933 __ jmp(EBX); // Jump to the exception handler code. 1933 __ jmp(EBX); // Jump to the exception handler code.
1934 } 1934 }
1935 1935
1936 1936
1937 // Calls to the runtime to optimize the given function. 1937 // Calls to the runtime to optimize the given function.
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 // EBX: entry point. 2127 // EBX: entry point.
2128 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { 2128 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
2129 EmitMegamorphicLookup(assembler, EDI, EBX, EBX); 2129 EmitMegamorphicLookup(assembler, EDI, EBX, EBX);
2130 __ ret(); 2130 __ ret();
2131 } 2131 }
2132 2132
2133 2133
2134 } // namespace dart 2134 } // namespace dart
2135 2135
2136 #endif // defined TARGET_ARCH_IA32 2136 #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