From 38d1b5c71eaa8c65caed21e17538797cc091741b Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Wed, 11 Jun 2014 14:09:05 +0000 Subject: [PATCH] X87: Simplify string copy in SubStringStub. port r21756. original commit message: The optimizations are unnecessary since the maximum string length they operate on is currently 12. R=yangguo@chromium.org, bmeurer@chromium.org BUG=352155 LOG=N Review URL: https://codereview.chromium.org/326353002 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21772 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/code-stubs-x87.cc | 71 +++++++++++---------------------------- src/x87/code-stubs-x87.h | 12 +++---- 2 files changed, 26 insertions(+), 57 deletions(-) diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc index b1bad0e230..bfebd4bada 100644 --- a/src/x87/code-stubs-x87.cc +++ b/src/x87/code-stubs-x87.cc @@ -2855,18 +2855,12 @@ void StringCharFromCodeGenerator::GenerateSlow( } -void StringHelper::GenerateCopyCharactersREP(MacroAssembler* masm, - Register dest, - Register src, - Register count, - Register scratch, - bool ascii) { - // Copy characters using rep movs of doublewords. - // The destination is aligned on a 4 byte boundary because we are - // copying to the beginning of a newly allocated string. - ASSERT(dest.is(edi)); // rep movs destination - ASSERT(src.is(esi)); // rep movs source - ASSERT(count.is(ecx)); // rep movs count +void StringHelper::GenerateCopyCharacters(MacroAssembler* masm, + Register dest, + Register src, + Register count, + Register scratch, + String::Encoding encoding) { ASSERT(!scratch.is(dest)); ASSERT(!scratch.is(src)); ASSERT(!scratch.is(count)); @@ -2877,38 +2871,17 @@ void StringHelper::GenerateCopyCharactersREP(MacroAssembler* masm, __ j(zero, &done); // Make count the number of bytes to copy. - if (!ascii) { + if (encoding == String::TWO_BYTE_ENCODING) { __ shl(count, 1); } - // Don't enter the rep movs if there are less than 4 bytes to copy. - Label last_bytes; - __ test(count, Immediate(~3)); - __ j(zero, &last_bytes, Label::kNear); - - // Copy from edi to esi using rep movs instruction. - __ mov(scratch, count); - __ sar(count, 2); // Number of doublewords to copy. - __ cld(); - __ rep_movs(); - - // Find number of bytes left. - __ mov(count, scratch); - __ and_(count, 3); - - // Check if there are more bytes to copy. - __ bind(&last_bytes); - __ test(count, count); - __ j(zero, &done); - - // Copy remaining characters. Label loop; __ bind(&loop); __ mov_b(scratch, Operand(src, 0)); __ mov_b(Operand(dest, 0), scratch); - __ add(src, Immediate(1)); - __ add(dest, Immediate(1)); - __ sub(count, Immediate(1)); + __ inc(src); + __ inc(dest); + __ dec(count); __ j(not_zero, &loop); __ bind(&done); @@ -3137,23 +3110,21 @@ void SubStringStub::Generate(MacroAssembler* masm) { // eax: result string // ecx: result string length - __ mov(edx, esi); // esi used by following code. // Locate first character of result. __ mov(edi, eax); __ add(edi, Immediate(SeqOneByteString::kHeaderSize - kHeapObjectTag)); // Load string argument and locate character of sub string start. - __ pop(esi); + __ pop(edx); __ pop(ebx); __ SmiUntag(ebx); - __ lea(esi, FieldOperand(esi, ebx, times_1, SeqOneByteString::kHeaderSize)); + __ lea(edx, FieldOperand(edx, ebx, times_1, SeqOneByteString::kHeaderSize)); // eax: result string // ecx: result length - // edx: original value of esi // edi: first character of result - // esi: character of sub string start - StringHelper::GenerateCopyCharactersREP(masm, edi, esi, ecx, ebx, true); - __ mov(esi, edx); // Restore esi. + // edx: character of sub string start + StringHelper::GenerateCopyCharacters( + masm, edi, edx, ecx, ebx, String::ONE_BYTE_ENCODING); __ IncrementCounter(counters->sub_string_native(), 1); __ ret(3 * kPointerSize); @@ -3163,27 +3134,25 @@ void SubStringStub::Generate(MacroAssembler* masm) { // eax: result string // ecx: result string length - __ mov(edx, esi); // esi used by following code. // Locate first character of result. __ mov(edi, eax); __ add(edi, Immediate(SeqTwoByteString::kHeaderSize - kHeapObjectTag)); // Load string argument and locate character of sub string start. - __ pop(esi); + __ pop(edx); __ pop(ebx); // As from is a smi it is 2 times the value which matches the size of a two // byte character. STATIC_ASSERT(kSmiTag == 0); STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1); - __ lea(esi, FieldOperand(esi, ebx, times_1, SeqTwoByteString::kHeaderSize)); + __ lea(edx, FieldOperand(edx, ebx, times_1, SeqTwoByteString::kHeaderSize)); // eax: result string // ecx: result length - // edx: original value of esi // edi: first character of result - // esi: character of sub string start - StringHelper::GenerateCopyCharactersREP(masm, edi, esi, ecx, ebx, false); - __ mov(esi, edx); // Restore esi. + // edx: character of sub string start + StringHelper::GenerateCopyCharacters( + masm, edi, edx, ecx, ebx, String::TWO_BYTE_ENCODING); __ IncrementCounter(counters->sub_string_native(), 1); __ ret(3 * kPointerSize); diff --git a/src/x87/code-stubs-x87.h b/src/x87/code-stubs-x87.h index 1d10f2b452..13ab10ffbd 100644 --- a/src/x87/code-stubs-x87.h +++ b/src/x87/code-stubs-x87.h @@ -38,12 +38,12 @@ class StringHelper : public AllStatic { // Generate code for copying characters using the rep movs instruction. // Copies ecx characters from esi to edi. Copying of overlapping regions is // not supported. - static void GenerateCopyCharactersREP(MacroAssembler* masm, - Register dest, // Must be edi. - Register src, // Must be esi. - Register count, // Must be ecx. - Register scratch, // Neither of above. - bool ascii); + static void GenerateCopyCharacters(MacroAssembler* masm, + Register dest, + Register src, + Register count, + Register scratch, + String::Encoding encoding); // Generate string hash. static void GenerateHashInit(MacroAssembler* masm,