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

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

Issue 11419073: Remove loading of function object in static calls. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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/flow_graph_compiler_x64.cc ('k') | runtime/vm/stub_code_x64.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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/assembler_macros.h" 9 #include "vm/assembler_macros.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 176
177 // Cache Context pointer into CTX while executing Dart code. 177 // Cache Context pointer into CTX while executing Dart code.
178 __ movl(CTX, EDI); 178 __ movl(CTX, EDI);
179 179
180 __ LeaveFrame(); 180 __ LeaveFrame();
181 __ ret(); 181 __ ret();
182 } 182 }
183 183
184 184
185 // Input parameters: 185 // Input parameters:
186 // ECX: function object.
187 // EDX: arguments descriptor array (num_args is first Smi element). 186 // EDX: arguments descriptor array (num_args is first Smi element).
188 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) { 187 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) {
189 const Immediate raw_null = 188 const Immediate raw_null =
190 Immediate(reinterpret_cast<intptr_t>(Object::null())); 189 Immediate(reinterpret_cast<intptr_t>(Object::null()));
191
192 __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
193 __ cmpl(EAX, raw_null);
194 Label function_compiled;
195 __ j(NOT_EQUAL, &function_compiled, Assembler::kNearJump);
196
197 // Create a stub frame as we are pushing some objects on the stack before
198 // calling into the runtime.
199 AssemblerMacros::EnterStubFrame(assembler); 190 AssemblerMacros::EnterStubFrame(assembler);
200
201 __ pushl(EDX); // Preserve arguments descriptor array. 191 __ pushl(EDX); // Preserve arguments descriptor array.
202 __ pushl(ECX); 192 __ pushl(raw_null); // Setup space on stack for return value.
203 __ CallRuntime(kCompileFunctionRuntimeEntry);
204 __ popl(ECX); // Restore read-only function object argument in ECX.
205 __ popl(EDX); // Restore arguments descriptor array.
206 // Restore EAX.
207 __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
208
209 // Remove the stub frame as we are about to jump to the dart function.
210 __ LeaveFrame();
211
212 __ Bind(&function_compiled);
213 // Patch caller.
214
215 // Create a stub frame as we are pushing some objects on the stack before
216 // calling into the runtime.
217 AssemblerMacros::EnterStubFrame(assembler);
218
219 __ pushl(EDX); // Preserve arguments descriptor array.
220 __ pushl(ECX); // Preserve function object.
221 __ CallRuntime(kPatchStaticCallRuntimeEntry); 193 __ CallRuntime(kPatchStaticCallRuntimeEntry);
222 __ popl(ECX); // Restore function object argument in ECX. 194 __ popl(EAX); // Get Code object result.
223 __ popl(EDX); // Restore arguments descriptor array. 195 __ popl(EDX); // Restore arguments descriptor array.
224 // Remove the stub frame as we are about to jump to the dart function. 196 // Remove the stub frame as we are about to jump to the dart function.
225 __ LeaveFrame(); 197 __ LeaveFrame();
226 198
227 __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
228 __ movl(ECX, FieldAddress(EAX, Code::instructions_offset())); 199 __ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
229 __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); 200 __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
230 __ jmp(ECX); 201 __ jmp(ECX);
231 } 202 }
232 203
233 204
234 // Called from a static call only when an invalid code has been entered 205 // Called from a static call only when an invalid code has been entered
235 // (invalid because its function was optimized or deoptimized). 206 // (invalid because its function was optimized or deoptimized).
236 // ECX: function object.
237 // EDX: arguments descriptor array (num_args is first Smi element). 207 // EDX: arguments descriptor array (num_args is first Smi element).
238 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) { 208 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
209 const Immediate raw_null =
210 Immediate(reinterpret_cast<intptr_t>(Object::null()));
239 // Create a stub frame as we are pushing some objects on the stack before 211 // Create a stub frame as we are pushing some objects on the stack before
240 // calling into the runtime. 212 // calling into the runtime.
241 AssemblerMacros::EnterStubFrame(assembler); 213 AssemblerMacros::EnterStubFrame(assembler);
242 __ pushl(EDX); // Preserve arguments descriptor array. 214 __ pushl(EDX); // Preserve arguments descriptor array.
243 __ pushl(ECX); // Preserve target function. 215 __ pushl(raw_null); // Setup space on stack for return value.
244 __ pushl(ECX); // Target function.
245 __ CallRuntime(kFixCallersTargetRuntimeEntry); 216 __ CallRuntime(kFixCallersTargetRuntimeEntry);
246 __ popl(EAX); // discard argument. 217 __ popl(EAX); // Get Code object.
247 __ popl(EAX); // Restore function.
248 __ popl(EDX); // Restore arguments descriptor array. 218 __ popl(EDX); // Restore arguments descriptor array.
249 __ movl(EAX, FieldAddress(EAX, Function::code_offset()));
250 __ movl(EAX, FieldAddress(EAX, Code::instructions_offset())); 219 __ movl(EAX, FieldAddress(EAX, Code::instructions_offset()));
251 __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); 220 __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
252 __ LeaveFrame(); 221 __ LeaveFrame();
253 __ jmp(EAX); 222 __ jmp(EAX);
254 __ int3(); 223 __ int3();
255 } 224 }
256 225
257 226
258 // Input parameters: 227 // Input parameters:
259 // EDI: argument count, may be zero. 228 // EDI: argument count, may be zero.
(...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after
1809 } 1778 }
1810 1779
1811 1780
1812 // Megamorphic call is currently implemented as IC call but through a stub 1781 // Megamorphic call is currently implemented as IC call but through a stub
1813 // that does not check/count function invocations. 1782 // that does not check/count function invocations.
1814 void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) { 1783 void StubCode::GenerateMegamorphicCallStub(Assembler* assembler) {
1815 GenerateNArgsCheckInlineCacheStub(assembler, 1); 1784 GenerateNArgsCheckInlineCacheStub(assembler, 1);
1816 } 1785 }
1817 1786
1818 1787
1819 // ECX: Function object.
1820 // EDX: Arguments array. 1788 // EDX: Arguments array.
1821 // TOS(0): return address (Dart code). 1789 // TOS(0): return address (Dart code).
1822 void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) { 1790 void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) {
1823 // Create a stub frame as we are pushing some objects on the stack before 1791 // Create a stub frame as we are pushing some objects on the stack before
1824 // calling into the runtime. 1792 // calling into the runtime.
1825 AssemblerMacros::EnterStubFrame(assembler); 1793 AssemblerMacros::EnterStubFrame(assembler);
1826 __ pushl(EDX); 1794 __ pushl(EDX); // Preserve arguments descriptor.
1827 __ pushl(ECX); 1795 const Immediate raw_null =
1796 Immediate(reinterpret_cast<intptr_t>(Object::null()));
1797 __ pushl(raw_null); // Room for result.
1828 __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry); 1798 __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry);
1829 __ popl(ECX); 1799 __ popl(EAX); // Code object.
1830 __ popl(EDX); 1800 __ popl(EDX); // Restore arguments descriptor.
1831 __ LeaveFrame(); 1801 __ LeaveFrame();
1832 1802
1833 // Now call the static function. The breakpoint handler function 1803 // Now call the static function. The breakpoint handler function
1834 // ensures that the call target is compiled. 1804 // ensures that the call target is compiled.
1835 __ movl(EAX, FieldAddress(ECX, Function::code_offset()));
1836 __ movl(ECX, FieldAddress(EAX, Code::instructions_offset())); 1805 __ movl(ECX, FieldAddress(EAX, Code::instructions_offset()));
1837 __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); 1806 __ addl(ECX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
1838 __ jmp(ECX); 1807 __ jmp(ECX);
1839 } 1808 }
1840 1809
1841 1810
1842 // TOS(0): return address (Dart code). 1811 // TOS(0): return address (Dart code).
1843 void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) { 1812 void StubCode::GenerateBreakpointReturnStub(Assembler* assembler) {
1844 // Create a stub frame as we are pushing some objects on the stack before 1813 // Create a stub frame as we are pushing some objects on the stack before
1845 // calling into the runtime. 1814 // calling into the runtime.
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
2157 __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry); 2126 __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry);
2158 __ popl(EDX); 2127 __ popl(EDX);
2159 __ popl(EAX); 2128 __ popl(EAX);
2160 __ LeaveFrame(); 2129 __ LeaveFrame();
2161 __ ret(); 2130 __ ret();
2162 } 2131 }
2163 2132
2164 } // namespace dart 2133 } // namespace dart
2165 2134
2166 #endif // defined TARGET_ARCH_IA32 2135 #endif // defined TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | runtime/vm/stub_code_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698