| /* | |
| * 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); |