Index: src/x64/builtins-x64.cc |
diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc |
index 32a57398a62980fc357f3d490e4917b6b2752593..d8e73b83d7eaf2c82da41bd2b4921b4b523ad9d3 100644 |
--- a/src/x64/builtins-x64.cc |
+++ b/src/x64/builtins-x64.cc |
@@ -60,27 +60,6 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, |
} |
-static void CallRuntimePassFunction( |
- MacroAssembler* masm, Runtime::FunctionId function_id) { |
- // ----------- S t a t e ------------- |
- // -- rdx : new target (preserved for callee) |
- // -- rdi : target function (preserved for callee) |
- // ----------------------------------- |
- |
- FrameScope scope(masm, StackFrame::INTERNAL); |
- // Push a copy of the target function and the new target. |
- __ Push(rdi); |
- __ Push(rdx); |
- // Function is also the parameter to the runtime call. |
- __ Push(rdi); |
- |
- __ CallRuntime(function_id, 1); |
- // Restore target function and new target. |
- __ Pop(rdx); |
- __ Pop(rdi); |
-} |
- |
- |
static void GenerateTailCallToSharedCode(MacroAssembler* masm) { |
__ movp(kScratchRegister, |
FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
@@ -90,10 +69,35 @@ static void GenerateTailCallToSharedCode(MacroAssembler* masm) { |
__ jmp(kScratchRegister); |
} |
+static void GenerateTailCallToReturnedCode(MacroAssembler* masm, |
+ Runtime::FunctionId function_id) { |
+ // ----------- S t a t e ------------- |
+ // -- rax : argument count (preserved for callee) |
+ // -- rdx : new target (preserved for callee) |
+ // -- rdi : target function (preserved for callee) |
+ // ----------------------------------- |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ // Push the number of arguments to the callee. |
+ __ Integer32ToSmi(rax, rax); |
+ __ Push(rax); |
+ // Push a copy of the target function and the new target. |
+ __ Push(rdi); |
+ __ Push(rdx); |
+ // Function is also the parameter to the runtime call. |
+ __ Push(rdi); |
-static void GenerateTailCallToReturnedCode(MacroAssembler* masm) { |
- __ leap(rax, FieldOperand(rax, Code::kHeaderSize)); |
- __ jmp(rax); |
+ __ CallRuntime(function_id, 1); |
+ __ movp(rbx, rax); |
+ |
+ // Restore target function and new target. |
+ __ Pop(rdx); |
+ __ Pop(rdi); |
+ __ Pop(rax); |
+ __ SmiToInteger32(rax, rax); |
+ } |
+ __ leap(rbx, FieldOperand(rbx, Code::kHeaderSize)); |
+ __ jmp(rbx); |
} |
@@ -107,8 +111,7 @@ void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) { |
__ CompareRoot(rsp, Heap::kStackLimitRootIndex); |
__ j(above_equal, &ok); |
- CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); |
- GenerateTailCallToReturnedCode(masm); |
+ GenerateTailCallToReturnedCode(masm, Runtime::kTryInstallOptimizedCode); |
__ bind(&ok); |
GenerateTailCallToSharedCode(masm); |
@@ -900,20 +903,18 @@ void Builtins::Generate_InterpreterEnterBytecodeDispatch(MacroAssembler* masm) { |
void Builtins::Generate_CompileLazy(MacroAssembler* masm) { |
- CallRuntimePassFunction(masm, Runtime::kCompileLazy); |
- GenerateTailCallToReturnedCode(masm); |
+ GenerateTailCallToReturnedCode(masm, Runtime::kCompileLazy); |
} |
void Builtins::Generate_CompileOptimized(MacroAssembler* masm) { |
- CallRuntimePassFunction(masm, Runtime::kCompileOptimized_NotConcurrent); |
- GenerateTailCallToReturnedCode(masm); |
+ GenerateTailCallToReturnedCode(masm, |
+ Runtime::kCompileOptimized_NotConcurrent); |
} |
void Builtins::Generate_CompileOptimizedConcurrent(MacroAssembler* masm) { |
- CallRuntimePassFunction(masm, Runtime::kCompileOptimized_Concurrent); |
- GenerateTailCallToReturnedCode(masm); |
+ GenerateTailCallToReturnedCode(masm, Runtime::kCompileOptimized_Concurrent); |
} |