memmove.s 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. TEXT memmove(SB), $0
  2. JMP move
  3. TEXT memcpy(SB), $0
  4. move:
  5. MOVW R1, s1+0(FP)
  6. MOVW n+8(FP), R3 /* R3 is count */
  7. MOVW R1, R4 /* R4 is to-pointer */
  8. SGT R0, R3, R5
  9. BEQ R5, ok
  10. MOVW (R0), R0 /* abort if negative count */
  11. ok:
  12. MOVW s2+4(FP), R5 /* R5 is from-pointer */
  13. ADDU R3,R5, R7 /* R7 is end from-pointer */
  14. ADDU R3,R4, R6 /* R6 is end to-pointer */
  15. /*
  16. * easiest test is copy backwards if
  17. * destination string has higher mem address
  18. */
  19. SGT $4,R3, R2
  20. SGTU R4,R5, R1
  21. BNE R1, back
  22. /*
  23. * if not at least 4 chars,
  24. * don't even mess around.
  25. * 3 chars to guarantee any
  26. * rounding up to a word
  27. * boundary and 4 characters
  28. * to get at least maybe one
  29. * full word store.
  30. */
  31. BNE R2, fout
  32. /*
  33. * test if both pointers
  34. * are similarly word aligned
  35. */
  36. XOR R4,R5, R1
  37. AND $3, R1
  38. BNE R1, fout
  39. /*
  40. * byte at a time to word align
  41. */
  42. f1:
  43. AND $3,R4, R1
  44. BEQ R1, f2
  45. MOVB 0(R5), R8
  46. ADDU $1, R5
  47. MOVB R8, 0(R4)
  48. ADDU $1, R4
  49. JMP f1
  50. /*
  51. * turn R3 into to-end pointer-15
  52. * copy 16 at a time while theres room.
  53. * R6 is smaller than R7 --
  54. * there are problems if R7 is 0.
  55. */
  56. f2:
  57. ADDU $-15,R6, R3
  58. f3:
  59. SGTU R3,R4, R1
  60. BEQ R1, f4
  61. MOVW 0(R5), R8
  62. MOVW 4(R5), R9
  63. MOVW R8, 0(R4)
  64. MOVW 8(R5), R8
  65. MOVW R9, 4(R4)
  66. MOVW 12(R5), R9
  67. ADDU $16, R5
  68. MOVW R8, 8(R4)
  69. MOVW R9, 12(R4)
  70. ADDU $16, R4
  71. JMP f3
  72. /*
  73. * turn R3 into to-end pointer-3
  74. * copy 4 at a time while theres room
  75. */
  76. f4:
  77. ADDU $-3,R6, R3
  78. f5:
  79. SGTU R3,R4, R1
  80. BEQ R1, fout
  81. MOVW 0(R5), R8
  82. ADDU $4, R5
  83. MOVW R8, 0(R4)
  84. ADDU $4, R4
  85. JMP f5
  86. /*
  87. * last loop, copy byte at a time
  88. */
  89. fout:
  90. BEQ R7,R5, ret
  91. MOVB 0(R5), R8
  92. ADDU $1, R5
  93. MOVB R8, 0(R4)
  94. ADDU $1, R4
  95. JMP fout
  96. /*
  97. * whole thing repeated for backwards
  98. */
  99. back:
  100. BNE R2, bout
  101. XOR R6,R7, R1
  102. AND $3, R1
  103. BNE R1, bout
  104. b1:
  105. AND $3,R7, R1
  106. BEQ R1, b2
  107. MOVB -1(R7), R8
  108. ADDU $-1, R7
  109. MOVB R8, -1(R6)
  110. ADDU $-1, R6
  111. JMP b1
  112. b2:
  113. ADDU $15,R5, R3
  114. b3:
  115. SGTU R7,R3, R1
  116. BEQ R1, b4
  117. MOVW -4(R7), R8
  118. MOVW -8(R7), R9
  119. MOVW R8, -4(R6)
  120. MOVW -12(R7), R8
  121. MOVW R9, -8(R6)
  122. MOVW -16(R7), R9
  123. ADDU $-16, R7
  124. MOVW R8, -12(R6)
  125. MOVW R9, -16(R6)
  126. ADDU $-16, R6
  127. JMP b3
  128. b4:
  129. ADDU $3,R5, R3
  130. b5:
  131. SGTU R7,R3, R1
  132. BEQ R1, bout
  133. MOVW -4(R7), R8
  134. ADDU $-4, R7
  135. MOVW R8, -4(R6)
  136. ADDU $-4, R6
  137. JMP b5
  138. bout:
  139. BEQ R7,R5, ret
  140. MOVB -1(R7), R8
  141. ADDU $-1, R7
  142. MOVB R8, -1(R6)
  143. ADDU $-1, R6
  144. JMP bout
  145. ret:
  146. MOVW s1+0(FP), R1
  147. RET
  148. END