memmove.s 650 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. TEXT memmove(SB), $0
  2. MOVL p1+0(FP), DI
  3. MOVL p2+4(FP), SI
  4. MOVL n+8(FP), BX
  5. CMPL BX, $0
  6. JGE ok
  7. MOVL $0, SI
  8. ok:
  9. CLD
  10. /*
  11. * check and set for backwards
  12. */
  13. CMPL SI, DI
  14. JLS back
  15. /*
  16. * copy whole longs
  17. */
  18. MOVL BX, CX
  19. SHRL $2, CX
  20. REP; MOVSL
  21. /*
  22. * copy the rest, by bytes
  23. */
  24. ANDL $3, BX
  25. MOVL BX, CX
  26. REP; MOVSB
  27. MOVL p+0(FP),AX
  28. RET
  29. /*
  30. * whole thing backwards has
  31. * adjusted addresses
  32. */
  33. back:
  34. ADDL BX, DI
  35. ADDL BX, SI
  36. SUBL $4, DI
  37. SUBL $4, SI
  38. STD
  39. /*
  40. * copy whole longs
  41. */
  42. MOVL BX, CX
  43. SHRL $2, CX
  44. ANDL $3, BX
  45. REP; MOVSL
  46. /*
  47. * copy the rest, by bytes
  48. */
  49. ADDL $3, DI
  50. ADDL $3, SI
  51. MOVL BX, CX
  52. REP; MOVSB
  53. MOVL p+0(FP),AX
  54. RET