| Index: src/x64/builtins-x64.cc | 
| diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc | 
| index d738261a1b84ad3240c52d2f64cb122864f6baa5..d301f04f1976e9fcba68ce344ed2e125e3c1df95 100644 | 
| --- a/src/x64/builtins-x64.cc | 
| +++ b/src/x64/builtins-x64.cc | 
| @@ -610,62 +610,16 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { | 
| __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); | 
| __ j(not_equal, &non_function); | 
|  | 
| -  // 3a. Patch the first argument if necessary when calling a function. | 
| -  Label shift_arguments; | 
| -  { Label convert_to_object, use_global_receiver, patch_receiver; | 
| -    // Change context eagerly in case we need the global receiver. | 
| -    __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 
| - | 
| -    __ movq(rbx, Operand(rsp, rax, times_pointer_size, 0)); | 
| -    __ JumpIfSmi(rbx, &convert_to_object); | 
| - | 
| -    __ CompareRoot(rbx, Heap::kNullValueRootIndex); | 
| -    __ j(equal, &use_global_receiver); | 
| -    __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex); | 
| -    __ j(equal, &use_global_receiver); | 
| - | 
| -    __ CmpObjectType(rbx, FIRST_JS_OBJECT_TYPE, rcx); | 
| -    __ j(below, &convert_to_object); | 
| -    __ CmpInstanceType(rcx, LAST_JS_OBJECT_TYPE); | 
| -    __ j(below_equal, &shift_arguments); | 
| - | 
| -    __ bind(&convert_to_object); | 
| -    __ EnterInternalFrame();  // In order to preserve argument count. | 
| -    __ Integer32ToSmi(rax, rax); | 
| -    __ push(rax); | 
| - | 
| -    __ push(rbx); | 
| -    __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); | 
| -    __ movq(rbx, rax); | 
| - | 
| -    __ pop(rax); | 
| -    __ SmiToInteger32(rax, rax); | 
| -    __ LeaveInternalFrame(); | 
| -    // Restore the function to rdi. | 
| -    __ movq(rdi, Operand(rsp, rax, times_pointer_size, 1 * kPointerSize)); | 
| -    __ jmp(&patch_receiver); | 
| - | 
| -    // Use the global receiver object from the called function as the | 
| -    // receiver. | 
| -    __ bind(&use_global_receiver); | 
| -    const int kGlobalIndex = | 
| -        Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize; | 
| -    __ movq(rbx, FieldOperand(rsi, kGlobalIndex)); | 
| -    __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalContextOffset)); | 
| -    __ movq(rbx, FieldOperand(rbx, kGlobalIndex)); | 
| -    __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalReceiverOffset)); | 
| - | 
| -    __ bind(&patch_receiver); | 
| -    __ movq(Operand(rsp, rax, times_pointer_size, 0), rbx); | 
| - | 
| -    __ jmp(&shift_arguments); | 
| -  } | 
| +  // Change context eagerly in case we need the global receiver. | 
| +  __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 
|  | 
| +  Label shift_arguments; | 
| +  __ jmp(&shift_arguments); | 
|  | 
| -  // 3b. Patch the first argument when calling a non-function.  The | 
| -  //     CALL_NON_FUNCTION builtin expects the non-function callee as | 
| -  //     receiver, so overwrite the first argument which will ultimately | 
| -  //     become the receiver. | 
| +  // 3. Patch the first argument when calling a non-function.  The | 
| +  //    CALL_NON_FUNCTION builtin expects the non-function callee as | 
| +  //    receiver, so overwrite the first argument which will ultimately | 
| +  //    become the receiver. | 
| __ bind(&non_function); | 
| __ movq(Operand(rsp, rax, times_pointer_size, 0), rdi); | 
| __ Set(rdi, 0); | 
| @@ -769,40 +723,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { | 
| __ movq(rdi, Operand(rbp, kFunctionOffset)); | 
| __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 
|  | 
| -  // Compute the receiver. | 
| -  Label call_to_object, use_global_receiver, push_receiver; | 
| -  __ movq(rbx, Operand(rbp, kReceiverOffset)); | 
| -  __ JumpIfSmi(rbx, &call_to_object); | 
| -  __ CompareRoot(rbx, Heap::kNullValueRootIndex); | 
| -  __ j(equal, &use_global_receiver); | 
| -  __ CompareRoot(rbx, Heap::kUndefinedValueRootIndex); | 
| -  __ j(equal, &use_global_receiver); | 
| - | 
| -  // If given receiver is already a JavaScript object then there's no | 
| -  // reason for converting it. | 
| -  __ CmpObjectType(rbx, FIRST_JS_OBJECT_TYPE, rcx); | 
| -  __ j(below, &call_to_object); | 
| -  __ CmpInstanceType(rcx, LAST_JS_OBJECT_TYPE); | 
| -  __ j(below_equal, &push_receiver); | 
| - | 
| -  // Convert the receiver to an object. | 
| -  __ bind(&call_to_object); | 
| -  __ push(rbx); | 
| -  __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); | 
| -  __ movq(rbx, rax); | 
| -  __ jmp(&push_receiver); | 
| - | 
| -  // Use the current global receiver object as the receiver. | 
| -  __ bind(&use_global_receiver); | 
| -  const int kGlobalOffset = | 
| -      Context::kHeaderSize + Context::GLOBAL_INDEX * kPointerSize; | 
| -  __ movq(rbx, FieldOperand(rsi, kGlobalOffset)); | 
| -  __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalContextOffset)); | 
| -  __ movq(rbx, FieldOperand(rbx, kGlobalOffset)); | 
| -  __ movq(rbx, FieldOperand(rbx, GlobalObject::kGlobalReceiverOffset)); | 
| - | 
| // Push the receiver. | 
| -  __ bind(&push_receiver); | 
| +  __ movq(rbx, Operand(rbp, kReceiverOffset)); | 
| __ push(rbx); | 
|  | 
| // Copy all arguments from the array to the stack. | 
|  |