From: plind44@gmail.com Date: Fri, 13 Sep 2013 15:22:45 +0000 (+0000) Subject: MIPS: Improve SeqStringSetChar implementation. X-Git-Tag: upstream/4.7.83~12496 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=23fc6218cb59661cd6fa253f72d66c74ea691ce8;p=platform%2Fupstream%2Fv8.git MIPS: Improve SeqStringSetChar implementation. Port r16707 (a25d669) TEST=/test/mjsunit/lithium/SeqStringSetChar.js BUG= R=plind44@gmail.com Review URL: https://codereview.chromium.org/23484043 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16720 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index b37c7e0..6659b6c 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -1789,33 +1789,43 @@ void LCodeGen::DoDateField(LDateField* instr) { void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) { Register string = ToRegister(instr->string()); - Register index = ToRegister(instr->index()); + LOperand* index_op = instr->index(); Register value = ToRegister(instr->value()); Register scratch = scratch0(); String::Encoding encoding = instr->encoding(); if (FLAG_debug_code) { - __ lw(at, FieldMemOperand(string, HeapObject::kMapOffset)); - __ lbu(at, FieldMemOperand(at, Map::kInstanceTypeOffset)); + __ lw(scratch, FieldMemOperand(string, HeapObject::kMapOffset)); + __ lbu(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); - __ And(at, at, Operand(kStringRepresentationMask | kStringEncodingMask)); + __ And(scratch, scratch, + Operand(kStringRepresentationMask | kStringEncodingMask)); static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag; static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag; - __ Subu(at, at, Operand(encoding == String::ONE_BYTE_ENCODING + __ Subu(at, scratch, Operand(encoding == String::ONE_BYTE_ENCODING ? one_byte_seq_type : two_byte_seq_type)); __ Check(eq, kUnexpectedStringType, at, Operand(zero_reg)); } - __ Addu(scratch, - string, - Operand(SeqString::kHeaderSize - kHeapObjectTag)); - if (encoding == String::ONE_BYTE_ENCODING) { - __ Addu(at, scratch, index); - __ sb(value, MemOperand(at)); + if (index_op->IsConstantOperand()) { + int constant_index = ToInteger32(LConstantOperand::cast(index_op)); + if (encoding == String::ONE_BYTE_ENCODING) { + __ sb(value, + FieldMemOperand(string, SeqString::kHeaderSize + constant_index)); + } else { + __ sh(value, + FieldMemOperand(string, SeqString::kHeaderSize + constant_index * 2)); + } } else { - __ sll(at, index, 1); - __ Addu(at, scratch, at); - __ sh(value, MemOperand(at)); + Register index = ToRegister(index_op); + if (encoding == String::ONE_BYTE_ENCODING) { + __ Addu(scratch, string, Operand(index)); + __ sb(value, FieldMemOperand(scratch, SeqString::kHeaderSize)); + } else { + __ sll(scratch, index, 1); + __ Addu(scratch, string, scratch); + __ sh(value, FieldMemOperand(scratch, SeqString::kHeaderSize)); + } } } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 4dc8022..38134f4 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1783,11 +1783,9 @@ LInstruction* LChunkBuilder::DoDateField(HDateField* instr) { LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) { LOperand* string = UseRegister(instr->string()); - LOperand* index = UseRegister(instr->index()); - LOperand* value = UseTempRegister(instr->value()); - LSeqStringSetChar* result = - new(zone()) LSeqStringSetChar(instr->encoding(), string, index, value); - return DefineAsRegister(result); + LOperand* index = UseRegisterOrConstant(instr->index()); + LOperand* value = UseRegister(instr->value()); + return new(zone()) LSeqStringSetChar(instr->encoding(), string, index, value); }