| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 46c87e1d62a9686627ec995c363fb87d6d7e5d41..5737d515d9518e4778e9ae064e4dda0fc88d5a73 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -2059,32 +2059,62 @@ void LCodeGen::DoDateField(LDateField* instr) {
|
| }
|
|
|
|
|
| +Operand LCodeGen::BuildSeqStringOperand(Register string,
|
| + LOperand* index,
|
| + String::Encoding encoding) {
|
| + if (index->IsConstantOperand()) {
|
| + int offset = ToRepresentation(LConstantOperand::cast(index),
|
| + Representation::Integer32());
|
| + if (encoding == String::TWO_BYTE_ENCODING) {
|
| + offset *= kUC16Size;
|
| + }
|
| + STATIC_ASSERT(kCharSize == 1);
|
| + return FieldOperand(string, SeqString::kHeaderSize + offset);
|
| + }
|
| + return FieldOperand(
|
| + string, ToRegister(index),
|
| + encoding == String::ONE_BYTE_ENCODING ? times_1 : times_2,
|
| + SeqString::kHeaderSize);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
|
| + String::Encoding encoding = instr->hydrogen()->encoding();
|
| Register string = ToRegister(instr->string());
|
| - Register index = ToRegister(instr->index());
|
| - Register value = ToRegister(instr->value());
|
| - String::Encoding encoding = instr->encoding();
|
|
|
| if (FLAG_debug_code) {
|
| - __ push(value);
|
| - __ mov(value, FieldOperand(string, HeapObject::kMapOffset));
|
| - __ movzx_b(value, FieldOperand(value, Map::kInstanceTypeOffset));
|
| + __ push(string);
|
| + __ mov(string, FieldOperand(string, HeapObject::kMapOffset));
|
| + __ movzx_b(string, FieldOperand(string, Map::kInstanceTypeOffset));
|
|
|
| - __ and_(value, Immediate(kStringRepresentationMask | kStringEncodingMask));
|
| + __ and_(string, Immediate(kStringRepresentationMask | kStringEncodingMask));
|
| static const uint32_t one_byte_seq_type = kSeqStringTag | kOneByteStringTag;
|
| static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag;
|
| - __ cmp(value, Immediate(encoding == String::ONE_BYTE_ENCODING
|
| - ? one_byte_seq_type : two_byte_seq_type));
|
| + __ cmp(string, Immediate(encoding == String::ONE_BYTE_ENCODING
|
| + ? one_byte_seq_type : two_byte_seq_type));
|
| __ Check(equal, kUnexpectedStringType);
|
| - __ pop(value);
|
| + __ pop(string);
|
| }
|
|
|
| - if (encoding == String::ONE_BYTE_ENCODING) {
|
| - __ mov_b(FieldOperand(string, index, times_1, SeqString::kHeaderSize),
|
| - value);
|
| + Operand operand = BuildSeqStringOperand(string, instr->index(), encoding);
|
| + if (instr->value()->IsConstantOperand()) {
|
| + int value = ToRepresentation(LConstantOperand::cast(instr->value()),
|
| + Representation::Integer32());
|
| + ASSERT_LE(0, value);
|
| + if (encoding == String::ONE_BYTE_ENCODING) {
|
| + ASSERT_LE(value, String::kMaxOneByteCharCode);
|
| + __ mov_b(operand, static_cast<int8_t>(value));
|
| + } else {
|
| + ASSERT_LE(value, String::kMaxUtf16CodeUnit);
|
| + __ mov_w(operand, static_cast<int16_t>(value));
|
| + }
|
| } else {
|
| - __ mov_w(FieldOperand(string, index, times_2, SeqString::kHeaderSize),
|
| - value);
|
| + Register value = ToRegister(instr->value());
|
| + if (encoding == String::ONE_BYTE_ENCODING) {
|
| + __ mov_b(operand, value);
|
| + } else {
|
| + __ mov_w(operand, value);
|
| + }
|
| }
|
| }
|
|
|
|
|