From 0cfa52d055586fe632564812e0a05b2a65612b90 Mon Sep 17 00:00:00 2001 From: "chunyang.dai" Date: Wed, 9 Sep 2015 22:40:25 -0700 Subject: [PATCH] X87: [runtime] Replace many buggy uses of %_CallFunction with %_Call. port db2ba190dba6983b94eae36e111b0feebb97587e (r30634). original commit message: The semantics of the %_CallFunction intrinsic seem to be very unclear, which resulted in a lot of bugs. Especially the combination with %IsSloppyModeFunction is always a bug, because the receiver would be wrapped in the wrong context. So the %IsSloppyModeFunction helper is gone now, and many of the buggy uses of %_CallFunction are also eliminated. If you ever need to call something with a different receiver, then %_Call is your friend now. It does what you want and implements the call sequence fully (and correct). Review URL: https://codereview.chromium.org/1336443002 Cr-Commit-Position: refs/heads/master@{#30667} --- src/full-codegen/x87/full-codegen-x87.cc | 22 +++++++++++++++++++++- src/x87/interface-descriptors-x87.cc | 9 +++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/full-codegen/x87/full-codegen-x87.cc b/src/full-codegen/x87/full-codegen-x87.cc index 8ebe6d9c0b..27ea66e664 100644 --- a/src/full-codegen/x87/full-codegen-x87.cc +++ b/src/full-codegen/x87/full-codegen-x87.cc @@ -3955,6 +3955,26 @@ void FullCodeGenerator::EmitStringAdd(CallRuntime* expr) { } +void FullCodeGenerator::EmitCall(CallRuntime* expr) { + ZoneList* args = expr->arguments(); + DCHECK_LE(2, args->length()); + // Push target, receiver and arguments onto the stack. + for (Expression* const arg : *args) { + VisitForStackValue(arg); + } + // Move target to edi. + int const argc = args->length() - 2; + __ mov(edi, Operand(esp, (argc + 1) * kPointerSize)); + // Call the target. + __ mov(eax, Immediate(argc)); + __ Call(isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); + // Restore context register. + __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); + // Discard the function left on TOS. + context()->DropAndPlug(1, eax); +} + + void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) { ZoneList* args = expr->arguments(); DCHECK(args->length() >= 2); @@ -3980,7 +4000,7 @@ void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) { __ bind(&runtime); __ push(eax); - __ CallRuntime(Runtime::kCall, args->length()); + __ CallRuntime(Runtime::kCallFunction, args->length()); __ bind(&done); context()->Plug(eax); diff --git a/src/x87/interface-descriptors-x87.cc b/src/x87/interface-descriptors-x87.cc index 3ffccd3b71..23119d6ea5 100644 --- a/src/x87/interface-descriptors-x87.cc +++ b/src/x87/interface-descriptors-x87.cc @@ -198,6 +198,15 @@ void CallConstructDescriptor::InitializePlatformSpecific( } +void CallTrampolineDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + // eax : number of arguments + // edi : the target to call + Register registers[] = {edi, eax}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + + void RegExpConstructResultDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {ecx, ebx, eax};