diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-01-09 16:01:58 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-01-09 16:01:58 -0800 |
commit | b41145cc84edf93c0b7ad77477a3b98753a2c6d7 (patch) | |
tree | 016eb3ee6097f9392d231c1bbb82ea2b16379b6c /system/lib/libc/musl/memcpy.c | |
parent | a48941b07c88f2aee0be9adbdabd9b4b045f7b65 (diff) |
use musl memcpy instead of out handwritten js one
Diffstat (limited to 'system/lib/libc/musl/memcpy.c')
-rw-r--r-- | system/lib/libc/musl/memcpy.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/system/lib/libc/musl/memcpy.c b/system/lib/libc/musl/memcpy.c new file mode 100644 index 00000000..8e98302f --- /dev/null +++ b/system/lib/libc/musl/memcpy.c @@ -0,0 +1,29 @@ +#include <string.h> +#include <stdlib.h> +#include <stdint.h> + +#define SS (sizeof(size_t)) +#define ALIGN (sizeof(size_t)-1) +#define ONES ((size_t)-1/UCHAR_MAX) + +void *memcpy(void *restrict dest, const void *restrict src, size_t n) +{ + unsigned char *d = dest; + const unsigned char *s = src; + + if (((uintptr_t)d & ALIGN) != ((uintptr_t)s & ALIGN)) + goto misaligned; + + for (; ((uintptr_t)d & ALIGN) && n; n--) *d++ = *s++; + if (n) { + size_t *wd = (void *)d; + const size_t *ws = (const void *)s; + + for (; n>=SS; n-=SS) *wd++ = *ws++; + d = (void *)wd; + s = (const void *)ws; +misaligned: + for (; n; n--) *d++ = *s++; + } + return dest; +} |