From ee575e8f883b9bb683984b39cd6fc81fa6b37a6e Mon Sep 17 00:00:00 2001 From: "plind44@gmail.com" Date: Thu, 14 Nov 2013 20:35:12 +0000 Subject: [PATCH] MIPS: Handle all object types (minus smi) in load/store ICs. Port r17755 (bfef904) BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/72983002 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17762 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/stub-cache-mips.cc | 78 +++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc index 5236d87..0e5222d 100644 --- a/src/mips/stub-cache-mips.cc +++ b/src/mips/stub-cache-mips.cc @@ -1287,34 +1287,33 @@ Register StubCompiler::CheckPrototypes(Handle object, } -void LoadStubCompiler::HandlerFrontendFooter(Handle name, - Label* success, - Label* miss) { +void LoadStubCompiler::HandlerFrontendFooter(Handle name, Label* miss) { if (!miss->is_unused()) { - __ Branch(success); + Label success; + __ Branch(&success); __ bind(miss); TailCallBuiltin(masm(), MissBuiltin(kind())); + __ bind(&success); } } -void StoreStubCompiler::HandlerFrontendFooter(Handle name, - Label* success, - Label* miss) { +void StoreStubCompiler::HandlerFrontendFooter(Handle name, Label* miss) { if (!miss->is_unused()) { - __ b(success); + Label success; + __ Branch(&success); GenerateRestoreName(masm(), miss, name); TailCallBuiltin(masm(), MissBuiltin(kind())); + __ bind(&success); } } Register LoadStubCompiler::CallbackHandlerFrontend( - Handle object, + Handle object, Register object_reg, Handle holder, Handle name, - Label* success, Handle callback) { Label miss; @@ -1350,7 +1349,7 @@ Register LoadStubCompiler::CallbackHandlerFrontend( __ Branch(&miss, ne, scratch2(), Operand(callback)); } - HandlerFrontendFooter(name, success, &miss); + HandlerFrontendFooter(name, &miss); return reg; } @@ -1460,7 +1459,7 @@ void LoadStubCompiler::GenerateLoadCallback( void LoadStubCompiler::GenerateLoadInterceptor( Register holder_reg, - Handle object, + Handle object, Handle interceptor_holder, LookupResult* lookup, Handle name) { @@ -2550,11 +2549,21 @@ Handle CallStubCompiler::CompileFastApiCall( } +void StubCompiler::GenerateBooleanCheck(Register object, Label* miss) { + Label success; + // Check that the object is a boolean. + __ LoadRoot(at, Heap::kTrueValueRootIndex); + __ Branch(&success, eq, object, Operand(at)); + __ LoadRoot(at, Heap::kFalseValueRootIndex); + __ Branch(miss, ne, object, Operand(at)); + __ bind(&success); +} + + void CallStubCompiler::CompileHandlerFrontend(Handle object, Handle holder, Handle name, - CheckType check, - Label* success) { + CheckType check) { // ----------- S t a t e ------------- // -- a2 : name // -- ra : return address @@ -2630,13 +2639,8 @@ void CallStubCompiler::CompileHandlerFrontend(Handle object, break; } case BOOLEAN_CHECK: { - Label fast; - // Check that the object is a boolean. - __ LoadRoot(t0, Heap::kTrueValueRootIndex); - __ Branch(&fast, eq, a1, Operand(t0)); - __ LoadRoot(t0, Heap::kFalseValueRootIndex); - __ Branch(&miss, ne, a1, Operand(t0)); - __ bind(&fast); + GenerateBooleanCheck(a1, &miss); + // Check that the maps starting from the prototype haven't changed. GenerateDirectLoadGlobalFunctionPrototype( masm(), Context::BOOLEAN_FUNCTION_INDEX, a0, &miss); @@ -2647,12 +2651,15 @@ void CallStubCompiler::CompileHandlerFrontend(Handle object, } } - __ jmp(success); + Label success; + __ Branch(&success); // Handle call cache miss. __ bind(&miss); GenerateMissBranch(); + + __ bind(&success); } @@ -2681,10 +2688,7 @@ Handle CallStubCompiler::CompileCallConstant( if (!code.is_null()) return code; } - Label success; - - CompileHandlerFrontend(object, holder, name, check, &success); - __ bind(&success); + CompileHandlerFrontend(object, holder, name, check); CompileHandlerBackend(function); // Return the generated code. @@ -2798,9 +2802,7 @@ Handle StoreStubCompiler::CompileStoreCallback( Handle holder, Handle name, Handle callback) { - Label success; - HandlerFrontend(object, receiver(), holder, name, &success); - __ bind(&success); + HandlerFrontend(object, receiver(), holder, name); // Stub never generated for non-global objects that require access // checks. @@ -2827,9 +2829,7 @@ Handle StoreStubCompiler::CompileStoreCallback( Handle holder, Handle name, const CallOptimization& call_optimization) { - Label success; - HandlerFrontend(object, receiver(), holder, name, &success); - __ bind(&success); + HandlerFrontend(object, receiver(), holder, name); Register values[] = { value() }; GenerateFastApiCall( @@ -2925,15 +2925,12 @@ Handle StoreStubCompiler::CompileStoreInterceptor( Handle LoadStubCompiler::CompileLoadNonexistent( - Handle object, + Handle object, Handle last, Handle name, Handle global) { - Label success; + NonexistentHandlerFrontend(object, last, name, global); - NonexistentHandlerFrontend(object, last, name, &success, global); - - __ bind(&success); // Return undefined if maps of the full prototype chain is still the same. __ LoadRoot(v0, Heap::kUndefinedValueRootIndex); __ Ret(); @@ -3025,12 +3022,12 @@ void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, Handle LoadStubCompiler::CompileLoadGlobal( - Handle object, + Handle object, Handle global, Handle cell, Handle name, bool is_dont_delete) { - Label success, miss; + Label miss; HandlerFrontendHeader(object, receiver(), global, name, &miss); @@ -3044,8 +3041,7 @@ Handle LoadStubCompiler::CompileLoadGlobal( __ Branch(&miss, eq, t0, Operand(at)); } - HandlerFrontendFooter(name, &success, &miss); - __ bind(&success); + HandlerFrontendFooter(name, &miss); Counters* counters = isolate()->counters(); __ IncrementCounter(counters->named_load_global_stub(), 1, a1, a3); -- 2.7.4