mirror of https://github.com/ipxe/ipxe.git
[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>pull/598/head
parent
06766875ad
commit
de20c526e6
|
@ -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)
|
* Compare strings (up to a specified length)
|
||||||
*
|
*
|
||||||
|
|
|
@ -234,17 +234,7 @@ return dest;
|
||||||
extern int strncmp ( const char *str1, const char *str2, size_t len );
|
extern int strncmp ( const char *str1, const char *str2, size_t len );
|
||||||
|
|
||||||
#define __HAVE_ARCH_STRLEN
|
#define __HAVE_ARCH_STRLEN
|
||||||
static inline size_t strlen(const char * s)
|
|
||||||
{
|
extern size_t strlen ( const char *string );
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* ETHERBOOT_BITS_STRING_H */
|
#endif /* ETHERBOOT_BITS_STRING_H */
|
||||||
|
|
Loading…
Reference in New Issue