| Index: src/ia32/builtins-ia32.cc
|
| diff --git a/src/ia32/builtins-ia32.cc b/src/ia32/builtins-ia32.cc
|
| index af591730d2f3f6e41708bdab567f23e2f880ef51..a8554616cda70696d9aac71566c1f22cbcc88dbe 100644
|
| --- a/src/ia32/builtins-ia32.cc
|
| +++ b/src/ia32/builtins-ia32.cc
|
| @@ -60,42 +60,45 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm,
|
| __ JumpToExternalReference(ExternalReference(id, masm->isolate()));
|
| }
|
|
|
| -
|
| -static void CallRuntimePassFunction(
|
| - MacroAssembler* masm, Runtime::FunctionId function_id) {
|
| +static void GenerateTailCallToReturnedCode(MacroAssembler* masm,
|
| + Runtime::FunctionId function_id) {
|
| // ----------- S t a t e -------------
|
| + // -- eax : argument count (preserved for callee)
|
| // -- edx : new target (preserved for callee)
|
| // -- edi : target function (preserved for callee)
|
| // -----------------------------------
|
| + {
|
| + FrameScope scope(masm, StackFrame::INTERNAL);
|
| + // Push the number of arguments to the callee.
|
| + __ SmiTag(eax);
|
| + __ push(eax);
|
| + // Push a copy of the target function and the new target.
|
| + __ push(edi);
|
| + __ push(edx);
|
| + // Function is also the parameter to the runtime call.
|
| + __ push(edi);
|
|
|
| - FrameScope scope(masm, StackFrame::INTERNAL);
|
| - // Push a copy of the target function and the new target.
|
| - __ push(edi);
|
| - __ push(edx);
|
| - // Function is also the parameter to the runtime call.
|
| - __ push(edi);
|
| -
|
| - __ CallRuntime(function_id, 1);
|
| - // Restore target function and new target.
|
| - __ pop(edx);
|
| - __ pop(edi);
|
| -}
|
| + __ CallRuntime(function_id, 1);
|
| + __ mov(ebx, eax);
|
|
|
| + // Restore target function and new target.
|
| + __ pop(edx);
|
| + __ pop(edi);
|
| + __ pop(eax);
|
| + __ SmiUntag(eax);
|
| + }
|
|
|
| -static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
|
| - __ mov(eax, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset));
|
| - __ mov(eax, FieldOperand(eax, SharedFunctionInfo::kCodeOffset));
|
| - __ lea(eax, FieldOperand(eax, Code::kHeaderSize));
|
| - __ jmp(eax);
|
| + __ lea(ebx, FieldOperand(ebx, Code::kHeaderSize));
|
| + __ jmp(ebx);
|
| }
|
|
|
| -
|
| -static void GenerateTailCallToReturnedCode(MacroAssembler* masm) {
|
| - __ lea(eax, FieldOperand(eax, Code::kHeaderSize));
|
| - __ jmp(eax);
|
| +static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
|
| + __ mov(ebx, FieldOperand(edi, JSFunction::kSharedFunctionInfoOffset));
|
| + __ mov(ebx, FieldOperand(ebx, SharedFunctionInfo::kCodeOffset));
|
| + __ lea(ebx, FieldOperand(ebx, Code::kHeaderSize));
|
| + __ jmp(ebx);
|
| }
|
|
|
| -
|
| void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) {
|
| // Checking whether the queued function is ready for install is optional,
|
| // since we come across interrupts and stack checks elsewhere. However,
|
| @@ -108,14 +111,12 @@ void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) {
|
| __ cmp(esp, Operand::StaticVariable(stack_limit));
|
| __ j(above_equal, &ok, Label::kNear);
|
|
|
| - CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode);
|
| - GenerateTailCallToReturnedCode(masm);
|
| + GenerateTailCallToReturnedCode(masm, Runtime::kTryInstallOptimizedCode);
|
|
|
| __ bind(&ok);
|
| GenerateTailCallToSharedCode(masm);
|
| }
|
|
|
| -
|
| static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
| bool is_api_function,
|
| bool create_implicit_receiver,
|
| @@ -848,20 +849,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);
|
| }
|
|
|
|
|
|
|