Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/lib/memmove.c
10817 views
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
*/
6
7
#include <linux/module.h>
8
#include <linux/string.h>
9
10
void *memmove(void *dest, const void *src, size_t n)
11
{
12
void *xdest = dest;
13
size_t temp;
14
15
if (!n)
16
return xdest;
17
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--;
26
}
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;
34
}
35
temp = n >> 2;
36
if (temp) {
37
long *ldest = dest;
38
const long *lsrc = src;
39
temp--;
40
do
41
*ldest++ = *lsrc++;
42
while (temp--);
43
dest = ldest;
44
src = lsrc;
45
}
46
if (n & 2) {
47
short *sdest = dest;
48
const short *ssrc = src;
49
*sdest++ = *ssrc++;
50
dest = sdest;
51
src = ssrc;
52
}
53
if (n & 1) {
54
char *cdest = dest;
55
const char *csrc = src;
56
*cdest = *csrc;
57
}
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--;
68
}
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;
76
}
77
temp = n >> 2;
78
if (temp) {
79
long *ldest = dest;
80
const long *lsrc = src;
81
temp--;
82
do
83
*--ldest = *--lsrc;
84
while (temp--);
85
dest = ldest;
86
src = lsrc;
87
}
88
if (n & 2) {
89
short *sdest = dest;
90
const short *ssrc = src;
91
*--sdest = *--ssrc;
92
dest = sdest;
93
src = ssrc;
94
}
95
if (n & 1) {
96
char *cdest = dest;
97
const char *csrc = src;
98
*--cdest = *--csrc;
99
}
100
}
101
return xdest;
102
}
103
EXPORT_SYMBOL(memmove);
104
105