Commit 24651e5b authored by plind44@gmail.com's avatar plind44@gmail.com

MIPS: Unify and simplify the FastCloneShallowArrayStub.

Port r20974 (5de4367)

Original commit message:
- Don't bake in length/capacity into full codegen calls of stubs,
allowing boilerplates to increase their capacity without regenerating
code.
- Unify all variants of the clone stub into a single,
length-independent version.
- Various tweaks to make sure that the clone stub doesn't spill and
therefore need an eager stack frame.
- Handle all lengths of array literals in the fast case.

BUG=
R=plind44@gmail.com

Review URL: https://codereview.chromium.org/258813002

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20991 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 584e90f5
...@@ -82,6 +82,11 @@ void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( ...@@ -82,6 +82,11 @@ void FastCloneShallowArrayStub::InitializeInterfaceDescriptor(
static Register registers[] = { a3, a2, a1 }; static Register registers[] = { a3, a2, a1 };
descriptor->register_param_count_ = 3; descriptor->register_param_count_ = 3;
descriptor->register_params_ = registers; descriptor->register_params_ = registers;
static Representation representations[] = {
Representation::Tagged(),
Representation::Smi(),
Representation::Tagged() };
descriptor->register_param_representations_ = representations;
descriptor->deoptimization_handler_ = descriptor->deoptimization_handler_ =
Runtime::FunctionForId( Runtime::FunctionForId(
Runtime::kHiddenCreateArrayLiteralStubBailout)->entry; Runtime::kHiddenCreateArrayLiteralStubBailout)->entry;
...@@ -225,6 +230,11 @@ static void InitializeArrayConstructorDescriptor( ...@@ -225,6 +230,11 @@ static void InitializeArrayConstructorDescriptor(
descriptor->stack_parameter_count_ = a0; descriptor->stack_parameter_count_ = a0;
descriptor->register_param_count_ = 3; descriptor->register_param_count_ = 3;
descriptor->register_params_ = registers_variable_args; descriptor->register_params_ = registers_variable_args;
static Representation representations[] = {
Representation::Tagged(),
Representation::Tagged(),
Representation::Integer32() };
descriptor->register_param_representations_ = representations;
} }
descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count;
...@@ -252,6 +262,10 @@ static void InitializeInternalArrayConstructorDescriptor( ...@@ -252,6 +262,10 @@ static void InitializeInternalArrayConstructorDescriptor(
descriptor->stack_parameter_count_ = a0; descriptor->stack_parameter_count_ = a0;
descriptor->register_param_count_ = 2; descriptor->register_param_count_ = 2;
descriptor->register_params_ = registers_variable_args; descriptor->register_params_ = registers_variable_args;
static Representation representations[] = {
Representation::Tagged(),
Representation::Integer32() };
descriptor->register_param_representations_ = representations;
} }
descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count;
......
...@@ -1834,33 +1834,12 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { ...@@ -1834,33 +1834,12 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
__ lw(a3, FieldMemOperand(a3, JSFunction::kLiteralsOffset)); __ lw(a3, FieldMemOperand(a3, JSFunction::kLiteralsOffset));
__ li(a2, Operand(Smi::FromInt(expr->literal_index()))); __ li(a2, Operand(Smi::FromInt(expr->literal_index())));
__ li(a1, Operand(constant_elements)); __ li(a1, Operand(constant_elements));
if (has_fast_elements && constant_elements_values->map() == if (expr->depth() > 1) {
isolate()->heap()->fixed_cow_array_map()) {
FastCloneShallowArrayStub stub(
isolate(),
FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS,
allocation_site_mode,
length);
__ CallStub(&stub);
__ IncrementCounter(isolate()->counters()->cow_arrays_created_stub(),
1, a1, a2);
} else if (expr->depth() > 1 || Serializer::enabled() ||
length > FastCloneShallowArrayStub::kMaximumInlinedCloneLength) {
__ li(a0, Operand(Smi::FromInt(flags))); __ li(a0, Operand(Smi::FromInt(flags)));
__ Push(a3, a2, a1, a0); __ Push(a3, a2, a1, a0);
__ CallRuntime(Runtime::kHiddenCreateArrayLiteral, 4); __ CallRuntime(Runtime::kHiddenCreateArrayLiteral, 4);
} else { } else {
ASSERT(IsFastSmiOrObjectElementsKind(constant_elements_kind) || FastCloneShallowArrayStub stub(isolate(), allocation_site_mode);
FLAG_smi_only_arrays);
FastCloneShallowArrayStub::Mode mode =
FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS;
if (has_fast_elements) {
mode = FastCloneShallowArrayStub::CLONE_ELEMENTS;
}
FastCloneShallowArrayStub stub(isolate(), mode, allocation_site_mode,
length);
__ CallStub(&stub); __ CallStub(&stub);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment