S390: [stubs] Remove N-argument Hydrogen-based Array constructor stub
Port c8ac0d8693
Original commit message:
Instead, always tail call to the runtime. Also, cleanup the various versions
of the runtime call that is used for Array construction fallback. There can be
only one.
R=danno@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com, mbrandy@us.ibm.com, bjaideep@ca.ibm.com
BUG=
Review-Url: https://codereview.chromium.org/2060483002
Cr-Commit-Position: refs/heads/master@{#36904}
This commit is contained in:
parent
5d7b9ece16
commit
d86458b1bc
@ -3818,14 +3818,8 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
|
||||
DCHECK(ToRegister(instr->result()).is(r2));
|
||||
|
||||
__ mov(r2, Operand(instr->arity()));
|
||||
if (instr->arity() == 1) {
|
||||
// We only need the allocation site for the case we have a length argument.
|
||||
// The case may bail out to the runtime, which will determine the correct
|
||||
// elements kind with the site.
|
||||
__ Move(r4, instr->hydrogen()->site());
|
||||
} else {
|
||||
__ LoadRoot(r4, Heap::kUndefinedValueRootIndex);
|
||||
}
|
||||
__ Move(r4, instr->hydrogen()->site());
|
||||
|
||||
ElementsKind kind = instr->hydrogen()->elements_kind();
|
||||
AllocationSiteOverrideMode override_mode =
|
||||
(AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE)
|
||||
@ -3857,7 +3851,7 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
|
||||
CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
||||
__ bind(&done);
|
||||
} else {
|
||||
ArrayNArgumentsConstructorStub stub(isolate(), kind, override_mode);
|
||||
ArrayNArgumentsConstructorStub stub(isolate());
|
||||
CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
|
||||
}
|
||||
}
|
||||
|
@ -21,39 +21,15 @@
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
static void InitializeArrayConstructorDescriptor(
|
||||
Isolate* isolate, CodeStubDescriptor* descriptor,
|
||||
int constant_stack_parameter_count) {
|
||||
Address deopt_handler =
|
||||
Runtime::FunctionForId(Runtime::kArrayConstructor)->entry;
|
||||
#define __ ACCESS_MASM(masm)
|
||||
|
||||
if (constant_stack_parameter_count == 0) {
|
||||
descriptor->Initialize(deopt_handler, constant_stack_parameter_count,
|
||||
JS_FUNCTION_STUB_MODE);
|
||||
} else {
|
||||
descriptor->Initialize(r2, deopt_handler, constant_stack_parameter_count,
|
||||
JS_FUNCTION_STUB_MODE);
|
||||
}
|
||||
}
|
||||
|
||||
static void InitializeInternalArrayConstructorDescriptor(
|
||||
Isolate* isolate, CodeStubDescriptor* descriptor,
|
||||
int constant_stack_parameter_count) {
|
||||
Address deopt_handler =
|
||||
Runtime::FunctionForId(Runtime::kInternalArrayConstructor)->entry;
|
||||
|
||||
if (constant_stack_parameter_count == 0) {
|
||||
descriptor->Initialize(deopt_handler, constant_stack_parameter_count,
|
||||
JS_FUNCTION_STUB_MODE);
|
||||
} else {
|
||||
descriptor->Initialize(r2, deopt_handler, constant_stack_parameter_count,
|
||||
JS_FUNCTION_STUB_MODE);
|
||||
}
|
||||
}
|
||||
|
||||
void ArrayNArgumentsConstructorStub::InitializeDescriptor(
|
||||
CodeStubDescriptor* descriptor) {
|
||||
InitializeArrayConstructorDescriptor(isolate(), descriptor, -1);
|
||||
void ArrayNArgumentsConstructorStub::Generate(MacroAssembler* masm) {
|
||||
__ ShiftLeftP(r1, r2, Operand(kPointerSizeLog2));
|
||||
__ StoreP(r3, MemOperand(sp, r1));
|
||||
__ push(r3);
|
||||
__ push(r4);
|
||||
__ AddP(r2, r2, Operand(3));
|
||||
__ TailCallRuntime(Runtime::kNewArray);
|
||||
}
|
||||
|
||||
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
|
||||
@ -67,13 +43,6 @@ void FastFunctionBindStub::InitializeDescriptor(
|
||||
descriptor->Initialize(r2, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
|
||||
}
|
||||
|
||||
void InternalArrayNArgumentsConstructorStub::InitializeDescriptor(
|
||||
CodeStubDescriptor* descriptor) {
|
||||
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, -1);
|
||||
}
|
||||
|
||||
#define __ ACCESS_MASM(masm)
|
||||
|
||||
static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow,
|
||||
Condition cond);
|
||||
static void EmitSmiNonsmiComparison(MacroAssembler* masm, Register lhs,
|
||||
@ -952,7 +921,7 @@ void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) {
|
||||
CEntryStub::GenerateAheadOfTime(isolate);
|
||||
StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate);
|
||||
StubFailureTrampolineStub::GenerateAheadOfTime(isolate);
|
||||
ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate);
|
||||
CommonArrayConstructorStub::GenerateStubsAheadOfTime(isolate);
|
||||
CreateAllocationSiteStub::GenerateAheadOfTime(isolate);
|
||||
CreateWeakCellStub::GenerateAheadOfTime(isolate);
|
||||
BinaryOpICStub::GenerateAheadOfTime(isolate);
|
||||
@ -4228,17 +4197,11 @@ static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) {
|
||||
}
|
||||
}
|
||||
|
||||
void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) {
|
||||
void CommonArrayConstructorStub::GenerateStubsAheadOfTime(Isolate* isolate) {
|
||||
ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>(
|
||||
isolate);
|
||||
ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>(
|
||||
isolate);
|
||||
ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>(
|
||||
isolate);
|
||||
}
|
||||
|
||||
void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(
|
||||
Isolate* isolate) {
|
||||
ArrayNArgumentsConstructorStub stub(isolate);
|
||||
stub.GetCode();
|
||||
ElementsKind kinds[2] = {FAST_ELEMENTS, FAST_HOLEY_ELEMENTS};
|
||||
for (int i = 0; i < 2; i++) {
|
||||
// For internal arrays we only need a few things
|
||||
@ -4246,8 +4209,6 @@ void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(
|
||||
stubh1.GetCode();
|
||||
InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]);
|
||||
stubh2.GetCode();
|
||||
InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]);
|
||||
stubh3.GetCode();
|
||||
}
|
||||
}
|
||||
|
||||
@ -4265,13 +4226,15 @@ void ArrayConstructorStub::GenerateDispatchToArrayStub(
|
||||
CreateArrayDispatchOneArgument(masm, mode);
|
||||
|
||||
__ bind(¬_one_case);
|
||||
CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode);
|
||||
ArrayNArgumentsConstructorStub stub(masm->isolate());
|
||||
__ TailCallStub(&stub);
|
||||
} else if (argument_count() == NONE) {
|
||||
CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode);
|
||||
} else if (argument_count() == ONE) {
|
||||
CreateArrayDispatchOneArgument(masm, mode);
|
||||
} else if (argument_count() == MORE_THAN_ONE) {
|
||||
CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode);
|
||||
ArrayNArgumentsConstructorStub stub(masm->isolate());
|
||||
__ TailCallStub(&stub);
|
||||
} else {
|
||||
UNREACHABLE();
|
||||
}
|
||||
@ -4353,7 +4316,7 @@ void InternalArrayConstructorStub::GenerateCase(MacroAssembler* masm,
|
||||
InternalArrayNoArgumentConstructorStub stub0(isolate(), kind);
|
||||
__ TailCallStub(&stub0, lt);
|
||||
|
||||
InternalArrayNArgumentsConstructorStub stubN(isolate(), kind);
|
||||
ArrayNArgumentsConstructorStub stubN(isolate());
|
||||
__ TailCallStub(&stubN, gt);
|
||||
|
||||
if (IsFastPackedElementsKind(kind)) {
|
||||
|
@ -238,20 +238,13 @@ void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
|
||||
}
|
||||
|
||||
void ArrayConstructorDescriptor::InitializePlatformSpecific(
|
||||
void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// stack param count needs (constructor pointer, and single argument)
|
||||
Register registers[] = {r3, r4, r2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// stack param count needs (constructor pointer, and single argument)
|
||||
Register registers[] = {r3, r2};
|
||||
data->InitializePlatformSpecific(arraysize(registers), registers);
|
||||
}
|
||||
|
||||
void VarArgFunctionDescriptor::InitializePlatformSpecific(
|
||||
CallInterfaceDescriptorData* data) {
|
||||
// stack param count needs (arg count)
|
||||
|
Loading…
Reference in New Issue
Block a user