memmove.s 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. TEXT memmove(SB), $0
  2. move:
  3. MOVL n+8(FP),R0
  4. BEQ return
  5. BGT ok
  6. MOVL 0, R0
  7. ok:
  8. MOVL s1+0(FP),A2
  9. MOVL s2+4(FP),A1
  10. CMPL A2,A1
  11. BHI back
  12. /*
  13. * speed depends on source allignment
  14. * destination allignment is secondary
  15. * byte-at-a-time foreward copy to
  16. * get source (A1) alligned.
  17. */
  18. f1:
  19. MOVL A1, R1
  20. ANDL $3, R1
  21. BEQ f2
  22. SUBL $1, R0
  23. BLT return
  24. MOVB (A1)+, (A2)+
  25. BRA f1
  26. /*
  27. * quad-long-at-a-time forward copy
  28. */
  29. f2:
  30. SUBL $16, R0
  31. BLT f3
  32. MOVL (A1)+, (A2)+
  33. MOVL (A1)+, (A2)+
  34. MOVL (A1)+, (A2)+
  35. MOVL (A1)+, (A2)+
  36. BRA f2
  37. /*
  38. * cleanup byte-at-a-time
  39. */
  40. f3:
  41. ADDL $15, R0
  42. BLT return
  43. f4:
  44. MOVB (A1)+, (A2)+
  45. SUBL $1, R0
  46. BGE f4
  47. BRA return
  48. return:
  49. MOVL s1+0(FP),R0
  50. RTS
  51. /*
  52. * everything the same, but
  53. * copy backwards
  54. */
  55. back:
  56. ADDL R0, A1
  57. ADDL R0, A2
  58. /*
  59. * byte-at-a-time backward copy to
  60. * get source (A1) alligned.
  61. */
  62. b1:
  63. MOVL A1, R1
  64. ANDL $3, R1
  65. BEQ b2
  66. SUBL $1, R0
  67. BLT return
  68. MOVB -(A1), -(A2)
  69. BRA b1
  70. /*
  71. * quad-long-at-a-time backward copy
  72. */
  73. b2:
  74. SUBL $16, R0
  75. BLT b3
  76. MOVL -(A1), -(A2)
  77. MOVL -(A1), -(A2)
  78. MOVL -(A1), -(A2)
  79. MOVL -(A1), -(A2)
  80. BRA b2
  81. /*
  82. * cleanup byte-at-a-time backward
  83. */
  84. b3:
  85. ADDL $15, R0
  86. BLT return
  87. b4:
  88. MOVB -(A1), -(A2)
  89. SUBL $1, R0
  90. BGE b4
  91. BRA return