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
This commit is contained in:
parent
08f69647d3
commit
85b693c9e8
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user