memmove.s 965 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. TEXT memmove(SB), $0
  2. MOVL p1+0(FP), DI
  3. MOVL DI, AX /* return value */
  4. MOVL p2+4(FP), SI
  5. MOVL n+8(FP), BX
  6. CMPL BX, $0
  7. JGT _ok
  8. JEQ _return /* nothing to do if n == 0 */
  9. MOVL $0, SI /* fault if n < 0 */
  10. /*
  11. * check and set for backwards:
  12. * (p2 < p1) && ((p2+n) > p1)
  13. */
  14. _ok:
  15. CMPL SI, DI
  16. JGT _forward
  17. JEQ _return /* nothing to do if p2 == p1 */
  18. MOVL SI, DX
  19. ADDL BX, DX
  20. CMPL DX, DI
  21. JGT _back
  22. /*
  23. * copy whole longs
  24. */
  25. _forward:
  26. MOVL BX, CX
  27. CLD
  28. SHRL $2, CX
  29. ANDL $3, BX
  30. REP; MOVSL
  31. /*
  32. * copy the rest, by bytes
  33. */
  34. JEQ _return /* flags set by above ANDL */
  35. MOVL BX, CX
  36. REP; MOVSB
  37. RET
  38. /*
  39. * whole thing backwards has
  40. * adjusted addresses
  41. */
  42. _back:
  43. ADDL BX, DI
  44. ADDL BX, SI
  45. STD
  46. SUBL $4, DI
  47. SUBL $4, SI
  48. /*
  49. * copy whole longs
  50. */
  51. MOVL BX, CX
  52. SHRL $2, CX
  53. ANDL $3, BX
  54. REP; MOVSL
  55. /*
  56. * copy the rest, by bytes
  57. */
  58. JEQ _return /* flags set by above ANDL */
  59. ADDL $3, DI
  60. ADDL $3, SI
  61. MOVL BX, CX
  62. REP; MOVSB
  63. _return:
  64. RET