mirror of
git://git.musl-libc.org/musl
synced 2025-03-07 04:07:30 +00:00
slightly cleaner strlen, also seems to compile to better code
testing with gcc 4.6.3 on x86, -Os, the old version does a duplicate null byte check after the first loop. this is purely the compiler being stupid, but the old code was also stupid and unintuitive in how it expressed the check.
This commit is contained in:
parent
507faa63cb
commit
3f9ff1514e
@ -3,7 +3,7 @@
|
||||
#include <stdint.h>
|
||||
#include <limits.h>
|
||||
|
||||
#define ALIGN (sizeof(size_t)-1)
|
||||
#define ALIGN (sizeof(size_t))
|
||||
#define ONES ((size_t)-1/UCHAR_MAX)
|
||||
#define HIGHS (ONES * (UCHAR_MAX/2+1))
|
||||
#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
|
||||
@ -12,10 +12,8 @@ size_t strlen(const char *s)
|
||||
{
|
||||
const char *a = s;
|
||||
const size_t *w;
|
||||
for (; ((uintptr_t)s & ALIGN) && *s; s++);
|
||||
if (*s) {
|
||||
for (w = (const void *)s; !HASZERO(*w); w++);
|
||||
for (s = (const void *)w; *s; s++);
|
||||
}
|
||||
for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a;
|
||||
for (w = (const void *)s; !HASZERO(*w); w++);
|
||||
for (s = (const void *)w; *s; s++);
|
||||
return s-a;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user