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

Unified Diff: runtime/vm/stub_code_x64.cc

Issue 11476021: Reapply "Do not call ResolveCompileInstanceFunction from the lookup stub." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/stub_code_ia32.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/stub_code_x64.cc
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index e754305d336ee6891339d04b4c116b24234ab9b7..a6ca462f3aff8dd196b42face732d320ea017d68 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -275,108 +275,74 @@ void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
// ....
__ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
__ movq(RAX, Address(RBP, RAX, TIMES_4, kWordSize)); // Get receiver.
- __ pushq(R10); // Preserve arguments descriptor array.
- __ pushq(RAX); // Preserve receiver.
- __ pushq(RBX); // Preserve ic-data.
- // First resolve the function to get the function object.
-
- __ pushq(raw_null); // Setup space on stack for return value.
- __ pushq(RAX); // Pass receiver.
- __ pushq(RBX); // Pass IC data object.
- __ pushq(R10); // Pass arguments descriptor array.
- __ CallRuntime(kResolveCompileInstanceFunctionRuntimeEntry);
- __ popq(RAX); // Remove arguments pushed earlier.
- __ popq(RAX);
- __ popq(RAX);
- __ popq(RBX); // Pop returned code object into RBX.
- // Pop preserved values
- __ popq(R10); // Restore ic-data.
- __ popq(RAX); // Restore receiver.
- __ popq(R13); // Restore arguments descriptor array.
-
- __ cmpq(RBX, raw_null);
- Label check_implicit_closure;
- __ j(EQUAL, &check_implicit_closure, Assembler::kNearJump);
-
- // Remove the stub frame as we are about to jump to the dart function.
- __ LeaveFrame();
-
- __ movq(R10, R13);
- __ movq(RBX, FieldAddress(RBX, Code::instructions_offset()));
- __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
- __ jmp(RBX);
-
- __ Bind(&check_implicit_closure);
// RAX: receiver.
- // R10: ic-data.
- // RBX: raw_null.
- // R13: arguments descriptor array.
+ // RBX: ic-data.
+ // R10: arguments descriptor array.
// The target function was not found.
// First check to see if this is a getter function and we are
// trying to create a closure of an instance function.
// Push values that need to be preserved across runtime call.
__ pushq(RAX); // Preserve receiver.
- __ pushq(R10); // Preserve ic-data.
- __ pushq(R13); // Preserve arguments descriptor array.
+ __ pushq(RBX); // Preserve ic-data.
+ __ pushq(R10); // Preserve arguments descriptor array.
__ pushq(raw_null); // Setup space on stack for return value.
__ pushq(RAX); // Push receiver.
- __ pushq(R10); // Ic-data array.
+ __ pushq(RBX); // Ic-data array.
__ CallRuntime(kResolveImplicitClosureFunctionRuntimeEntry);
__ popq(RAX);
__ popq(RAX);
- __ popq(RBX); // Get return value into RBX, might be Closure object.
+ __ popq(RCX); // Get return value into RCX, might be Closure object.
// Pop preserved values.
- __ popq(R13); // Restore arguments descriptor array.
- __ popq(R10); // Restore ic-data.
+ __ popq(R10); // Restore arguments descriptor array.
+ __ popq(RBX); // Restore ic-data.
__ popq(RAX); // Restore receiver.
- __ cmpq(RBX, raw_null);
+ __ cmpq(RCX, raw_null);
Label check_implicit_closure_through_getter;
__ j(EQUAL, &check_implicit_closure_through_getter, Assembler::kNearJump);
- __ movq(RAX, RBX); // Return value is the closure object.
+ __ movq(RAX, RCX); // Return value is the closure object.
// Remove the stub frame as we are about return.
__ LeaveFrame();
__ ret();
__ Bind(&check_implicit_closure_through_getter);
// RAX: receiver.
- // R10: ic-data.
- // RBX: raw_null.
- // R13: arguments descriptor array.
+ // RBX: ic-data.
+ // R10: arguments descriptor array.
// This is not the case of an instance so invoke the getter of the
// same name and see if we get a closure back which we are then
// supposed to invoke.
// Push values that need to be preserved across runtime call.
__ pushq(RAX); // Preserve receiver.
- __ pushq(R10); // Preserve ic-data.
- __ pushq(R13); // Preserve arguments descriptor array.
+ __ pushq(RBX); // Preserve ic-data.
+ __ pushq(R10); // Preserve arguments descriptor array.
__ pushq(raw_null); // Setup space on stack for return value.
__ pushq(RAX); // Push receiver.
- __ pushq(R10); // Ic-data array.
+ __ pushq(RBX); // Ic-data array.
__ CallRuntime(kResolveImplicitClosureThroughGetterRuntimeEntry);
- __ popq(R10); // Pop argument.
__ popq(RAX); // Pop argument.
- __ popq(RBX); // get return value into RBX, might be Closure object.
+ __ popq(RAX); // Pop argument.
+ __ popq(RCX); // get return value into RCX, might be Closure object.
// Pop preserved values.
- __ popq(R13); // Restore arguments descriptor array.
- __ popq(R10); // Restore ic-data.
+ __ popq(R10); // Restore arguments descriptor array.
+ __ popq(RBX); // Restore ic-data.
__ popq(RAX); // Restore receiver.
- __ cmpq(RBX, raw_null);
+ __ cmpq(RCX, raw_null);
Label function_not_found;
__ j(EQUAL, &function_not_found);
Kevin Millikin (Google) 2012/12/07 12:55:18 This is not a near jump on all x64 platforms, and
- // RBX: Closure object.
- // R13: Arguments descriptor array.
+ // RCX: Closure object.
+ // R10: Arguments descriptor array.
__ pushq(raw_null); // Setup space on stack for result from invoking Closure.
- __ pushq(RBX); // Closure object.
- __ pushq(R13); // Arguments descriptor.
- __ movq(R13, FieldAddress(R13, ArgumentsDescriptor::count_offset()));
+ __ pushq(RCX); // Closure object.
+ __ pushq(R10); // Arguments descriptor.
+ __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
__ SmiUntag(R13);
__ subq(R13, Immediate(1)); // Arguments array length, minus the receiver.
PushArgumentsArray(assembler, (kWordSize * 6));
@@ -406,15 +372,14 @@ void StubCode::GenerateInstanceFunctionLookupStub(Assembler* assembler) {
// The target function was not found, so invoke method
// "void noSuchMethod(function_name, args_array)".
// RAX: receiver.
- // R10: ic-data.
- // RBX: raw_null.
- // R13: arguments descriptor array.
+ // RBX: ic-data.
+ // R10: arguments descriptor array.
__ pushq(raw_null); // Setup space on stack for result from noSuchMethod.
__ pushq(RAX); // Receiver.
- __ pushq(R10); // IC-data array.
- __ pushq(R13); // Arguments descriptor array.
- __ movq(R13, FieldAddress(R13, ArgumentsDescriptor::count_offset()));
+ __ pushq(RBX); // IC-data array.
+ __ pushq(R10); // Arguments descriptor array.
+ __ movq(R13, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
__ SmiUntag(R13);
__ subq(R13, Immediate(1)); // Arguments array length, minus the receiver.
// See stack layout below explaining "wordSize * 7" offset.
« no previous file with comments | « runtime/vm/stub_code_ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698