memcpy.c 763 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include <linux/config.h>
  2. #include <linux/string.h>
  3. #include <linux/module.h>
  4. #undef memcpy
  5. #undef memset
  6. void *memcpy(void *to, const void *from, size_t n)
  7. {
  8. #ifdef CONFIG_X86_USE_3DNOW
  9. return __memcpy3d(to, from, n);
  10. #else
  11. return __memcpy(to, from, n);
  12. #endif
  13. }
  14. EXPORT_SYMBOL(memcpy);
  15. void *memset(void *s, int c, size_t count)
  16. {
  17. return __memset(s, c, count);
  18. }
  19. EXPORT_SYMBOL(memset);
  20. void *memmove(void *dest, const void *src, size_t n)
  21. {
  22. int d0, d1, d2;
  23. if (dest < src) {
  24. memcpy(dest,src,n);
  25. } else {
  26. __asm__ __volatile__(
  27. "std\n\t"
  28. "rep\n\t"
  29. "movsb\n\t"
  30. "cld"
  31. : "=&c" (d0), "=&S" (d1), "=&D" (d2)
  32. :"0" (n),
  33. "1" (n-1+(const char *)src),
  34. "2" (n-1+(char *)dest)
  35. :"memory");
  36. }
  37. return dest;
  38. }
  39. EXPORT_SYMBOL(memmove);