]> Pileus Git - ~andy/linux/blob - arch/x86/lib/memcpy_32.c
x86, mem: Optimize memcpy by avoiding memory false dependece
[~andy/linux] / arch / x86 / lib / memcpy_32.c
1 #include <linux/string.h>
2 #include <linux/module.h>
3
4 #undef memcpy
5 #undef memset
6
7 void *memcpy(void *to, const void *from, size_t n)
8 {
9 #ifdef CONFIG_X86_USE_3DNOW
10         return __memcpy3d(to, from, n);
11 #else
12         return __memcpy(to, from, n);
13 #endif
14 }
15 EXPORT_SYMBOL(memcpy);
16
17 void *memset(void *s, int c, size_t count)
18 {
19         return __memset(s, c, count);
20 }
21 EXPORT_SYMBOL(memset);
22
23 void *memmove(void *dest, const void *src, size_t n)
24 {
25         int d0, d1, d2;
26
27         if (dest < src) {
28                 if ((dest + n) < src)
29                          return memcpy(dest, src, n);
30                 else
31                         __asm__ __volatile__(
32                                 "rep\n\t"
33                                 "movsb\n\t"
34                                 : "=&c" (d0), "=&S" (d1), "=&D" (d2)
35                                 :"0" (n),
36                                  "1" (src),
37                                  "2" (dest)
38                                 :"memory");
39         } else {
40                 if((src + n) < dest)
41                         return memcpy(dest, src, n);
42                 else
43                         __asm__ __volatile__(
44                                 "std\n\t"
45                                 "rep\n\t"
46                                 "movsb\n\t"
47                                 "cld"
48                                 : "=&c" (d0), "=&S" (d1), "=&D" (d2)
49                                 :"0" (n),
50                                  "1" (n-1+src),
51                                  "2" (n-1+dest)
52                                 :"memory");
53         }
54
55         return dest;
56 }
57 EXPORT_SYMBOL(memmove);