X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d9a64523371fa019c4575bb400cbbc3a50ac9903..refs/heads/master:/libsyscall/wrappers/string/memcpy.c diff --git a/libsyscall/wrappers/string/memcpy.c b/libsyscall/wrappers/string/memcpy.c index 53d527b6a..28920058c 100644 --- a/libsyscall/wrappers/string/memcpy.c +++ b/libsyscall/wrappers/string/memcpy.c @@ -36,10 +36,10 @@ * sizeof(word) MUST BE A POWER OF TWO * SO THAT wmask BELOW IS ALL ONES */ -typedef int word; /* "word" used for optimal copy speed */ +typedef int word; /* "word" used for optimal copy speed */ -#define wsize sizeof(word) -#define wmask (wsize - 1) +#define wsize sizeof(word) +#define wmask (wsize - 1) /* * Copy a block of memory, handling overlap. @@ -48,35 +48,38 @@ typedef int word; /* "word" used for optimal copy speed */ */ __attribute__((visibility("hidden"))) -void * _libkernel_memmove(void *dst0, const void *src0, size_t length) +void * +_libkernel_memmove(void *dst0, const void *src0, size_t length) { char *dst = dst0; const char *src = src0; size_t t; - - if (length == 0 || dst == src) /* nothing to do */ + + if (length == 0 || dst == src) { /* nothing to do */ goto done; - + } + /* * Macros: loop-t-times; and loop-t-times, t>0 */ -#define TLOOP(s) if (t) TLOOP1(s) -#define TLOOP1(s) do { s; } while (--t) - +#define TLOOP(s) if (t) TLOOP1(s) +#define TLOOP1(s) do { s; } while (--t) + if ((unsigned long)dst < (unsigned long)src) { /* * Copy forward. */ - t = (uintptr_t)src; /* only need low bits */ + t = (uintptr_t)src; /* only need low bits */ if ((t | (uintptr_t)dst) & wmask) { /* * Try to align operands. This cannot be done * unless the low bits match. */ - if ((t ^ (uintptr_t)dst) & wmask || length < wsize) + if ((t ^ (uintptr_t)dst) & wmask || length < wsize) { t = length; - else + } else { t = wsize - (t & wmask); + } length -= t; TLOOP1(*dst++ = *src++); } @@ -97,10 +100,11 @@ void * _libkernel_memmove(void *dst0, const void *src0, size_t length) dst += length; t = (uintptr_t)src; if ((t | (uintptr_t)dst) & wmask) { - if ((t ^ (uintptr_t)dst) & wmask || length <= wsize) + if ((t ^ (uintptr_t)dst) & wmask || length <= wsize) { t = length; - else + } else { t &= wmask; + } length -= t; TLOOP1(*--dst = *--src); } @@ -110,7 +114,7 @@ void * _libkernel_memmove(void *dst0, const void *src0, size_t length) TLOOP(*--dst = *--src); } done: - return (dst0); + return dst0; } __attribute__((visibility("hidden")))