memcpy_32.c 998 B

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