| Index: runtime/vm/stub_code_x64.cc | 
| =================================================================== | 
| --- runtime/vm/stub_code_x64.cc	(revision 15101) | 
| +++ runtime/vm/stub_code_x64.cc	(working copy) | 
| @@ -182,44 +182,18 @@ | 
|  | 
|  | 
| // Input parameters: | 
| -//   RBX: function object. | 
| //   R10: arguments descriptor array (num_args is first Smi element). | 
| void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) { | 
| const Immediate raw_null = | 
| Immediate(reinterpret_cast<intptr_t>(Object::null())); | 
| - | 
| -  __ movq(RAX, FieldAddress(RBX, Function::code_offset())); | 
| -  __ cmpq(RAX, raw_null); | 
| -  Label function_compiled; | 
| -  __ j(NOT_EQUAL, &function_compiled, Assembler::kNearJump); | 
| - | 
| -  // Create a stub frame as we are pushing some objects on the stack before | 
| -  // calling into the runtime. | 
| AssemblerMacros::EnterStubFrame(assembler); | 
| - | 
| __ pushq(R10);  // Preserve arguments descriptor array. | 
| -  __ pushq(RBX); | 
| -  __ CallRuntime(kCompileFunctionRuntimeEntry); | 
| -  __ popq(RBX);  // Restore read-only function object argument in RBX. | 
| -  __ popq(R10);  // Restore arguments descriptor array. | 
| -  // Restore RAX. | 
| -  __ movq(RAX, FieldAddress(RBX, Function::code_offset())); | 
| - | 
| -  // Remove the stub frame as we are about to jump to the dart function. | 
| -  __ LeaveFrame(); | 
| - | 
| -  __ Bind(&function_compiled); | 
| -  // Patch caller. | 
| -  AssemblerMacros::EnterStubFrame(assembler); | 
| - | 
| -  __ pushq(R10);  // Preserve arguments descriptor array. | 
| -  __ pushq(RBX);  // Preserve function object. | 
| +  __ pushq(raw_null);  // Setup space on stack for return value. | 
| __ CallRuntime(kPatchStaticCallRuntimeEntry); | 
| -  __ popq(RBX);  // Restore function object argument in RBX. | 
| +  __ popq(RAX);  // Get Code object result. | 
| __ popq(R10);  // Restore arguments descriptor array. | 
| // Remove the stub frame as we are about to jump to the dart function. | 
| __ LeaveFrame(); | 
| -  __ movq(RAX, FieldAddress(RBX, Function::code_offset())); | 
|  | 
| __ movq(RBX, FieldAddress(RAX, Code::instructions_offset())); | 
| __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); | 
| @@ -229,18 +203,16 @@ | 
|  | 
| // Called from a static call only when an invalid code has been entered | 
| // (invalid because its function was optimized or deoptimized). | 
| -// RBX: function object. | 
| // R10: arguments descriptor array (num_args is first Smi element). | 
| void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) { | 
| +  const Immediate raw_null = | 
| +      Immediate(reinterpret_cast<intptr_t>(Object::null())); | 
| AssemblerMacros::EnterStubFrame(assembler); | 
| __ pushq(R10);  // Preserve arguments descriptor array. | 
| -  __ pushq(RBX);  // Preserve target function. | 
| -  __ pushq(RBX);  // Target function. | 
| +  __ pushq(raw_null);  // Setup space on stack for return value. | 
| __ CallRuntime(kFixCallersTargetRuntimeEntry); | 
| -  __ popq(RAX);  // discard argument. | 
| -  __ popq(RAX);  // Restore function. | 
| +  __ popq(RAX);  // Get Code object. | 
| __ popq(R10);  // Restore arguments descriptor array. | 
| -  __ movq(RAX, FieldAddress(RAX, Function::code_offset())); | 
| __ movq(RAX, FieldAddress(RAX, Code::instructions_offset())); | 
| __ addq(RAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); | 
| __ LeaveFrame(); | 
| @@ -1787,21 +1759,21 @@ | 
| GenerateNArgsCheckInlineCacheStub(assembler, 1); | 
| } | 
|  | 
| -//  RBX: Function object. | 
| //  R10: Arguments array. | 
| //  TOS(0): return address (Dart code). | 
| void StubCode::GenerateBreakpointStaticStub(Assembler* assembler) { | 
| +  const Immediate raw_null = | 
| +      Immediate(reinterpret_cast<intptr_t>(Object::null())); | 
| AssemblerMacros::EnterStubFrame(assembler); | 
| -  __ pushq(R10); | 
| -  __ pushq(RBX); | 
| +  __ pushq(R10);  // Preserve arguments descriptor. | 
| +  __ pushq(raw_null);  // Room for result. | 
| __ CallRuntime(kBreakpointStaticHandlerRuntimeEntry); | 
| -  __ popq(RBX); | 
| -  __ popq(R10); | 
| +  __ popq(RAX);  // Code object. | 
| +  __ popq(R10);  // Restore arguments descriptor. | 
| __ LeaveFrame(); | 
|  | 
| // Now call the static function. The breakpoint handler function | 
| // ensures that the call target is compiled. | 
| -  __ movq(RAX, FieldAddress(RBX, Function::code_offset())); | 
| __ movq(RBX, FieldAddress(RAX, Code::instructions_offset())); | 
| __ addq(RBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); | 
| __ jmp(RBX); | 
|  |