diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index b37855b8e0..9e6f7596e7 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -5815,15 +5815,12 @@ void SubStringStub::Generate(MacroAssembler* masm) { // r3: from index (untagged smi) // r6 (a.k.a. to): to (smi) // r7 (a.k.a. from): from offset (smi) - Label allocate_slice, sliced_string, seq_string; - STATIC_ASSERT(kSeqStringTag == 0); - __ tst(r1, Operand(kStringRepresentationMask)); - __ b(eq, &seq_string); + Label allocate_slice, sliced_string, seq_or_external_string; + // If the string is not indirect, it can only be sequential or external. STATIC_ASSERT(kIsIndirectStringMask == (kSlicedStringTag & kConsStringTag)); STATIC_ASSERT(kIsIndirectStringMask != 0); __ tst(r1, Operand(kIsIndirectStringMask)); - // External string. Jump to runtime. - __ b(eq, &runtime); + __ b(eq, &seq_or_external_string); __ tst(r1, Operand(kSlicedNotConsMask)); __ b(ne, &sliced_string); @@ -5842,8 +5839,8 @@ void SubStringStub::Generate(MacroAssembler* masm) { __ ldr(r5, FieldMemOperand(r0, SlicedString::kParentOffset)); __ jmp(&allocate_slice); - __ bind(&seq_string); - // Sequential string. Just move string to the right register. + __ bind(&seq_or_external_string); + // Sequential or external string. Just move string to the correct register. __ mov(r5, r0); __ bind(&allocate_slice); diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc index 23bea4f856..8d30447b94 100644 --- a/src/ia32/code-stubs-ia32.cc +++ b/src/ia32/code-stubs-ia32.cc @@ -5973,18 +5973,15 @@ void SubStringStub::Generate(MacroAssembler* masm) { // ebx: instance type // ecx: sub string length // edx: from index (smi) - Label allocate_slice, sliced_string, seq_string; + Label allocate_slice, sliced_string, seq_or_external_string; __ cmp(ecx, SlicedString::kMinLength); // Short slice. Copy instead of slicing. __ j(less, ©_routine); - STATIC_ASSERT(kSeqStringTag == 0); - __ test(ebx, Immediate(kStringRepresentationMask)); - __ j(zero, &seq_string, Label::kNear); + // If the string is not indirect, it can only be sequential or external. STATIC_ASSERT(kIsIndirectStringMask == (kSlicedStringTag & kConsStringTag)); STATIC_ASSERT(kIsIndirectStringMask != 0); __ test(ebx, Immediate(kIsIndirectStringMask)); - // External string. Jump to runtime. - __ j(zero, &runtime); + __ j(zero, &seq_or_external_string, Label::kNear); Factory* factory = masm->isolate()->factory(); __ test(ebx, Immediate(kSlicedNotConsMask)); @@ -6002,8 +5999,8 @@ void SubStringStub::Generate(MacroAssembler* masm) { __ mov(edi, FieldOperand(eax, SlicedString::kParentOffset)); __ jmp(&allocate_slice, Label::kNear); - __ bind(&seq_string); - // Sequential string. Just move string to the right register. + __ bind(&seq_or_external_string); + // Sequential or external string. Just move string to the correct register. __ mov(edi, eax); __ bind(&allocate_slice); diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index bf50869ed9..62be27e643 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -4912,18 +4912,15 @@ void SubStringStub::Generate(MacroAssembler* masm) { // rbx: instance type // rcx: sub string length // rdx: from index (smi) - Label allocate_slice, sliced_string, seq_string; + Label allocate_slice, sliced_string, seq_or_external_string; __ cmpq(rcx, Immediate(SlicedString::kMinLength)); // Short slice. Copy instead of slicing. __ j(less, ©_routine); - STATIC_ASSERT(kSeqStringTag == 0); - __ testb(rbx, Immediate(kStringRepresentationMask)); - __ j(zero, &seq_string, Label::kNear); + // If the string is not indirect, it can only be sequential or external. STATIC_ASSERT(kIsIndirectStringMask == (kSlicedStringTag & kConsStringTag)); STATIC_ASSERT(kIsIndirectStringMask != 0); __ testb(rbx, Immediate(kIsIndirectStringMask)); - // External string. Jump to runtime. - __ j(zero, &runtime); + __ j(zero, &seq_or_external_string, Label::kNear); __ testb(rbx, Immediate(kSlicedNotConsMask)); __ j(not_zero, &sliced_string, Label::kNear); @@ -4940,8 +4937,8 @@ void SubStringStub::Generate(MacroAssembler* masm) { __ movq(rdi, FieldOperand(rax, SlicedString::kParentOffset)); __ jmp(&allocate_slice, Label::kNear); - __ bind(&seq_string); - // Sequential string. Just move string to the right register. + __ bind(&seq_or_external_string); + // Sequential or external string. Just move string to the correct register. __ movq(rdi, rax); __ bind(&allocate_slice);