PPC/s390: [ignition] Add call bytecodes for undefined receiver
Port 751e893591
Original Commit Message:
Adds a collection of call bytecodes which have an implicit undefined
receiver argument, for cases such as global calls where we know that the
receiver has to be undefined. This way we can skip an LdaUndefined,
decrease bytecode register pressure, and set a more accurate
ConvertReceiverMode on the interpreter and TurboFan call.
As a side effect, the "normal" Call bytecode now becomes a rare case
(only with calls and super property calls), so we get rid of its 0-2
argument special cases and modify CallProperty[N] to use the
NotNullOrUndefined ConvertReceiverMode.
R=leszeks@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=
LOG=N
Review-Url: https://codereview.chromium.org/2809743003
Cr-Commit-Position: refs/heads/master@{#44539}
This commit is contained in:
parent
c252e3986e
commit
41b228057f
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user