Skip to content

Commit

Permalink
Reland: PPC/s390 [ignition] Add call bytecodes for undefined receiver
Browse files Browse the repository at this point in the history
Port 57afd0b

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.

    Reland of https://chromium-review.googlesource.com/c/463287 after fixing
    tests in https://codereview.chromium.org/2813873002.

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/2813563006
Cr-Commit-Position: refs/heads/master@{#44589}
  • Loading branch information
bjaideep authored and Commit bot committed Apr 11, 2017
1 parent f7e76cd commit cb4ceee
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 22 deletions.
31 changes: 20 additions & 11 deletions src/builtins/ppc/builtins-ppc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
30 changes: 19 additions & 11 deletions src/builtins/s390/builtins-s390.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit cb4ceee

Please sign in to comment.