Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/i386: Use less assembly in strlen(), speed things up a bit

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>

authored by

Alexey Dobriyan and committed by
Ingo Molnar
890890cb 79f1ddd0

+3 -5
+3 -5
arch/x86/lib/string_32.c
··· 164 164 size_t strlen(const char *s) 165 165 { 166 166 int d0; 167 - int res; 167 + size_t res; 168 168 asm volatile("repne\n\t" 169 - "scasb\n\t" 170 - "notl %0\n\t" 171 - "decl %0" 169 + "scasb" 172 170 : "=c" (res), "=&D" (d0) 173 171 : "1" (s), "a" (0), "0" (0xffffffffu) 174 172 : "memory"); 175 - return res; 173 + return ~res - 1; 176 174 } 177 175 EXPORT_SYMBOL(strlen); 178 176 #endif