| Index: src/x64/stub-cache-x64.cc
 | 
| diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc
 | 
| index 499ccdf24caeadb9b648cf5a846633241de815e6..889392ae4ff85dab2dfe4e4b098f28af972c49b7 100644
 | 
| --- a/src/x64/stub-cache-x64.cc
 | 
| +++ b/src/x64/stub-cache-x64.cc
 | 
| @@ -1200,34 +1200,33 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name,
 | 
| -                                             Label* success,
 | 
| -                                             Label* miss) {
 | 
| +void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) {
 | 
|    if (!miss->is_unused()) {
 | 
| -    __ jmp(success);
 | 
| +    Label success;
 | 
| +    __ jmp(&success);
 | 
|      __ bind(miss);
 | 
|      TailCallBuiltin(masm(), MissBuiltin(kind()));
 | 
| +    __ bind(&success);
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name,
 | 
| -                                              Label* success,
 | 
| -                                              Label* miss) {
 | 
| +void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, Label* miss) {
 | 
|    if (!miss->is_unused()) {
 | 
| -    __ jmp(success);
 | 
| +    Label success;
 | 
| +    __ jmp(&success);
 | 
|      GenerateRestoreName(masm(), miss, name);
 | 
|      TailCallBuiltin(masm(), MissBuiltin(kind()));
 | 
| +    __ bind(&success);
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  
 | 
|  Register LoadStubCompiler::CallbackHandlerFrontend(
 | 
| -    Handle<JSObject> object,
 | 
| +    Handle<Object> object,
 | 
|      Register object_reg,
 | 
|      Handle<JSObject> holder,
 | 
|      Handle<Name> name,
 | 
| -    Label* success,
 | 
|      Handle<Object> callback) {
 | 
|    Label miss;
 | 
|  
 | 
| @@ -1268,7 +1267,7 @@ Register LoadStubCompiler::CallbackHandlerFrontend(
 | 
|      __ j(not_equal, &miss);
 | 
|    }
 | 
|  
 | 
| -  HandlerFrontendFooter(name, success, &miss);
 | 
| +  HandlerFrontendFooter(name, &miss);
 | 
|    return reg;
 | 
|  }
 | 
|  
 | 
| @@ -1389,7 +1388,7 @@ void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) {
 | 
|  
 | 
|  void LoadStubCompiler::GenerateLoadInterceptor(
 | 
|      Register holder_reg,
 | 
| -    Handle<JSObject> object,
 | 
| +    Handle<Object> object,
 | 
|      Handle<JSObject> interceptor_holder,
 | 
|      LookupResult* lookup,
 | 
|      Handle<Name> name) {
 | 
| @@ -2507,11 +2506,21 @@ Handle<Code> CallStubCompiler::CompileFastApiCall(
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void StubCompiler::GenerateBooleanCheck(Register object, Label* miss) {
 | 
| +  Label success;
 | 
| +  // Check that the object is a boolean.
 | 
| +  __ CompareRoot(object, Heap::kTrueValueRootIndex);
 | 
| +  __ j(equal, &success);
 | 
| +  __ CompareRoot(object, Heap::kFalseValueRootIndex);
 | 
| +  __ j(not_equal, miss);
 | 
| +  __ bind(&success);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object,
 | 
|                                                Handle<JSObject> holder,
 | 
|                                                Handle<Name> name,
 | 
| -                                              CheckType check,
 | 
| -                                              Label* success) {
 | 
| +                                              CheckType check) {
 | 
|    // ----------- S t a t e -------------
 | 
|    // rcx                 : function name
 | 
|    // rsp[0]              : return address
 | 
| @@ -2593,13 +2602,7 @@ void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object,
 | 
|        break;
 | 
|      }
 | 
|      case BOOLEAN_CHECK: {
 | 
| -      Label fast;
 | 
| -      // Check that the object is a boolean.
 | 
| -      __ CompareRoot(rdx, Heap::kTrueValueRootIndex);
 | 
| -      __ j(equal, &fast);
 | 
| -      __ CompareRoot(rdx, Heap::kFalseValueRootIndex);
 | 
| -      __ j(not_equal, &miss);
 | 
| -      __ bind(&fast);
 | 
| +      GenerateBooleanCheck(rdx, &miss);
 | 
|        // Check that the maps starting from the prototype haven't changed.
 | 
|        GenerateDirectLoadGlobalFunctionPrototype(
 | 
|            masm(), Context::BOOLEAN_FUNCTION_INDEX, rax, &miss);
 | 
| @@ -2610,11 +2613,14 @@ void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object,
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  __ jmp(success);
 | 
| +  Label success;
 | 
| +  __ jmp(&success);
 | 
|  
 | 
|    // Handle call cache miss.
 | 
|    __ bind(&miss);
 | 
|    GenerateMissBranch();
 | 
| +
 | 
| +  __ bind(&success);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -2643,10 +2649,7 @@ Handle<Code> 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.
 | 
| @@ -2782,9 +2785,7 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
 | 
|      Handle<JSObject> holder,
 | 
|      Handle<Name> name,
 | 
|      Handle<ExecutableAccessorInfo> callback) {
 | 
| -  Label success;
 | 
| -  HandlerFrontend(object, receiver(), holder, name, &success);
 | 
| -  __ bind(&success);
 | 
| +  HandlerFrontend(object, receiver(), holder, name);
 | 
|  
 | 
|    __ PopReturnAddressTo(scratch1());
 | 
|    __ push(receiver());
 | 
| @@ -2808,9 +2809,7 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
 | 
|      Handle<JSObject> holder,
 | 
|      Handle<Name> name,
 | 
|      const CallOptimization& call_optimization) {
 | 
| -  Label success;
 | 
| -  HandlerFrontend(object, receiver(), holder, name, &success);
 | 
| -  __ bind(&success);
 | 
| +  HandlerFrontend(object, receiver(), holder, name);
 | 
|  
 | 
|    Register values[] = { value() };
 | 
|    GenerateFastApiCall(
 | 
| @@ -2924,15 +2923,12 @@ Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic(
 | 
|  
 | 
|  
 | 
|  Handle<Code> LoadStubCompiler::CompileLoadNonexistent(
 | 
| -    Handle<JSObject> object,
 | 
| +    Handle<Object> object,
 | 
|      Handle<JSObject> last,
 | 
|      Handle<Name> name,
 | 
|      Handle<JSGlobalObject> 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 are still the
 | 
|    // same and no global property with this name contains a value.
 | 
|    __ LoadRoot(rax, Heap::kUndefinedValueRootIndex);
 | 
| @@ -3027,12 +3023,12 @@ void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm,
 | 
|  
 | 
|  
 | 
|  Handle<Code> LoadStubCompiler::CompileLoadGlobal(
 | 
| -    Handle<JSObject> object,
 | 
| +    Handle<Object> object,
 | 
|      Handle<GlobalObject> global,
 | 
|      Handle<PropertyCell> cell,
 | 
|      Handle<Name> name,
 | 
|      bool is_dont_delete) {
 | 
| -  Label success, miss;
 | 
| +  Label miss;
 | 
|    // TODO(verwaest): Directly store to rax. Currently we cannot do this, since
 | 
|    // rax is used as receiver(), which we would otherwise clobber before a
 | 
|    // potential miss.
 | 
| @@ -3051,8 +3047,7 @@ Handle<Code> LoadStubCompiler::CompileLoadGlobal(
 | 
|      __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
 | 
|    }
 | 
|  
 | 
| -  HandlerFrontendFooter(name, &success, &miss);
 | 
| -  __ bind(&success);
 | 
| +  HandlerFrontendFooter(name, &miss);
 | 
|  
 | 
|    Counters* counters = isolate()->counters();
 | 
|    __ IncrementCounter(counters->named_load_global_stub(), 1);
 | 
| 
 |