^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * License. See the file COPYING in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) void *memmove(void *dest, const void *src, size_t n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) void *xdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) size_t temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) if (!n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) return xdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) if (dest < src) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) if ((long)dest & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) char *cdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) const char *csrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *cdest++ = *csrc++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) dest = cdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) src = csrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) n--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) if (n > 2 && (long)dest & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) short *sdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) const short *ssrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *sdest++ = *ssrc++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) dest = sdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) src = ssrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) n -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) temp = n >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) if (temp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) long *ldest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) const long *lsrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) temp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) *ldest++ = *lsrc++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) while (temp--);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) dest = ldest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) src = lsrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (n & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) short *sdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) const short *ssrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) *sdest++ = *ssrc++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) dest = sdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) src = ssrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (n & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) char *cdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) const char *csrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) *cdest = *csrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) dest = (char *)dest + n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) src = (const char *)src + n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if ((long)dest & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) char *cdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) const char *csrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *--cdest = *--csrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) dest = cdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) src = csrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) n--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (n > 2 && (long)dest & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) short *sdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) const short *ssrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) *--sdest = *--ssrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) dest = sdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) src = ssrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) n -= 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) temp = n >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (temp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) long *ldest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) const long *lsrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) temp--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) *--ldest = *--lsrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) while (temp--);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) dest = ldest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) src = lsrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (n & 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) short *sdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) const short *ssrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) *--sdest = *--ssrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) dest = sdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) src = ssrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (n & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) char *cdest = dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) const char *csrc = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) *--cdest = *--csrc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return xdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) EXPORT_SYMBOL(memmove);