diff --git a/src/crankshaft/s390/lithium-codegen-s390.cc b/src/crankshaft/s390/lithium-codegen-s390.cc index 09d4e79525..3995dfdfc4 100644 --- a/src/crankshaft/s390/lithium-codegen-s390.cc +++ b/src/crankshaft/s390/lithium-codegen-s390.cc @@ -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); } } diff --git a/src/s390/code-stubs-s390.cc b/src/s390/code-stubs-s390.cc index 247b33aefb..8c11e9f4db 100644 --- a/src/s390/code-stubs-s390.cc +++ b/src/s390/code-stubs-s390.cc @@ -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( isolate); - ArrayConstructorStubAheadOfTimeHelper( - isolate); - ArrayConstructorStubAheadOfTimeHelper( - 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(masm, mode); + ArrayNArgumentsConstructorStub stub(masm->isolate()); + __ TailCallStub(&stub); } else if (argument_count() == NONE) { CreateArrayDispatch(masm, mode); } else if (argument_count() == ONE) { CreateArrayDispatchOneArgument(masm, mode); } else if (argument_count() == MORE_THAN_ONE) { - CreateArrayDispatch(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)) { diff --git a/src/s390/interface-descriptors-s390.cc b/src/s390/interface-descriptors-s390.cc index 9140e1b22b..537aa6ba8c 100644 --- a/src/s390/interface-descriptors-s390.cc +++ b/src/s390/interface-descriptors-s390.cc @@ -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)