From 4ac8778b9c3f20f683f0760d4497907b84d9286c Mon Sep 17 00:00:00 2001 From: "plind44@gmail.com" Date: Mon, 3 Feb 2014 18:44:23 +0000 Subject: [PATCH] MIPS: let load and store api callbacks use global proxy as receiver. Port r19033 (c31b3e7) BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/152943002 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19040 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/stub-cache-mips.cc | 75 +++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index 840a9e1..189db80 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -769,11 +769,23 @@ static void CompileCallLoadPropertyWithInterceptor( } -static void GenerateFastApiCallBody(MacroAssembler* masm, - const CallOptimization& optimization, - int argc, - Register holder_in, - bool restore_context) { +// Generate call to api function. +static void GenerateFastApiCall(MacroAssembler* masm, + const CallOptimization& optimization, + Handle receiver_map, + Register receiver, + Register scratch_in, + int argc, + Register* values) { + ASSERT(!receiver.is(scratch_in)); + __ push(receiver); + // Write the arguments to stack frame. + for (int i = 0; i < argc; i++) { + Register arg = values[argc-1-i]; + ASSERT(!receiver.is(arg)); + ASSERT(!scratch_in.is(arg)); + __ push(arg); + } ASSERT(optimization.is_simple_api_call()); // Abi for CallApiFunctionStub. @@ -783,7 +795,21 @@ static void GenerateFastApiCallBody(MacroAssembler* masm, Register api_function_address = a1; // Put holder in place. - __ mov(holder, holder_in); + CallOptimization::HolderLookup holder_lookup; + Handle api_holder = optimization.LookupHolderOfExpectedType( + receiver_map, + &holder_lookup); + switch (holder_lookup) { + case CallOptimization::kHolderIsReceiver: + __ Move(holder, receiver); + break; + case CallOptimization::kHolderFound: + __ li(holder, api_holder); + break; + case CallOptimization::kHolderNotFound: + UNREACHABLE(); + break; + } Isolate* isolate = masm->isolate(); Handle function = optimization.constant_function(); @@ -815,37 +841,11 @@ static void GenerateFastApiCallBody(MacroAssembler* masm, __ li(api_function_address, Operand(ref)); // Jump to stub. - CallApiFunctionStub stub(restore_context, call_data_undefined, argc); + CallApiFunctionStub stub(true, call_data_undefined, argc); __ TailCallStub(&stub); } -// Generate call to api function. -static void GenerateFastApiCall(MacroAssembler* masm, - const CallOptimization& optimization, - Register receiver, - Register scratch, - int argc, - Register* values) { - ASSERT(!receiver.is(scratch)); - __ push(receiver); - // Write the arguments to stack frame. - for (int i = 0; i < argc; i++) { - Register arg = values[argc-1-i]; - ASSERT(!receiver.is(arg)); - ASSERT(!scratch.is(arg)); - __ push(arg); - } - - // Stack now matches JSFunction abi. - GenerateFastApiCallBody(masm, - optimization, - argc, - receiver, - true); -} - - void StubCompiler::GenerateTailCall(MacroAssembler* masm, Handle code) { __ Jump(code, RelocInfo::CODE_TARGET); } @@ -1062,9 +1062,11 @@ void LoadStubCompiler::GenerateLoadConstant(Handle value) { void LoadStubCompiler::GenerateLoadCallback( - const CallOptimization& call_optimization) { + const CallOptimization& call_optimization, + Handle receiver_map) { GenerateFastApiCall( - masm(), call_optimization, receiver(), scratch3(), 0, NULL); + masm(), call_optimization, receiver_map, + receiver(), scratch3(), 0, NULL); } @@ -1253,7 +1255,8 @@ Handle StoreStubCompiler::CompileStoreCallback( Register values[] = { value() }; GenerateFastApiCall( - masm(), call_optimization, receiver(), scratch3(), 1, values); + masm(), call_optimization, handle(object->map()), + receiver(), scratch3(), 1, values); // Return the generated code. return GetCode(kind(), Code::FAST, name); -- 2.7.4