|  | /* | 
|  | * 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. | 
|  | */ | 
|  |  | 
|  | #define __IN_STRING_C | 
|  |  | 
|  | #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); |