Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index b26e0b435e9e4b0808491d189259b05a0347e873..6f00578d7c212f2c75cf7758238d2d259eac21a7 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -5268,77 +5268,14 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) { |
__ lw(t0, FieldMemOperand(object_, String::kLengthOffset)); |
__ Branch(index_out_of_range_, ls, t0, Operand(index_)); |
- // We need special handling for non-flat strings. |
- STATIC_ASSERT(kSeqStringTag == 0); |
- __ And(t0, result_, Operand(kStringRepresentationMask)); |
- __ Branch(&flat_string, eq, t0, Operand(zero_reg)); |
- |
- // Handle non-flat strings. |
- __ And(result_, result_, Operand(kStringRepresentationMask)); |
- STATIC_ASSERT(kConsStringTag < kExternalStringTag); |
- STATIC_ASSERT(kSlicedStringTag > kExternalStringTag); |
- __ Branch(&sliced_string, gt, result_, Operand(kExternalStringTag)); |
- __ Branch(&call_runtime_, eq, result_, Operand(kExternalStringTag)); |
- |
- // ConsString. |
- // Check whether the right hand side is the empty string (i.e. if |
- // this is really a flat string in a cons string). If that is not |
- // the case we would rather go to the runtime system now to flatten |
- // the string. |
- Label assure_seq_string; |
- __ lw(result_, FieldMemOperand(object_, ConsString::kSecondOffset)); |
- __ LoadRoot(t0, Heap::kEmptyStringRootIndex); |
- __ Branch(&call_runtime_, ne, result_, Operand(t0)); |
- |
- // Get the first of the two parts. |
- __ lw(object_, FieldMemOperand(object_, ConsString::kFirstOffset)); |
- __ jmp(&assure_seq_string); |
- |
- // SlicedString, unpack and add offset. |
- __ bind(&sliced_string); |
- __ lw(result_, FieldMemOperand(object_, SlicedString::kOffsetOffset)); |
- __ Addu(index_, index_, result_); |
- __ lw(object_, FieldMemOperand(object_, SlicedString::kParentOffset)); |
- |
- // Assure that we are dealing with a sequential string. Go to runtime if not. |
- __ bind(&assure_seq_string); |
- __ lw(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); |
- __ lbu(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); |
- // Check that parent is not an external string. Go to runtime otherwise. |
- // Note that if the original string is a cons or slice with an external |
- // string as underlying string, we pass that unpacked underlying string with |
- // the adjusted index to the runtime function. |
- STATIC_ASSERT(kSeqStringTag == 0); |
- |
- __ And(t0, result_, Operand(kStringRepresentationMask)); |
- __ Branch(&call_runtime_, ne, t0, Operand(zero_reg)); |
- |
- // Check for 1-byte or 2-byte string. |
- __ bind(&flat_string); |
- STATIC_ASSERT((kStringEncodingMask & kAsciiStringTag) != 0); |
- STATIC_ASSERT((kStringEncodingMask & kTwoByteStringTag) == 0); |
- __ And(t0, result_, Operand(kStringEncodingMask)); |
- __ Branch(&ascii_string, ne, t0, Operand(zero_reg)); |
- |
- // 2-byte string. |
- // Load the 2-byte character code into the result register. We can |
- // add without shifting since the smi tag size is the log2 of the |
- // number of bytes in a two-byte character. |
- STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize == 1 && kSmiShiftSize == 0); |
- __ Addu(index_, object_, Operand(index_)); |
- __ lhu(result_, FieldMemOperand(index_, SeqTwoByteString::kHeaderSize)); |
- __ Branch(&got_char_code); |
- |
- // ASCII string. |
- // Load the byte into the result register. |
- __ bind(&ascii_string); |
- |
- __ srl(t0, index_, kSmiTagSize); |
- __ Addu(index_, object_, t0); |
+ __ sra(index_, index_, kSmiTagSize); |
- __ lbu(result_, FieldMemOperand(index_, SeqAsciiString::kHeaderSize)); |
+ StringCharLoadGenerator::Generate(masm, |
+ object_, |
+ index_, |
+ result_, |
+ &call_runtime_); |
- __ bind(&got_char_code); |
__ sll(result_, result_, kSmiTagSize); |
__ bind(&exit_); |
} |
@@ -5387,6 +5324,7 @@ void StringCharCodeAtGenerator::GenerateSlow( |
// is too complex (e.g., when the string needs to be flattened). |
__ bind(&call_runtime_); |
call_helper.BeforeCall(masm); |
+ __ sll(index_, index_, kSmiTagSize); |
__ Push(object_, index_); |
__ CallRuntime(Runtime::kStringCharCodeAt, 2); |