| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 3e8fd5c72fb582ac662e6be50f6172ff97f91739..74e65c03e4e83f00a09496cc1711be2f9fe37f9d 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -2561,6 +2561,7 @@ void LCodeGen::DoReturn(LReturn* instr) {
|
| rcx);
|
| } else {
|
| Register reg = ToRegister(instr->parameter_count());
|
| + __ SmiToInteger32(reg, reg);
|
| Register return_addr_reg = reg.is(rcx) ? rbx : rcx;
|
| __ pop(return_addr_reg);
|
| __ shl(reg, Immediate(kPointerSizeLog2));
|
| @@ -3898,9 +3899,18 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
|
|
|
| __ Set(rax, instr->arity());
|
| __ Move(rbx, instr->hydrogen()->property_cell());
|
| - Handle<Code> array_construct_code =
|
| - isolate()->builtins()->ArrayConstructCode();
|
| - CallCode(array_construct_code, RelocInfo::CONSTRUCT_CALL, instr);
|
| + Object* cell_value = instr->hydrogen()->property_cell()->value();
|
| + ElementsKind kind = static_cast<ElementsKind>(Smi::cast(cell_value)->value());
|
| + if (instr->arity() == 0) {
|
| + ArrayNoArgumentConstructorStub stub(kind);
|
| + CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| + } else if (instr->arity() == 1) {
|
| + ArraySingleArgumentConstructorStub stub(kind);
|
| + CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| + } else {
|
| + ArrayNArgumentsConstructorStub stub(kind);
|
| + CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| + }
|
| }
|
|
|
|
|
|
|