From 5d7e335afd451c2c9980738a9610fdf2c7fe9943 Mon Sep 17 00:00:00 2001 From: "palfia@homejinni.com" Date: Mon, 22 Apr 2013 22:45:34 +0000 Subject: [PATCH] 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 --- src/mips/lithium-codegen-mips.cc | 26 +++++++++++++++++--------- src/mips/lithium-mips.cc | 11 +++++++++-- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 9ae5132cf..ca74800ff 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)); + } } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index fb8826b7f..41487f6d7 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -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)); } -- 2.34.1