1 /* 2 ** Copyright 2001, Travis Geiselbrecht. All rights reserved. 3 ** Distributed under the terms of the NewOS License. 4 */ 5 /* 6 * Copyright (c) 2008 Travis Geiselbrecht 7 * 8 * Use of this source code is governed by a MIT-style 9 * license that can be found in the LICENSE file or at 10 * https://opensource.org/licenses/MIT 11 */ 12 #include <string.h> 13 #include <sys/types.h> 14 15 #if !_ASM_MEMMOVE 16 17 typedef long word; 18 19 #define lsize sizeof(word) 20 #define lmask (lsize - 1) 21 22 void * memmove(void * dest,void const * src,size_t count)23memmove(void *dest, void const *src, size_t count) { 24 char *d = (char *)dest; 25 const char *s = (const char *)src; 26 int len; 27 28 if (count == 0 || dest == src) 29 return dest; 30 31 if ((long)d < (long)s) { 32 if (((long)d | (long)s) & lmask) { 33 // src and/or dest do not align on word boundary 34 if ((((long)d ^ (long)s) & lmask) || (count < lsize)) 35 len = count; // copy the rest of the buffer with the byte mover 36 else 37 len = lsize - ((long)d & lmask); // move the ptrs up to a word boundary 38 39 count -= len; 40 for (; len > 0; len--) 41 *d++ = *s++; 42 } 43 for (len = count / lsize; len > 0; len--) { 44 *(word *)d = *(word *)s; 45 d += lsize; 46 s += lsize; 47 } 48 for (len = count & lmask; len > 0; len--) 49 *d++ = *s++; 50 } else { 51 d += count; 52 s += count; 53 if (((long)d | (long)s) & lmask) { 54 // src and/or dest do not align on word boundary 55 if ((((long)d ^ (long)s) & lmask) || (count <= lsize)) 56 len = count; 57 else 58 len = ((long)d & lmask); 59 60 count -= len; 61 for (; len > 0; len--) 62 *--d = *--s; 63 } 64 for (len = count / lsize; len > 0; len--) { 65 d -= lsize; 66 s -= lsize; 67 *(word *)d = *(word *)s; 68 } 69 for (len = count & lmask; len > 0; len--) 70 *--d = *--s; 71 } 72 73 return dest; 74 } 75 76 #endif 77 78