| Index: src/a64/lithium-codegen-a64.cc
|
| diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc
|
| index 033a439513672589c0727811ac25f47fd4d984a6..11ee500c4b37eeba9996e8daefb59012dcadd729 100644
|
| --- a/src/a64/lithium-codegen-a64.cc
|
| +++ b/src/a64/lithium-codegen-a64.cc
|
| @@ -1404,27 +1404,36 @@ void LCodeGen::DoGap(LGap* gap) {
|
|
|
|
|
| void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
|
| - // TODO(all): Try to improve this, like ARM r17925.
|
| Register arguments = ToRegister(instr->arguments());
|
| Register result = ToRegister(instr->result());
|
|
|
| + // The pointer to the arguments array come from DoArgumentsElements.
|
| + // It does not point directly to the arguments and there is an offest of
|
| + // two words that we must take into account when accessing an argument.
|
| + // Subtracting the index from length accounts for one, so we add one more.
|
| +
|
| if (instr->length()->IsConstantOperand() &&
|
| instr->index()->IsConstantOperand()) {
|
| - ASSERT(instr->temp() == NULL);
|
| int index = ToInteger32(LConstantOperand::cast(instr->index()));
|
| int length = ToInteger32(LConstantOperand::cast(instr->length()));
|
| int offset = ((length - index) + 1) * kPointerSize;
|
| __ Ldr(result, MemOperand(arguments, offset));
|
| + } else if (instr->index()->IsConstantOperand()) {
|
| + Register length = ToRegister32(instr->length());
|
| + int index = ToInteger32(LConstantOperand::cast(instr->index()));
|
| + int loc = index - 1;
|
| + if (loc != 0) {
|
| + __ Sub(result.W(), length, loc);
|
| + __ Ldr(result, MemOperand(arguments, result, UXTW, kPointerSizeLog2));
|
| + } else {
|
| + __ Ldr(result, MemOperand(arguments, length, UXTW, kPointerSizeLog2));
|
| + }
|
| } else {
|
| - ASSERT(instr->temp() != NULL);
|
| - Register temp = ToRegister32(instr->temp());
|
| Register length = ToRegister32(instr->length());
|
| Operand index = ToOperand32I(instr->index());
|
| - // There are two words between the frame pointer and the last arguments.
|
| - // Subtracting from length accounts for only one, so we add one more.
|
| - __ Sub(temp, length, index);
|
| - __ Add(temp, temp, 1);
|
| - __ Ldr(result, MemOperand(arguments, temp, UXTW, kPointerSizeLog2));
|
| + __ Sub(result.W(), length, index);
|
| + __ Add(result.W(), result.W(), 1);
|
| + __ Ldr(result, MemOperand(arguments, result, UXTW, kPointerSizeLog2));
|
| }
|
| }
|
|
|
|
|