/* * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive * for more details. */ #include <linux/module.h> #include <linux/string.h> void *memmove(void *dest, const void *src, size_t n) { void *xdest = dest; size_t temp; if (!n) return xdest; if (dest < src) { if ((long)dest & 1) { char *cdest = dest; const char *csrc = src; *cdest++ = *csrc++; dest = cdest; src = csrc; n--; } if (n > 2 && (long)dest & 2) { short *sdest = dest; const short *ssrc = src; *sdest++ = *ssrc++; dest = sdest; src = ssrc; n -= 2; } temp = n >> 2; if (temp) { long *ldest = dest; const long *lsrc = src; temp--; do *ldest++ = *lsrc++; while (temp--); dest = ldest; src = lsrc; } if (n & 2) { short *sdest = dest; const short *ssrc = src; *sdest++ = *ssrc++; dest = sdest; src = ssrc; } if (n & 1) { char *cdest = dest; const char *csrc = src; *cdest = *csrc; } } else { dest = (char *)dest + n; src = (const char *)src + n; if ((long)dest & 1) { char *cdest = dest; const char *csrc = src; *--cdest = *--csrc; dest = cdest; src = csrc; n--; } if (n > 2 && (long)dest & 2) { short *sdest = dest; const short *ssrc = src; *--sdest = *--ssrc; dest = sdest; src = ssrc; n -= 2; } temp = n >> 2; if (temp) { long *ldest = dest; const long *lsrc = src; temp--; do *--ldest = *--lsrc; while (temp--); dest = ldest; src = lsrc; } if (n & 2) { short *sdest = dest; const short *ssrc = src; *--sdest = *--ssrc; dest = sdest; src = ssrc; } if (n & 1) { char *cdest = dest; const char *csrc = src; *--cdest = *--csrc; } } return xdest; } EXPORT_SYMBOL(memmove);