Merge branch 'for-3.18-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj...
[linux/fpc-iii.git] / arch / m68k / lib / memmove.c
blob6519f7f349f665d9f2321b6c87beee45f8d15645
1 /*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file COPYING in the main directory of this archive
4 * for more details.
5 */
7 #include <linux/module.h>
8 #include <linux/string.h>
10 void *memmove(void *dest, const void *src, size_t n)
12 void *xdest = dest;
13 size_t temp;
15 if (!n)
16 return xdest;
18 if (dest < src) {
19 if ((long)dest & 1) {
20 char *cdest = dest;
21 const char *csrc = src;
22 *cdest++ = *csrc++;
23 dest = cdest;
24 src = csrc;
25 n--;
27 if (n > 2 && (long)dest & 2) {
28 short *sdest = dest;
29 const short *ssrc = src;
30 *sdest++ = *ssrc++;
31 dest = sdest;
32 src = ssrc;
33 n -= 2;
35 temp = n >> 2;
36 if (temp) {
37 long *ldest = dest;
38 const long *lsrc = src;
39 temp--;
41 *ldest++ = *lsrc++;
42 while (temp--);
43 dest = ldest;
44 src = lsrc;
46 if (n & 2) {
47 short *sdest = dest;
48 const short *ssrc = src;
49 *sdest++ = *ssrc++;
50 dest = sdest;
51 src = ssrc;
53 if (n & 1) {
54 char *cdest = dest;
55 const char *csrc = src;
56 *cdest = *csrc;
58 } else {
59 dest = (char *)dest + n;
60 src = (const char *)src + n;
61 if ((long)dest & 1) {
62 char *cdest = dest;
63 const char *csrc = src;
64 *--cdest = *--csrc;
65 dest = cdest;
66 src = csrc;
67 n--;
69 if (n > 2 && (long)dest & 2) {
70 short *sdest = dest;
71 const short *ssrc = src;
72 *--sdest = *--ssrc;
73 dest = sdest;
74 src = ssrc;
75 n -= 2;
77 temp = n >> 2;
78 if (temp) {
79 long *ldest = dest;
80 const long *lsrc = src;
81 temp--;
83 *--ldest = *--lsrc;
84 while (temp--);
85 dest = ldest;
86 src = lsrc;
88 if (n & 2) {
89 short *sdest = dest;
90 const short *ssrc = src;
91 *--sdest = *--ssrc;
92 dest = sdest;
93 src = ssrc;
95 if (n & 1) {
96 char *cdest = dest;
97 const char *csrc = src;
98 *--cdest = *--csrc;
101 return xdest;
103 EXPORT_SYMBOL(memmove);