Reviewers: Dmitry S. Lomov, dstence, michael_dawson,
Description:
PPC: Do not add extra argument for new.target
Port 8196c28a94f62dec026f2b564ba81d690a4ed593
Original commit message:
JSConstructStub for subclass constructors instead locates new.target in
a known location on the stack.
[email protected], [email protected], [email protected]
BUG=
Please review this at https://codereview.chromium.org/1208443002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+29, -36 lines):
M src/ppc/builtins-ppc.cc
M src/ppc/code-stubs-ppc.cc
M src/ppc/full-codegen-ppc.cc
Index: src/ppc/builtins-ppc.cc
diff --git a/src/ppc/builtins-ppc.cc b/src/ppc/builtins-ppc.cc
index
0817b523b71781143c6fd37e353bcafdfb76a720..02fc030634d10c6e39ccf96349e11e992de3ce33
100644
--- a/src/ppc/builtins-ppc.cc
+++ b/src/ppc/builtins-ppc.cc
@@ -788,8 +788,6 @@ void
Builtins::Generate_JSConstructStubForDerived(MacroAssembler* masm) {
__ bdnz(&loop);
__ bind(&no_args);
- __ addi(r3, r3, Operand(1));
-
// Handle step in.
Label skip_step_in;
ExternalReference debug_step_in_fp =
@@ -815,7 +813,8 @@ void
Builtins::Generate_JSConstructStubForDerived(MacroAssembler* masm) {
// r3: result
// sp[0]: number of arguments (smi-tagged)
__ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
- __ LoadP(r4, MemOperand(sp, 0));
+ // Get arguments count, skipping over new.target.
+ __ LoadP(r4, MemOperand(sp, kPointerSize));
// Leave construct frame.
}
Index: src/ppc/code-stubs-ppc.cc
diff --git a/src/ppc/code-stubs-ppc.cc b/src/ppc/code-stubs-ppc.cc
index
9cc2bed73e5704fc99a364f99efe0d6bc8892c1d..d84492fb292de050b305a99af14e0e74ae67962c
100644
--- a/src/ppc/code-stubs-ppc.cc
+++ b/src/ppc/code-stubs-ppc.cc
@@ -1628,7 +1628,6 @@ void LoadIndexedStringStub::Generate(MacroAssembler*
masm) {
void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
- CHECK(!has_new_target());
// The displacement is the offset of the last parameter (if any)
// relative to the frame pointer.
const int kDisplacement =
@@ -1689,8 +1688,6 @@ void
ArgumentsAccessStub::GenerateNewSloppySlow(MacroAssembler* masm) {
// sp[1] : receiver displacement
// sp[2] : function
- CHECK(!has_new_target());
-
// Check if the calling frame is an arguments adaptor frame.
Label runtime;
__ LoadP(r6, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
@@ -1721,8 +1718,6 @@ void
ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) {
// r9 : allocated object (tagged)
// r11 : mapped parameter count (tagged)
- CHECK(!has_new_target());
-
__ LoadP(r4, MemOperand(sp, 0 * kPointerSize));
// r4 = parameter count (tagged)
@@ -2005,14 +2000,6 @@ void
ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
// Patch the arguments.length and the parameters pointer.
__ bind(&adaptor_frame);
__ LoadP(r4, MemOperand(r5,
ArgumentsAdaptorFrameConstants::kLengthOffset));
- if (has_new_target()) {
- __ CmpSmiLiteral(r4, Smi::FromInt(0), r0);
- Label skip_decrement;
- __ beq(&skip_decrement);
- // Subtract 1 from smi-tagged arguments count.
- __ SubSmiLiteral(r4, r4, Smi::FromInt(1), r0);
- __ bind(&skip_decrement);
- }
__ StoreP(r4, MemOperand(sp, 0));
__ SmiToPtrArrayOffset(r6, r4);
__ add(r6, r5, r6);
Index: src/ppc/full-codegen-ppc.cc
diff --git a/src/ppc/full-codegen-ppc.cc b/src/ppc/full-codegen-ppc.cc
index
ad0b1b644b8671d17b99841c5264a1a9287ba7c7..3800759244568ff40b08aeb07e43584bc9c514fd
100644
--- a/src/ppc/full-codegen-ppc.cc
+++ b/src/ppc/full-codegen-ppc.cc
@@ -254,18 +254,35 @@ void FullCodeGenerator::Generate() {
Variable* new_target_var = scope()->new_target_var();
if (new_target_var != nullptr) {
Comment cmnt(masm_, "[ new.target");
- // new.target is parameter -2.
- int offset = 2 * kPointerSize +
- (info_->scope()->num_parameters() + 1) * kPointerSize;
- __ LoadP(r3, MemOperand(fp, offset));
+
+ // Get the frame pointer for the calling frame.
+ __ LoadP(r5, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
+
+ // Skip the arguments adaptor frame if it exists.
+ __ LoadP(r4, MemOperand(r5, StandardFrameConstants::kContextOffset));
+ __ CmpSmiLiteral(r4, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
+ Label skip;
+ __ bne(&skip);
+ __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
+ __ bind(&skip);
+
+ // Check the marker in the calling frame.
+ __ LoadP(r4, MemOperand(r5, StandardFrameConstants::kMarkerOffset));
+ __ CmpSmiLiteral(r4, Smi::FromInt(StackFrame::CONSTRUCT), r0);
+ Label non_construct_frame, done;
+
+ __ bne(&non_construct_frame);
+ __ LoadP(r3, MemOperand(r5, StandardFrameConstants::kExpressionsOffset
-
+ 2 * kPointerSize));
+ __ b(&done);
+
+ __ bind(&non_construct_frame);
+ __ LoadRoot(r3, Heap::kUndefinedValueRootIndex);
+ __ bind(&done);
+
SetVar(new_target_var, r3, r5, r6);
}
- ArgumentsAccessStub::HasNewTarget has_new_target =
- IsSubclassConstructor(info->function()->kind())
- ? ArgumentsAccessStub::HAS_NEW_TARGET
- : ArgumentsAccessStub::NO_NEW_TARGET;
-
// Possibly allocate RestParameters
int rest_index;
Variable* rest_param = scope()->rest_parameter(&rest_index);
@@ -274,10 +291,6 @@ void FullCodeGenerator::Generate() {
int num_parameters = info->scope()->num_parameters();
int offset = num_parameters * kPointerSize;
- if (has_new_target == ArgumentsAccessStub::HAS_NEW_TARGET) {
- --num_parameters;
- ++rest_index;
- }
__ addi(r6, fp, Operand(StandardFrameConstants::kCallerSPOffset +
offset));
__ LoadSmiLiteral(r5, Smi::FromInt(num_parameters));
@@ -320,7 +333,7 @@ void FullCodeGenerator::Generate() {
} else {
type = ArgumentsAccessStub::NEW_SLOPPY_FAST;
}
- ArgumentsAccessStub stub(isolate(), type, has_new_target);
+ ArgumentsAccessStub stub(isolate(), type);
__ CallStub(&stub);
SetVar(arguments, r3, r4, r5);
@@ -484,9 +497,6 @@ void FullCodeGenerator::EmitReturnSequence() {
{
Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm_);
int32_t arg_count = info_->scope()->num_parameters() + 1;
- if (IsSubclassConstructor(info_->function()->kind())) {
- arg_count++;
- }
int32_t sp_delta = arg_count * kPointerSize;
CodeGenerator::RecordPositions(masm_, function()->end_position() -
1);
__ RecordJSReturn();
@@ -4286,9 +4296,6 @@ void
FullCodeGenerator::EmitDefaultConstructorCallSuper(CallRuntime* expr) {
__ LoadP(r3, MemOperand(r5,
ArgumentsAdaptorFrameConstants::kLengthOffset));
__ SmiUntag(r3);
- // Subtract 1 from arguments count, for new.target.
- __ subi(r3, r3, Operand(1));
-
// Get arguments pointer in r5.
__ ShiftLeftImm(r0, r3, Operand(kPointerSizeLog2));
__ add(r5, r5, r0);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.