Skip to content

Commit

Permalink
x86/i386: Use less assembly in strlen(), speed things up a bit
Browse files Browse the repository at this point in the history
Current i386 strlen() hardcodes NOT/DEC sequence. DEC is
mentioned to be suboptimal on Core2. So, put only REPNE SCASB
sequence in assembly, compiler can do the rest.

The difference in generated code is like below (MCORE2=y):

	<strlen>:
		push   %edi
		mov    $0xffffffff,%ecx
		mov    %eax,%edi
		xor    %eax,%eax
		repnz scas %es:(%edi),%al
		not    %ecx

	-	dec    %ecx
	-	mov    %ecx,%eax
	+	lea    -0x1(%ecx),%eax

		pop    %edi
		ret

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Jan Beulich <JBeulich@suse.com>
Link: http://lkml.kernel.org/r/20111211181319.GA17097@p183.telecom.by
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Alexey Dobriyan authored and Ingo Molnar committed Dec 12, 2011
1 parent 79f1ddd commit 890890c
Showing 1 changed file with 3 additions and 5 deletions.
8 changes: 3 additions & 5 deletions arch/x86/lib/string_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,15 +164,13 @@ EXPORT_SYMBOL(strchr);
size_t strlen(const char *s)
{
int d0;
int res;
size_t res;
asm volatile("repne\n\t"
"scasb\n\t"
"notl %0\n\t"
"decl %0"
"scasb"
: "=c" (res), "=&D" (d0)
: "1" (s), "a" (0), "0" (0xffffffffu)
: "memory");
return res;
return ~res - 1;
}
EXPORT_SYMBOL(strlen);
#endif
Expand Down

0 comments on commit 890890c

Please sign in to comment.