1 // Copyright 2016 The Fuchsia Authors
2 // Copyright (c) 2008 Travis Geiselbrecht
3 //
4 // Use of this source code is governed by a MIT-style
5 // license that can be found in the LICENSE file or at
6 // https://opensource.org/licenses/MIT
7 
8 #include <string.h>
9 #include <sys/types.h>
10 
11 
12 #if !_ASM_MEMCPY
13 
14 typedef long word;
15 
16 #define lsize sizeof(word)
17 #define lmask (lsize - 1)
18 
memcpy(void * dest,const void * src,size_t count)19 void *memcpy(void *dest, const void *src, size_t count)
20 {
21     char *d = (char *)dest;
22     const char *s = (const char *)src;
23     int len;
24 
25     if (count == 0 || dest == src)
26         return dest;
27 
28     if (((long)d | (long)s) & lmask) {
29         // src and/or dest do not align on word boundary
30         if ((((long)d ^ (long)s) & lmask) || (count < lsize))
31             len = count; // copy the rest of the buffer with the byte mover
32         else
33             len = lsize - ((long)d & lmask); // move the ptrs up to a word boundary
34 
35         count -= len;
36         for (; len > 0; len--)
37             *d++ = *s++;
38     }
39     for (len = count / lsize; len > 0; len--) {
40         *(word *)d = *(word *)s;
41         d += lsize;
42         s += lsize;
43     }
44     for (len = count & lmask; len > 0; len--)
45         *d++ = *s++;
46 
47     return dest;
48 }
49 
50 #endif
51