From 34f220001dad3c3962359372ed46e64e45b899fa Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Thu, 9 Feb 2012 09:13:31 +0000 Subject: [PATCH] Simplify stackframe of construct stub on ARM and MIPS. This unifies the stackframe layout of the generic constructor stub to be in sync with ia32 and x64. There was an unecessary copy of the construct function saved on the stack which wasn't used at all. R=erik.corry@gmail.com Review URL: https://chromiumcodereview.appspot.com/9348058 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10653 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/builtins-arm.cc | 38 +++++++++++--------------------------- src/mips/builtins-mips.cc | 34 +++++++++------------------------- 2 files changed, 20 insertions(+), 52 deletions(-) diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc index 186d06e3f0..50b6bce30b 100644 --- a/src/arm/builtins-arm.cc +++ b/src/arm/builtins-arm.cc @@ -895,23 +895,15 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // r4: JSObject __ bind(&allocated); __ push(r4); + __ push(r4); - // Push the function and the allocated receiver from the stack. - // sp[0]: receiver (newly allocated object) - // sp[1]: constructor function - // sp[2]: number of arguments (smi-tagged) - __ ldr(r1, MemOperand(sp, kPointerSize)); - __ push(r1); // Constructor function. - __ push(r4); // Receiver. - - // Reload the number of arguments from the stack. - // r1: constructor function + // Reload the number of arguments and the constructor from the stack. // sp[0]: receiver - // sp[1]: constructor function - // sp[2]: receiver - // sp[3]: constructor function - // sp[4]: number of arguments (smi-tagged) - __ ldr(r3, MemOperand(sp, 4 * kPointerSize)); + // sp[1]: receiver + // sp[2]: constructor function + // sp[3]: number of arguments (smi-tagged) + __ ldr(r1, MemOperand(sp, 2 * kPointerSize)); + __ ldr(r3, MemOperand(sp, 3 * kPointerSize)); // Set up pointer to last argument. __ add(r2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); @@ -921,14 +913,13 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // Copy arguments and receiver to the expression stack. // r0: number of arguments - // r2: address of last argument (caller sp) // r1: constructor function + // r2: address of last argument (caller sp) // r3: number of arguments (smi-tagged) // sp[0]: receiver - // sp[1]: constructor function - // sp[2]: receiver - // sp[3]: constructor function - // sp[4]: number of arguments (smi-tagged) + // sp[1]: receiver + // sp[2]: constructor function + // sp[3]: number of arguments (smi-tagged) Label loop, entry; __ b(&entry); __ bind(&loop); @@ -954,13 +945,6 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, NullCallWrapper(), CALL_AS_METHOD); } - // Pop the function from the stack. - // sp[0]: constructor function - // sp[2]: receiver - // sp[3]: constructor function - // sp[4]: number of arguments (smi-tagged) - __ pop(); - // Restore context from the frame. // r0: result // sp[0]: receiver diff --git a/src/mips/builtins-mips.cc b/src/mips/builtins-mips.cc index 9b899bd047..259df211bd 100644 --- a/src/mips/builtins-mips.cc +++ b/src/mips/builtins-mips.cc @@ -923,22 +923,15 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // t4: JSObject __ bind(&allocated); __ push(t4); - - // Push the function and the allocated receiver from the stack. - // sp[0]: receiver (newly allocated object) - // sp[1]: constructor function - // sp[2]: number of arguments (smi-tagged) - __ lw(a1, MemOperand(sp, kPointerSize)); - __ MultiPushReversed(a1.bit() | t4.bit()); + __ push(t4); // Reload the number of arguments from the stack. - // a1: constructor function // sp[0]: receiver - // sp[1]: constructor function - // sp[2]: receiver - // sp[3]: constructor function - // sp[4]: number of arguments (smi-tagged) - __ lw(a3, MemOperand(sp, 4 * kPointerSize)); + // sp[1]: receiver + // sp[2]: constructor function + // sp[3]: number of arguments (smi-tagged) + __ lw(a1, MemOperand(sp, 2 * kPointerSize)); + __ lw(a3, MemOperand(sp, 3 * kPointerSize)); // Set up pointer to last argument. __ Addu(a2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); @@ -952,10 +945,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // a2: address of last argument (caller sp) // a3: number of arguments (smi-tagged) // sp[0]: receiver - // sp[1]: constructor function - // sp[2]: receiver - // sp[3]: constructor function - // sp[4]: number of arguments (smi-tagged) + // sp[1]: receiver + // sp[2]: constructor function + // sp[3]: number of arguments (smi-tagged) Label loop, entry; __ jmp(&entry); __ bind(&loop); @@ -983,14 +975,6 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, NullCallWrapper(), CALL_AS_METHOD); } - // Pop the function from the stack. - // v0: result - // sp[0]: constructor function - // sp[2]: receiver - // sp[3]: constructor function - // sp[4]: number of arguments (smi-tagged) - __ Pop(); - // Restore context from the frame. __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));