From 06766875ada566a95ff22aef2d6c7fadec4da4b8 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 4 Nov 2012 23:53:59 +0000 Subject: [PATCH] [libc] Reduce overall code size by externalising strncmp() Typical saving is 20-30 bytes in each file using strncmp(). Signed-off-by: Michael Brown --- src/arch/x86/core/x86_string.c | 38 ++++++++++++++++++++++++++++++ src/arch/x86/include/bits/string.h | 23 ++---------------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/arch/x86/core/x86_string.c b/src/arch/x86/core/x86_string.c index 59e0eaae..962a7d84 100644 --- a/src/arch/x86/core/x86_string.c +++ b/src/arch/x86/core/x86_string.c @@ -104,3 +104,41 @@ void * __memmove ( void *dest, const void *src, size_t len ) { return __memcpy_reverse ( dest, src, len ); } } + +/** + * Compare strings (up to a specified length) + * + * @v str1 First string + * @v str2 Second string + * @v len Maximum length + * @ret diff Difference + */ +int strncmp ( const char *str1, const char *str2, size_t len ) { + const void *discard_S; + const void *discard_D; + size_t discard_c; + int diff; + + __asm__ __volatile__ ( "\n1:\n\t" + "dec %2\n\t" + "js 2f\n\t" + "lodsb\n\t" + "scasb\n\t" + "jne 3f\n\t" + "testb %b3, %b3\n\t" + "jnz 1b\n\t" + /* Equal */ + "\n2:\n\t" + "xor %3, %3\n\t" + "jmp 4f\n\t" + /* Not equal; CF indicates difference */ + "\n3:\n\t" + "sbb %3, %3\n\t" + "orb $1, %b3\n\t" + "\n4:\n\t" + : "=&S" ( discard_S ), "=&D" ( discard_D ), + "=&c" ( discard_c ), "=&a" ( diff ) + : "0" ( str1 ), "1" ( str2 ), "2" ( len ) ); + + return diff; +} diff --git a/src/arch/x86/include/bits/string.h b/src/arch/x86/include/bits/string.h index 5736295a..75a1f01a 100644 --- a/src/arch/x86/include/bits/string.h +++ b/src/arch/x86/include/bits/string.h @@ -230,27 +230,8 @@ return dest; } #define __HAVE_ARCH_STRNCMP -static inline int strncmp(const char * cs,const char * ct,size_t count) -{ -register int __res; -int d0, d1, d2; -__asm__ __volatile__( - "1:\tdecl %3\n\t" - "js 2f\n\t" - "lodsb\n\t" - "scasb\n\t" - "jne 3f\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n" - "2:\txorl %%eax,%%eax\n\t" - "jmp 4f\n" - "3:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%al\n" - "4:" - :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) - :"1" (cs),"2" (ct),"3" (count)); -return __res; -} + +extern int strncmp ( const char *str1, const char *str2, size_t len ); #define __HAVE_ARCH_STRLEN static inline size_t strlen(const char * s)