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( ...@@ -2873,16 +2873,24 @@ void LCodeGen::DoLoadExternalArrayPointer(
void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) { void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
Register arguments = ToRegister(instr->arguments()); Register arguments = ToRegister(instr->arguments());
Register length = ToRegister(instr->length());
Register index = ToRegister(instr->index());
Register result = ToRegister(instr->result()); Register result = ToRegister(instr->result());
// There are two words between the frame pointer and the last argument. if (instr->length()->IsConstantOperand() &&
// Subtracting from length accounts for one of them, add one more. instr->index()->IsConstantOperand()) {
__ subu(length, length, index); int const_index = ToInteger32(LConstantOperand::cast(instr->index()));
__ Addu(length, length, Operand(1)); int const_length = ToInteger32(LConstantOperand::cast(instr->length()));
__ sll(length, length, kPointerSizeLog2); int index = (const_length - const_index) + 1;
__ Addu(at, arguments, Operand(length)); __ lw(result, MemOperand(arguments, index * kPointerSize));
__ lw(result, MemOperand(at, 0)); } 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) { ...@@ -2340,8 +2340,15 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame(); info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments()); LOperand* args = UseRegister(instr->arguments());
LOperand* length = UseTempRegister(instr->length()); LOperand* length;
LOperand* index = UseRegister(instr->index()); 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)); 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