| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index fbe8e171fa596967a65aff143823863b4570dca8..8eca27d77d9427f5c4fa58ae0d58e8cf4956b28c 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -1924,14 +1924,37 @@ void LCodeGen::DoDateField(LDateField* instr) {
|
| }
|
|
|
|
|
| +MemOperand LCodeGen::BuildSeqStringOperand(Register string,
|
| + LOperand* index,
|
| + String::Encoding encoding) {
|
| + if (index->IsConstantOperand()) {
|
| + int offset = ToInteger32(LConstantOperand::cast(index));
|
| + if (encoding == String::TWO_BYTE_ENCODING) {
|
| + offset *= kUC16Size;
|
| + }
|
| + STATIC_ASSERT(kCharSize == 1);
|
| + return FieldMemOperand(string, SeqString::kHeaderSize + offset);
|
| + }
|
| + Register scratch = scratch0();
|
| + ASSERT(!scratch.is(string));
|
| + ASSERT(!scratch.is(ToRegister(index)));
|
| + if (encoding == String::ONE_BYTE_ENCODING) {
|
| + __ add(scratch, string, Operand(ToRegister(index)));
|
| + } else {
|
| + STATIC_ASSERT(kUC16Size == 2);
|
| + __ add(scratch, string, Operand(ToRegister(index), LSL, 1));
|
| + }
|
| + return FieldMemOperand(scratch, SeqString::kHeaderSize);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
|
| + String::Encoding encoding = instr->hydrogen()->encoding();
|
| Register string = ToRegister(instr->string());
|
| - LOperand* index_op = instr->index();
|
| Register value = ToRegister(instr->value());
|
| - Register scratch = scratch0();
|
| - String::Encoding encoding = instr->encoding();
|
|
|
| if (FLAG_debug_code) {
|
| + Register scratch = scratch0();
|
| __ ldr(scratch, FieldMemOperand(string, HeapObject::kMapOffset));
|
| __ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset));
|
|
|
| @@ -1944,24 +1967,11 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
|
| __ Check(eq, kUnexpectedStringType);
|
| }
|
|
|
| - if (index_op->IsConstantOperand()) {
|
| - int constant_index = ToInteger32(LConstantOperand::cast(index_op));
|
| - if (encoding == String::ONE_BYTE_ENCODING) {
|
| - __ strb(value,
|
| - FieldMemOperand(string, SeqString::kHeaderSize + constant_index));
|
| - } else {
|
| - __ strh(value,
|
| - FieldMemOperand(string, SeqString::kHeaderSize + constant_index * 2));
|
| - }
|
| + MemOperand operand = BuildSeqStringOperand(string, instr->index(), encoding);
|
| + if (encoding == String::ONE_BYTE_ENCODING) {
|
| + __ strb(value, operand);
|
| } else {
|
| - Register index = ToRegister(index_op);
|
| - if (encoding == String::ONE_BYTE_ENCODING) {
|
| - __ add(scratch, string, Operand(index));
|
| - __ strb(value, FieldMemOperand(scratch, SeqString::kHeaderSize));
|
| - } else {
|
| - __ add(scratch, string, Operand(index, LSL, 1));
|
| - __ strh(value, FieldMemOperand(scratch, SeqString::kHeaderSize));
|
| - }
|
| + __ strh(value, operand);
|
| }
|
| }
|
|
|
|
|