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