From 85b693c9e8f84ef84be41708d80e74d427ae948c Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Thu, 17 Nov 2011 08:40:40 +0000 Subject: [PATCH] Change generated code for substring not to bail out to runtime system. There is no need to bail out to runtime system when creating sliced strings of external strings since the string content is unimportant. Review URL: http://codereview.chromium.org/8513016 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10012 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/code-stubs-arm.cc | 13 +++++-------- src/ia32/code-stubs-ia32.cc | 13 +++++-------- src/x64/code-stubs-x64.cc | 13 +++++-------- 3 files changed, 15 insertions(+), 24 deletions(-) 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);