memmove.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * This file is subject to the terms and conditions of the GNU General Public
  3. * License. See the file COPYING in the main directory of this archive
  4. * for more details.
  5. */
  6. #define __IN_STRING_C
  7. #include <linux/module.h>
  8. #include <linux/string.h>
  9. void *memmove(void *dest, const void *src, size_t n)
  10. {
  11. void *xdest = dest;
  12. size_t temp;
  13. if (!n)
  14. return xdest;
  15. if (dest < src) {
  16. if ((long)dest & 1) {
  17. char *cdest = dest;
  18. const char *csrc = src;
  19. *cdest++ = *csrc++;
  20. dest = cdest;
  21. src = csrc;
  22. n--;
  23. }
  24. if (n > 2 && (long)dest & 2) {
  25. short *sdest = dest;
  26. const short *ssrc = src;
  27. *sdest++ = *ssrc++;
  28. dest = sdest;
  29. src = ssrc;
  30. n -= 2;
  31. }
  32. temp = n >> 2;
  33. if (temp) {
  34. long *ldest = dest;
  35. const long *lsrc = src;
  36. temp--;
  37. do
  38. *ldest++ = *lsrc++;
  39. while (temp--);
  40. dest = ldest;
  41. src = lsrc;
  42. }
  43. if (n & 2) {
  44. short *sdest = dest;
  45. const short *ssrc = src;
  46. *sdest++ = *ssrc++;
  47. dest = sdest;
  48. src = ssrc;
  49. }
  50. if (n & 1) {
  51. char *cdest = dest;
  52. const char *csrc = src;
  53. *cdest = *csrc;
  54. }
  55. } else {
  56. dest = (char *)dest + n;
  57. src = (const char *)src + n;
  58. if ((long)dest & 1) {
  59. char *cdest = dest;
  60. const char *csrc = src;
  61. *--cdest = *--csrc;
  62. dest = cdest;
  63. src = csrc;
  64. n--;
  65. }
  66. if (n > 2 && (long)dest & 2) {
  67. short *sdest = dest;
  68. const short *ssrc = src;
  69. *--sdest = *--ssrc;
  70. dest = sdest;
  71. src = ssrc;
  72. n -= 2;
  73. }
  74. temp = n >> 2;
  75. if (temp) {
  76. long *ldest = dest;
  77. const long *lsrc = src;
  78. temp--;
  79. do
  80. *--ldest = *--lsrc;
  81. while (temp--);
  82. dest = ldest;
  83. src = lsrc;
  84. }
  85. if (n & 2) {
  86. short *sdest = dest;
  87. const short *ssrc = src;
  88. *--sdest = *--ssrc;
  89. dest = sdest;
  90. src = ssrc;
  91. }
  92. if (n & 1) {
  93. char *cdest = dest;
  94. const char *csrc = src;
  95. *--cdest = *--csrc;
  96. }
  97. }
  98. return xdest;
  99. }
  100. EXPORT_SYMBOL(memmove);