| Index: src/mips/builtins-mips.cc
|
| diff --git a/src/mips/builtins-mips.cc b/src/mips/builtins-mips.cc
|
| index ef910db4b3f397226a66eebc3ef32cd153736717..6fed89cd566d4af1624b96b7c3535c24b7285787 100644
|
| --- a/src/mips/builtins-mips.cc
|
| +++ b/src/mips/builtins-mips.cc
|
| @@ -307,14 +307,19 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
|
|
|
| static void CallRuntimePassFunction(
|
| MacroAssembler* masm, Runtime::FunctionId function_id) {
|
| + // ----------- S t a t e -------------
|
| + // -- a1 : target function (preserved for callee)
|
| + // -- a3 : new target (preserved for callee)
|
| + // -----------------------------------
|
| +
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| - // Push a copy of the function onto the stack.
|
| - // Push call kind information and function as parameter to the runtime call.
|
| - __ Push(a1, a1);
|
| + // Push a copy of the target function and the new target.
|
| + // Push function as parameter to the runtime call.
|
| + __ Push(a1, a3, a1);
|
|
|
| __ CallRuntime(function_id, 1);
|
| - // Restore call kind information and receiver.
|
| - __ Pop(a1);
|
| + // Restore target function and new target.
|
| + __ Pop(a1, a3);
|
| }
|
|
|
|
|
| @@ -547,26 +552,28 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
| // a0: number of arguments
|
| // a1: constructor function
|
| // a2: address of last argument (caller sp)
|
| - // a3: number of arguments (smi-tagged)
|
| + // a3: new target
|
| + // t4: number of arguments (smi-tagged)
|
| // sp[0]: receiver
|
| // sp[1]: receiver
|
| // sp[2]: new.target
|
| // sp[3]: number of arguments (smi-tagged)
|
| Label loop, entry;
|
| - __ SmiTag(a3, a0);
|
| + __ SmiTag(t4, a0);
|
| __ jmp(&entry);
|
| __ bind(&loop);
|
| - __ sll(t0, a3, kPointerSizeLog2 - kSmiTagSize);
|
| + __ sll(t0, t4, kPointerSizeLog2 - kSmiTagSize);
|
| __ Addu(t0, a2, Operand(t0));
|
| __ lw(t1, MemOperand(t0));
|
| __ push(t1);
|
| __ bind(&entry);
|
| - __ Addu(a3, a3, Operand(-2));
|
| - __ Branch(&loop, greater_equal, a3, Operand(zero_reg));
|
| + __ Addu(t4, t4, Operand(-2));
|
| + __ Branch(&loop, greater_equal, t4, Operand(zero_reg));
|
|
|
| // Call the function.
|
| // a0: number of arguments
|
| // a1: constructor function
|
| + // a3: new target
|
| if (is_api_function) {
|
| __ lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset));
|
| Handle<Code> code =
|
| @@ -574,7 +581,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
| __ Call(code, RelocInfo::CODE_TARGET);
|
| } else {
|
| ParameterCount actual(a0);
|
| - __ InvokeFunction(a1, actual, CALL_FUNCTION, NullCallWrapper());
|
| + __ InvokeFunction(a1, a3, actual, CALL_FUNCTION, NullCallWrapper());
|
| }
|
|
|
| // Store offset of return address for deoptimizer.
|
| @@ -997,8 +1004,9 @@ static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) {
|
| // the runtime:
|
| // a0 - contains return address (beginning of patch sequence)
|
| // a1 - isolate
|
| + // a3 - new target
|
| RegList saved_regs =
|
| - (a0.bit() | a1.bit() | ra.bit() | fp.bit()) & ~sp.bit();
|
| + (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit();
|
| FrameScope scope(masm, StackFrame::MANUAL);
|
| __ MultiPush(saved_regs);
|
| __ PrepareCallCFunction(2, 0, a2);
|
| @@ -1036,8 +1044,9 @@ void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) {
|
| // the runtime:
|
| // a0 - contains return address (beginning of patch sequence)
|
| // a1 - isolate
|
| + // a3 - new target
|
| RegList saved_regs =
|
| - (a0.bit() | a1.bit() | ra.bit() | fp.bit()) & ~sp.bit();
|
| + (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit();
|
| FrameScope scope(masm, StackFrame::MANUAL);
|
| __ MultiPush(saved_regs);
|
| __ PrepareCallCFunction(2, 0, a2);
|
| @@ -1569,10 +1578,10 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm,
|
| __ lw(a2,
|
| FieldMemOperand(a2, SharedFunctionInfo::kFormalParameterCountOffset));
|
| __ sra(a2, a2, kSmiTagSize); // Un-tag.
|
| - __ lw(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
|
| + __ lw(t0, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
|
| ParameterCount actual(a0);
|
| ParameterCount expected(a2);
|
| - __ InvokeCode(a3, expected, actual, JUMP_FUNCTION, NullCallWrapper());
|
| + __ InvokeCode(t0, no_reg, expected, actual, JUMP_FUNCTION, NullCallWrapper());
|
|
|
| // The function is a "classConstructor", need to raise an exception.
|
| __ bind(&class_constructor);
|
|
|