From f70ee5576a07d455bdcc5275b7fc9d471090bf64 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 24 May 2016 18:47:43 -0700 Subject: speed up memcpy for aligned bases but misaligned length --- util/string.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/util/string.c b/util/string.c index e896379..41855c2 100644 --- a/util/string.c +++ b/util/string.c @@ -4,17 +4,20 @@ void* memcpy(void* dest, const void* src, size_t len) { - if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { - const uintptr_t* s = src; - uintptr_t *d = dest; - while (d < (uintptr_t*)(dest + len)) - *d++ = *s++; - } else { - const char* s = src; - char *d = dest; - while (d < (char*)(dest + len)) - *d++ = *s++; + const char* s = src; + char *d = dest; + + if ((((uintptr_t)dest | (uintptr_t)src) & (sizeof(uintptr_t)-1)) == 0) { + while ((void*)d < (dest + len - (sizeof(uintptr_t)-1))) { + *(uintptr_t*)d = *(const uintptr_t*)s; + d += sizeof(uintptr_t); + s += sizeof(uintptr_t); + } } + + while (d < (char*)(dest + len)) + *d++ = *s++; + return dest; } -- cgit v1.1