| Index: src/mips/lithium-codegen-mips.cc
|
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc
|
| index 9ae5132cf3bb8140c5b8108fb366298e2819e9cb..ca74800ff5d4a92673fd829fad82f9b26b96aaed 100644
|
| --- a/src/mips/lithium-codegen-mips.cc
|
| +++ b/src/mips/lithium-codegen-mips.cc
|
| @@ -2873,16 +2873,24 @@ 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.
|
| - __ subu(length, length, index);
|
| - __ Addu(length, length, Operand(1));
|
| - __ sll(length, length, kPointerSizeLog2);
|
| - __ Addu(at, arguments, Operand(length));
|
| - __ lw(result, MemOperand(at, 0));
|
| + 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;
|
| + __ lw(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.
|
| + __ subu(length, length, index);
|
| + __ Addu(length, length, Operand(1));
|
| + __ sll(length, length, kPointerSizeLog2);
|
| + __ Addu(at, arguments, Operand(length));
|
| + __ lw(result, MemOperand(at, 0));
|
| + }
|
| }
|
|
|
|
|
|
|