Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/lib/memcpy.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 *memcpy(void *to, const void *from, size_t n)
11
{
12
void *xto = to;
13
size_t temp, temp1;
14
15
if (!n)
16
return xto;
17
if ((long)to & 1) {
18
char *cto = to;
19
const char *cfrom = from;
20
*cto++ = *cfrom++;
21
to = cto;
22
from = cfrom;
23
n--;
24
}
25
if (n > 2 && (long)to & 2) {
26
short *sto = to;
27
const short *sfrom = from;
28
*sto++ = *sfrom++;
29
to = sto;
30
from = sfrom;
31
n -= 2;
32
}
33
temp = n >> 2;
34
if (temp) {
35
long *lto = to;
36
const long *lfrom = from;
37
#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)
38
for (; temp; temp--)
39
*lto++ = *lfrom++;
40
#else
41
asm volatile (
42
" movel %2,%3\n"
43
" andw #7,%3\n"
44
" lsrl #3,%2\n"
45
" negw %3\n"
46
" jmp %%pc@(1f,%3:w:2)\n"
47
"4: movel %0@+,%1@+\n"
48
" movel %0@+,%1@+\n"
49
" movel %0@+,%1@+\n"
50
" movel %0@+,%1@+\n"
51
" movel %0@+,%1@+\n"
52
" movel %0@+,%1@+\n"
53
" movel %0@+,%1@+\n"
54
" movel %0@+,%1@+\n"
55
"1: dbra %2,4b\n"
56
" clrw %2\n"
57
" subql #1,%2\n"
58
" jpl 4b"
59
: "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1)
60
: "0" (lfrom), "1" (lto), "2" (temp));
61
#endif
62
to = lto;
63
from = lfrom;
64
}
65
if (n & 2) {
66
short *sto = to;
67
const short *sfrom = from;
68
*sto++ = *sfrom++;
69
to = sto;
70
from = sfrom;
71
}
72
if (n & 1) {
73
char *cto = to;
74
const char *cfrom = from;
75
*cto = *cfrom;
76
}
77
return xto;
78
}
79
EXPORT_SYMBOL(memcpy);
80
81