| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index ec63d8460b0dc63a660189babc68564acaa77731..d9afd54733088eb0e5a6946ffb88e6b65426f2ad 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -36,6 +36,12 @@ namespace v8 {
|
| namespace internal {
|
|
|
|
|
| +static SaveFPRegsMode GetSaveFPRegsMode() {
|
| + // We don't need to save floating point regs when generating the snapshot
|
| + return !Serializer::enabled() ? kSaveFPRegs : kDontSaveFPRegs;
|
| +}
|
| +
|
| +
|
| class SafepointGenerator : public CallWrapper {
|
| public:
|
| SafepointGenerator(LCodeGen* codegen,
|
| @@ -2943,19 +2949,19 @@ void LCodeGen::DoReturn(LReturn* instr) {
|
| if (NeedsEagerFrame()) {
|
| __ mov(sp, fp);
|
| __ ldm(ia_w, sp, fp.bit() | lr.bit());
|
| -
|
| - if (instr->has_constant_parameter_count()) {
|
| - int parameter_count = ToInteger32(instr->constant_parameter_count());
|
| - int32_t sp_delta = (parameter_count + 1) * kPointerSize;
|
| - if (sp_delta != 0) {
|
| - __ add(sp, sp, Operand(sp_delta));
|
| - }
|
| - } else {
|
| - Register reg = ToRegister(instr->parameter_count());
|
| - __ add(reg, reg, Operand(1));
|
| - __ add(sp, sp, Operand(reg, LSL, kPointerSizeLog2));
|
| + }
|
| + if (instr->has_constant_parameter_count()) {
|
| + int parameter_count = ToInteger32(instr->constant_parameter_count());
|
| + int32_t sp_delta = (parameter_count + 1) * kPointerSize;
|
| + if (sp_delta != 0) {
|
| + __ add(sp, sp, Operand(sp_delta));
|
| }
|
| + } else {
|
| + Register reg = ToRegister(instr->parameter_count());
|
| + __ SmiUntag(reg); // it is a smi
|
| + __ add(sp, sp, Operand(reg, LSL, kPointerSizeLog2));
|
| }
|
| +
|
| __ Jump(lr);
|
| }
|
|
|
| @@ -3066,7 +3072,7 @@ void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
|
| value,
|
| scratch,
|
| GetLinkRegisterState(),
|
| - kSaveFPRegs,
|
| + GetSaveFPRegsMode(),
|
| EMIT_REMEMBERED_SET,
|
| check_needed);
|
| }
|
| @@ -3273,14 +3279,22 @@ void LCodeGen::DoLoadExternalArrayPointer(
|
|
|
| void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
|
| Register arguments = ToRegister(instr->arguments());
|
| - Register length = ToRegister(instr->length());
|
| - Register index = ToRegister(instr->index());
|
| Register result = ToRegister(instr->result());
|
| - // There are two words between the frame pointer and the last argument.
|
| - // Subtracting from length accounts for one of them add one more.
|
| - __ sub(length, length, index);
|
| - __ add(length, length, Operand(1));
|
| - __ ldr(result, MemOperand(arguments, length, LSL, kPointerSizeLog2));
|
| + if (instr->length()->IsConstantOperand() &&
|
| + instr->index()->IsConstantOperand()) {
|
| + int const_index = ToInteger32(LConstantOperand::cast(instr->index()));
|
| + int const_length = ToInteger32(LConstantOperand::cast(instr->length()));
|
| + int index = (const_length - const_index) + 1;
|
| + __ ldr(result, MemOperand(arguments, index * kPointerSize));
|
| + } else {
|
| + Register length = ToRegister(instr->length());
|
| + Register index = ToRegister(instr->index());
|
| + // There are two words between the frame pointer and the last argument.
|
| + // Subtracting from length accounts for one of them add one more.
|
| + __ sub(length, length, index);
|
| + __ add(length, length, Operand(1));
|
| + __ ldr(result, MemOperand(arguments, length, LSL, kPointerSizeLog2));
|
| + }
|
| }
|
|
|
|
|
| @@ -4217,10 +4231,18 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
|
|
|
| __ mov(r0, Operand(instr->arity()));
|
| __ mov(r2, Operand(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);
|
| + }
|
| }
|
|
|
|
|
| @@ -4255,7 +4277,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
| scratch,
|
| temp,
|
| GetLinkRegisterState(),
|
| - kSaveFPRegs,
|
| + GetSaveFPRegsMode(),
|
| OMIT_REMEMBERED_SET,
|
| OMIT_SMI_CHECK);
|
| }
|
| @@ -4274,7 +4296,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
| value,
|
| scratch,
|
| GetLinkRegisterState(),
|
| - kSaveFPRegs,
|
| + GetSaveFPRegsMode(),
|
| EMIT_REMEMBERED_SET,
|
| check_needed);
|
| }
|
| @@ -4289,7 +4311,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
|
| value,
|
| object,
|
| GetLinkRegisterState(),
|
| - kSaveFPRegs,
|
| + GetSaveFPRegsMode(),
|
| EMIT_REMEMBERED_SET,
|
| check_needed);
|
| }
|
| @@ -4484,7 +4506,7 @@ void LCodeGen::DoStoreKeyedFixedArray(LStoreKeyed* instr) {
|
| key,
|
| value,
|
| GetLinkRegisterState(),
|
| - kSaveFPRegs,
|
| + GetSaveFPRegsMode(),
|
| EMIT_REMEMBERED_SET,
|
| check_needed);
|
| }
|
|
|