| Index: src/x64/builtins-x64.cc
 | 
| diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc
 | 
| index ef3df659eb7a94d9801d4687f311000a02f9af40..ff0a349dbd2729de6f04979705a1e8f56f25dd2d 100644
 | 
| --- a/src/x64/builtins-x64.cc
 | 
| +++ b/src/x64/builtins-x64.cc
 | 
| @@ -99,6 +99,41 @@ void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +static void Generate_Runtime_NewObject(MacroAssembler* masm,
 | 
| +                                       bool create_memento,
 | 
| +                                       Register original_constructor,
 | 
| +                                       Label* count_incremented,
 | 
| +                                       Label* allocated) {
 | 
| +  int offset = 0;
 | 
| +  if (create_memento) {
 | 
| +    // Get the cell or allocation site.
 | 
| +    __ movp(rdi, Operand(rsp, kPointerSize * 2));
 | 
| +    __ Push(rdi);
 | 
| +    offset = kPointerSize;
 | 
| +  }
 | 
| +
 | 
| +  // Must restore rsi (context) and rdi (constructor) before calling runtime.
 | 
| +  __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
 | 
| +  __ movp(rdi, Operand(rsp, offset));
 | 
| +  __ Push(rdi);
 | 
| +  __ Push(original_constructor);
 | 
| +  if (create_memento) {
 | 
| +    __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 3);
 | 
| +  } else {
 | 
| +    __ CallRuntime(Runtime::kNewObject, 2);
 | 
| +  }
 | 
| +  __ movp(rbx, rax);  // store result in rbx
 | 
| +
 | 
| +  // Runtime_NewObjectWithAllocationSite increments allocation count.
 | 
| +  // Skip the increment.
 | 
| +  if (create_memento) {
 | 
| +    __ jmp(count_incremented);
 | 
| +  } else {
 | 
| +    __ jmp(allocated);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
|  static void Generate_JSConstructStubHelper(MacroAssembler* masm,
 | 
|                                             bool is_api_function,
 | 
|                                             bool create_memento) {
 | 
| @@ -106,6 +141,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
 | 
|    //  -- rax: number of arguments
 | 
|    //  -- rdi: constructor function
 | 
|    //  -- rbx: allocation site or undefined
 | 
| +  //  -- rdx: original constructor
 | 
|    // -----------------------------------
 | 
|  
 | 
|    // Should never create mementos for api functions.
 | 
| @@ -127,9 +163,16 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
 | 
|      // Push the function to invoke on the stack.
 | 
|      __ Push(rdi);
 | 
|  
 | 
| +    Label rt_call, normal_new, allocated, count_incremented;
 | 
| +    __ cmpp(rdx, rdi);
 | 
| +    __ j(equal, &normal_new);
 | 
| +
 | 
| +    Generate_Runtime_NewObject(masm, create_memento, rdx, &count_incremented,
 | 
| +                               &allocated);
 | 
| +
 | 
| +    __ bind(&normal_new);
 | 
|      // Try to allocate the object without transitioning into C code. If any of
 | 
|      // the preconditions is not met, the code bails out to the runtime call.
 | 
| -    Label rt_call, allocated;
 | 
|      if (FLAG_inline_new) {
 | 
|        Label undo_allocation;
 | 
|  
 | 
| @@ -345,32 +388,8 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
 | 
|      // Allocate the new receiver object using the runtime call.
 | 
|      // rdi: function (constructor)
 | 
|      __ bind(&rt_call);
 | 
| -    int offset = 0;
 | 
| -    if (create_memento) {
 | 
| -      // Get the cell or allocation site.
 | 
| -      __ movp(rdi, Operand(rsp, kPointerSize*2));
 | 
| -      __ Push(rdi);
 | 
| -      offset = kPointerSize;
 | 
| -    }
 | 
| -
 | 
| -    // Must restore rsi (context) and rdi (constructor) before calling runtime.
 | 
| -    __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset));
 | 
| -    __ movp(rdi, Operand(rsp, offset));
 | 
| -    __ Push(rdi);
 | 
| -    if (create_memento) {
 | 
| -      __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2);
 | 
| -    } else {
 | 
| -      __ CallRuntime(Runtime::kNewObject, 1);
 | 
| -    }
 | 
| -    __ movp(rbx, rax);  // store result in rbx
 | 
| -
 | 
| -    // If we ended up using the runtime, and we want a memento, then the
 | 
| -    // runtime call made it for us, and we shouldn't do create count
 | 
| -    // increment.
 | 
| -    Label count_incremented;
 | 
| -    if (create_memento) {
 | 
| -      __ jmp(&count_incremented);
 | 
| -    }
 | 
| +    Generate_Runtime_NewObject(masm, create_memento, rdi, &count_incremented,
 | 
| +                               &allocated);
 | 
|  
 | 
|      // New object allocated.
 | 
|      // rbx: newly allocated object
 | 
| 
 |