Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index 56d86154eb202807c5f197520378b119af94688c..d7e8b7ca8cef859aae704bdd30bd7b6c2aa8b076 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -5167,26 +5167,33 @@ void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { |
DeoptimizeIf(not_equal, instr->environment()); |
} |
- // Set up the parameters to the stub/runtime call. |
- __ PushHeapObject(literals); |
- __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); |
- // Boilerplate already exists, constant elements are never accessed. |
- // Pass an empty fixed array. |
- __ Push(isolate()->factory()->empty_fixed_array()); |
- |
- // Pick the right runtime function or stub to call. |
+ // Set up the parameters to the stub/runtime call and pick the right |
+ // runtime function or stub to call. Boilerplate already exists, |
+ // constant elements are never accessed, pass an empty fixed array. |
int length = instr->hydrogen()->length(); |
if (instr->hydrogen()->IsCopyOnWrite()) { |
ASSERT(instr->hydrogen()->depth() == 1); |
+ __ LoadHeapObject(rax, literals); |
+ __ Move(rbx, Smi::FromInt(instr->hydrogen()->literal_index())); |
+ __ Move(rcx, isolate()->factory()->empty_fixed_array()); |
FastCloneShallowArrayStub::Mode mode = |
FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS; |
FastCloneShallowArrayStub stub(mode, DONT_TRACK_ALLOCATION_SITE, length); |
CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
} else if (instr->hydrogen()->depth() > 1) { |
+ __ PushHeapObject(literals); |
+ __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); |
+ __ Push(isolate()->factory()->empty_fixed_array()); |
CallRuntime(Runtime::kCreateArrayLiteral, 3, instr); |
} else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) { |
+ __ PushHeapObject(literals); |
+ __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); |
+ __ Push(isolate()->factory()->empty_fixed_array()); |
CallRuntime(Runtime::kCreateArrayLiteralShallow, 3, instr); |
} else { |
+ __ LoadHeapObject(rax, literals); |
+ __ Move(rbx, Smi::FromInt(instr->hydrogen()->literal_index())); |
+ __ Move(rcx, isolate()->factory()->empty_fixed_array()); |
FastCloneShallowArrayStub::Mode mode = |
boilerplate_elements_kind == FAST_DOUBLE_ELEMENTS |
? FastCloneShallowArrayStub::CLONE_DOUBLE_ELEMENTS |