memmove-sparc.s 2.2 KB

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