| Index: src/arm/code-stubs-arm.cc
|
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
|
| index eaad9f293b330eb0936a5dceeb45ae51bb5f840b..b42b6df6de59cccc81c4d89c7a6ead9de0035910 100644
|
| --- a/src/arm/code-stubs-arm.cc
|
| +++ b/src/arm/code-stubs-arm.cc
|
| @@ -4775,6 +4775,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
| Label flat_string;
|
| Label ascii_string;
|
| Label got_char_code;
|
| + Label sliced_string;
|
|
|
| // If the receiver is a smi trigger the non-string case.
|
| __ JumpIfSmi(object_, receiver_not_string_);
|
| @@ -4804,7 +4805,10 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
| __ b(eq, &flat_string);
|
|
|
| // Handle non-flat strings.
|
| - __ tst(result_, Operand(kIsConsStringMask));
|
| + __ and_(result_, result_, Operand(kStringRepresentationMask));
|
| + __ cmp(result_, Operand(kSlicedStringTag));
|
| + __ b(eq, &sliced_string);
|
| + __ cmp(result_, Operand(kExternalStringTag));
|
| __ b(eq, &call_runtime_);
|
|
|
| // ConsString.
|
| @@ -4824,6 +4828,15 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
| STATIC_ASSERT(kSeqStringTag == 0);
|
| __ tst(result_, Operand(kStringRepresentationMask));
|
| __ b(ne, &call_runtime_);
|
| + __ jmp(&flat_string);
|
| +
|
| + // SlicedString, unpack and add offset.
|
| + __ bind(&sliced_string);
|
| + __ ldr(result_, FieldMemOperand(object_, SlicedString::kOffsetOffset));
|
| + __ add(scratch_, scratch_, result_);
|
| + __ ldr(object_, FieldMemOperand(object_, SlicedString::kParentOffset));
|
| + __ ldr(result_, FieldMemOperand(object_, HeapObject::kMapOffset));
|
| + __ ldrb(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset));
|
|
|
| // Check for 1-byte or 2-byte string.
|
| __ bind(&flat_string);
|
| @@ -5400,10 +5413,17 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
| // Check bounds and smi-ness.
|
| Register to = r6;
|
| Register from = r7;
|
| +
|
| + __ nop(0); // Jumping as first instruction would crash the code generation.
|
| + if (FLAG_string_slices) {
|
| + __ jmp(&runtime);
|
| + }
|
| +
|
| __ Ldrd(to, from, MemOperand(sp, kToOffset));
|
| STATIC_ASSERT(kFromOffset == kToOffset + 4);
|
| STATIC_ASSERT(kSmiTag == 0);
|
| STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1);
|
| +
|
| // I.e., arithmetic shift right by one un-smi-tags.
|
| __ mov(r2, Operand(to, ASR, 1), SetCC);
|
| __ mov(r3, Operand(from, ASR, 1), SetCC, cc);
|
| @@ -5412,7 +5432,6 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
| __ b(mi, &runtime); // From is negative.
|
|
|
| // Both to and from are smis.
|
| -
|
| __ sub(r2, r2, Operand(r3), SetCC);
|
| __ b(mi, &runtime); // Fail if from > to.
|
| // Special handling of sub-strings of length 1 and 2. One character strings
|
| @@ -5918,6 +5937,8 @@ void StringAddStub::Generate(MacroAssembler* masm) {
|
| __ tst(r4, Operand(kStringRepresentationMask));
|
| __ tst(r5, Operand(kStringRepresentationMask), eq);
|
| __ b(ne, &string_add_runtime);
|
| + // We cannot encounter sliced strings here since:
|
| + STATIC_ASSERT(SlicedString::kMinLength >= String::kMinNonFlatLength);
|
| // Now check if both strings have the same encoding (ASCII/Two-byte).
|
| // r0: first string.
|
| // r1: second string.
|
|
|