diff options
Diffstat (limited to 'arch/i386/lib/memcpy.c')
| -rw-r--r-- | arch/i386/lib/memcpy.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/arch/i386/lib/memcpy.c b/arch/i386/lib/memcpy.c new file mode 100644 index 000000000000..891b2359d18a --- /dev/null +++ b/arch/i386/lib/memcpy.c | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | #include <linux/config.h> | ||
| 2 | #include <linux/string.h> | ||
| 3 | #include <linux/module.h> | ||
| 4 | |||
| 5 | #undef memcpy | ||
| 6 | #undef memset | ||
| 7 | |||
| 8 | void *memcpy(void *to, const void *from, size_t n) | ||
| 9 | { | ||
| 10 | #ifdef CONFIG_X86_USE_3DNOW | ||
| 11 | return __memcpy3d(to, from, n); | ||
| 12 | #else | ||
| 13 | return __memcpy(to, from, n); | ||
| 14 | #endif | ||
| 15 | } | ||
| 16 | EXPORT_SYMBOL(memcpy); | ||
| 17 | |||
| 18 | void *memset(void *s, int c, size_t count) | ||
| 19 | { | ||
| 20 | return __memset(s, c, count); | ||
| 21 | } | ||
| 22 | EXPORT_SYMBOL(memset); | ||
| 23 | |||
| 24 | void *memmove(void *dest, const void *src, size_t n) | ||
| 25 | { | ||
| 26 | int d0, d1, d2; | ||
| 27 | |||
| 28 | if (dest < src) { | ||
| 29 | memcpy(dest,src,n); | ||
| 30 | } else { | ||
| 31 | __asm__ __volatile__( | ||
| 32 | "std\n\t" | ||
| 33 | "rep\n\t" | ||
| 34 | "movsb\n\t" | ||
| 35 | "cld" | ||
| 36 | : "=&c" (d0), "=&S" (d1), "=&D" (d2) | ||
| 37 | :"0" (n), | ||
| 38 | "1" (n-1+(const char *)src), | ||
| 39 | "2" (n-1+(char *)dest) | ||
| 40 | :"memory"); | ||
| 41 | } | ||
| 42 | return dest; | ||
| 43 | } | ||
| 44 | EXPORT_SYMBOL(memmove); | ||
