diff --git a/src/builtins/ppc/builtins-ppc.cc b/src/builtins/ppc/builtins-ppc.cc index 5deb707f9f9..93eedea7464 100644 --- a/src/builtins/ppc/builtins-ppc.cc +++ b/src/builtins/ppc/builtins-ppc.cc @@ -1097,11 +1097,7 @@ static void Generate_StackOverflowCheck(MacroAssembler* masm, Register num_args, static void Generate_InterpreterPushArgs(MacroAssembler* masm, Register num_args, Register index, - Register count, Register scratch, - Label* stack_overflow) { - // A stack check before pushing arguments. - Generate_StackOverflowCheck(masm, num_args, scratch, stack_overflow); - + Register count, Register scratch) { Label loop; __ addi(index, index, Operand(kPointerSize)); // Bias up for LoadPU __ mtctr(count); @@ -1113,8 +1109,8 @@ static void Generate_InterpreterPushArgs(MacroAssembler* masm, // static void Builtins::Generate_InterpreterPushArgsThenCallImpl( - MacroAssembler* masm, TailCallMode tail_call_mode, - InterpreterPushArgsMode mode) { + MacroAssembler* masm, ConvertReceiverMode receiver_mode, + TailCallMode tail_call_mode, InterpreterPushArgsMode mode) { // ----------- S t a t e ------------- // -- r3 : the number of arguments (not including the receiver) // -- r5 : the address of the first argument to be pushed. Subsequent @@ -1127,8 +1123,16 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( // Calculate number of arguments (add one for receiver). __ addi(r6, r3, Operand(1)); + Generate_StackOverflowCheck(masm, r6, ip, &stack_overflow); + + // Push "undefined" as the receiver arg if we need to. + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + __ PushRoot(Heap::kUndefinedValueRootIndex); + __ mr(r6, r3); // Argument count is correct. + } + // Push the arguments. r5, r6, r7 will be modified. - Generate_InterpreterPushArgs(masm, r6, r5, r6, r7, &stack_overflow); + Generate_InterpreterPushArgs(masm, r6, r5, r6, r7); // Call the target. if (mode == InterpreterPushArgsMode::kJSFunction) { @@ -1172,8 +1176,9 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( Label skip; __ cmpi(r3, Operand::Zero()); __ beq(&skip); + Generate_StackOverflowCheck(masm, r3, ip, &stack_overflow); // Push the arguments. r8, r7, r9 will be modified. - Generate_InterpreterPushArgs(masm, r3, r7, r3, r8, &stack_overflow); + Generate_InterpreterPushArgs(masm, r3, r7, r3, r9); __ bind(&skip); __ AssertUndefinedOrAllocationSite(r5, r8); @@ -1216,10 +1221,14 @@ void Builtins::Generate_InterpreterPushArgsThenConstructArray( // ----------------------------------- Label stack_overflow; - __ addi(r7, r3, Operand(1)); // Add one for receiver. + // Push a slot for the receiver to be constructed. + __ li(r0, Operand::Zero()); + __ push(r0); + + Generate_StackOverflowCheck(masm, r3, ip, &stack_overflow); // Push the arguments. r6, r8, r3 will be modified. - Generate_InterpreterPushArgs(masm, r7, r6, r7, r8, &stack_overflow); + Generate_InterpreterPushArgs(masm, r3, r6, r3, r8); // Array constructor expects constructor in r6. It is same as r4 here. __ mr(r6, r4); diff --git a/src/builtins/s390/builtins-s390.cc b/src/builtins/s390/builtins-s390.cc index ea5b61ca28e..6e95477025a 100644 --- a/src/builtins/s390/builtins-s390.cc +++ b/src/builtins/s390/builtins-s390.cc @@ -1101,11 +1101,7 @@ static void Generate_StackOverflowCheck(MacroAssembler* masm, Register num_args, static void Generate_InterpreterPushArgs(MacroAssembler* masm, Register num_args, Register index, - Register count, Register scratch, - Label* stack_overflow) { - // Add a stack check before pushing arguments. - Generate_StackOverflowCheck(masm, num_args, scratch, stack_overflow); - + Register count, Register scratch) { Label loop; __ AddP(index, index, Operand(kPointerSize)); // Bias up for LoadPU __ LoadRR(r0, count); @@ -1119,8 +1115,8 @@ static void Generate_InterpreterPushArgs(MacroAssembler* masm, // static void Builtins::Generate_InterpreterPushArgsThenCallImpl( - MacroAssembler* masm, TailCallMode tail_call_mode, - InterpreterPushArgsMode mode) { + MacroAssembler* masm, ConvertReceiverMode receiver_mode, + TailCallMode tail_call_mode, InterpreterPushArgsMode mode) { // ----------- S t a t e ------------- // -- r2 : the number of arguments (not including the receiver) // -- r4 : the address of the first argument to be pushed. Subsequent @@ -1132,9 +1128,16 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( // Calculate number of arguments (AddP one for receiver). __ AddP(r5, r2, Operand(1)); + Generate_StackOverflowCheck(masm, r5, ip, &stack_overflow); + + // Push "undefined" as the receiver arg if we need to. + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + __ PushRoot(Heap::kUndefinedValueRootIndex); + __ LoadRR(r5, r2); // Argument count is correct. + } // Push the arguments. - Generate_InterpreterPushArgs(masm, r5, r4, r5, r6, &stack_overflow); + Generate_InterpreterPushArgs(masm, r5, r4, r5, r6); // Call the target. if (mode == InterpreterPushArgsMode::kJSFunction) { @@ -1178,7 +1181,8 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( Label skip; __ CmpP(r2, Operand::Zero()); __ beq(&skip); - Generate_InterpreterPushArgs(masm, r2, r6, r2, r7, &stack_overflow); + Generate_StackOverflowCheck(masm, r2, ip, &stack_overflow); + Generate_InterpreterPushArgs(masm, r2, r6, r2, r7); __ bind(&skip); __ AssertUndefinedOrAllocationSite(r4, r7); @@ -1221,10 +1225,14 @@ void Builtins::Generate_InterpreterPushArgsThenConstructArray( // ----------------------------------- Label stack_overflow; - __ AddP(r6, r2, Operand(1)); // Add one for receiver. + // Push a slot for the receiver to be constructed. + __ LoadImmP(r0, Operand::Zero()); + __ push(r0); + + Generate_StackOverflowCheck(masm, r2, ip, &stack_overflow); // Push the arguments. r6, r8, r3 will be modified. - Generate_InterpreterPushArgs(masm, r6, r5, r6, r7, &stack_overflow); + Generate_InterpreterPushArgs(masm, r6, r5, r2, r7); // Array constructor expects constructor in r5. It is same as r3 here. __ LoadRR(r5, r3);