Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[libc] Reduce overall code size by externalising strlen()
Typical saving is 5-20 bytes in each file using strlen().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Nov 12, 2012
1 parent 0676687 commit de20c52
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 12 deletions.
18 changes: 18 additions & 0 deletions src/arch/x86/core/x86_string.c
Expand Up @@ -105,6 +105,24 @@ void * __memmove ( void *dest, const void *src, size_t len ) {
}
}

/**
* Calculate length of string
*
* @v string String
* @ret len Length (excluding NUL)
*/
size_t strlen ( const char *string ) {
const char *discard_D;
size_t len_plus_one;

__asm__ __volatile__ ( "repne scasb\n\t"
"not %1\n\t"
: "=&D" ( discard_D ), "=&c" ( len_plus_one )
: "0" ( string ), "1" ( -1UL ), "a" ( 0 ) );

return ( len_plus_one - 1 );
}

/**
* Compare strings (up to a specified length)
*
Expand Down
14 changes: 2 additions & 12 deletions src/arch/x86/include/bits/string.h
Expand Up @@ -234,17 +234,7 @@ return dest;
extern int strncmp ( const char *str1, const char *str2, size_t len );

#define __HAVE_ARCH_STRLEN
static inline size_t strlen(const char * s)
{
int d0;
register int __res;
__asm__ __volatile__(
"repne\n\t"
"scasb\n\t"
"notl %0\n\t"
"decl %0"
:"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffff));
return __res;
}

extern size_t strlen ( const char *string );

#endif /* ETHERBOOT_BITS_STRING_H */

0 comments on commit de20c52

Please sign in to comment.