This source file includes following definitions.
- __memcpy_b
- __memcpy_q
- __memcpy_l
- __memcpy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <linux/types.h>
16
17 static inline void __memcpy_b(unsigned long d, unsigned long s, long n)
18 {
19 while (--n >= 0)
20 *(char *) (d++) = *(char *) (s++);
21 }
22
23 static inline void __memcpy_q(unsigned long d, unsigned long s, long n)
24 {
25
26 while (d & 7) {
27 if (--n < 0)
28 return;
29 *(char *) d = *(char *) s;
30 d++;
31 s++;
32 }
33 while ((n -= 8) >= 0) {
34 *(unsigned long *) d = *(unsigned long *) s;
35 d += 8;
36 s += 8;
37 }
38
39 __memcpy_b(d,s,n+8);
40 }
41
42 static inline void __memcpy_l(unsigned long d, unsigned long s, long n)
43 {
44 while (d & 3) {
45 if (--n < 0)
46 return;
47 *(char *) d = *(char *) s;
48 d++;
49 s++;
50 }
51 while ((n -= 4) >= 0) {
52 *(unsigned int *) d = *(unsigned int *) s;
53 d += 4;
54 s += 4;
55 }
56 __memcpy_b(d,s,n+4);
57 }
58
59 void * __memcpy(void * dest, const void *src, size_t n)
60 {
61 unsigned long differ;
62 differ = ((unsigned long) dest ^ (unsigned long) src) & 7;
63
64 if (!differ) {
65 __memcpy_q((unsigned long) dest, (unsigned long) src, n);
66 return dest;
67 }
68 if (differ == 4) {
69 __memcpy_l((unsigned long) dest, (unsigned long) src, n);
70 return dest;
71 }
72 __memcpy_b((unsigned long) dest, (unsigned long) src, n);
73 return dest;
74 }