memmove-386.s 671 B

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