Commit 5d7e335a authored by palfia@homejinni.com's avatar palfia@homejinni.com

MIPS: Improvements in lithium code generation. Recognizing if some operands...

MIPS: Improvements in lithium code generation. Recognizing if some operands are constants, we can often save on registers and instructions.

Port r14364 (2819e5ee)

BUG=

Review URL: https://codereview.chromium.org/14159015

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14383 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent eed788a7
......@@ -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));
}
}
......
......@@ -2340,8 +2340,15 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments());
LOperand* length = UseTempRegister(instr->length());
LOperand* index = UseRegister(instr->index());
LOperand* length;
LOperand* index;
if (instr->length()->IsConstant() && instr->index()->IsConstant()) {
length = UseRegisterOrConstant(instr->length());
index = UseOrConstant(instr->index());
} else {
length = UseTempRegister(instr->length());
index = Use(instr->index());
}
return DefineAsRegister(new(zone()) LAccessArgumentsAt(args, length, index));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment