string.S 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * String handling functions for PowerPC.
  3. *
  4. * Copyright (C) 1996 Paul Mackerras.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #define r0 0
  12. #define r3 3
  13. #define r4 4
  14. #define r5 5
  15. #define r6 6
  16. #define r7 7
  17. #define r8 8
  18. .globl strlen
  19. strlen:
  20. addi r4,r3,-1
  21. 1: lbzu r0,1(r4)
  22. cmpwi 0,r0,0
  23. bne 1b
  24. subf r3,r3,r4
  25. blr
  26. .globl memset
  27. memset:
  28. rlwimi r4,r4,8,16,23
  29. rlwimi r4,r4,16,0,15
  30. addi r6,r3,-4
  31. cmplwi 0,r5,4
  32. blt 7f
  33. stwu r4,4(r6)
  34. beqlr
  35. andi. r0,r6,3
  36. add r5,r0,r5
  37. subf r6,r0,r6
  38. rlwinm r0,r5,32-2,2,31
  39. mtctr r0
  40. bdz 6f
  41. 1: stwu r4,4(r6)
  42. bdnz 1b
  43. 6: andi. r5,r5,3
  44. 7: cmpwi 0,r5,0
  45. beqlr
  46. mtctr r5
  47. addi r6,r6,3
  48. 8: stbu r4,1(r6)
  49. bdnz 8b
  50. blr
  51. .globl memmove
  52. memmove:
  53. cmplw 0,r3,r4
  54. bgt backwards_memcpy
  55. /* fall through */
  56. .globl memcpy
  57. memcpy:
  58. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  59. addi r6,r3,-4
  60. addi r4,r4,-4
  61. beq 2f /* if less than 8 bytes to do */
  62. andi. r0,r6,3 /* get dest word aligned */
  63. mtctr r7
  64. bne 5f
  65. 1: lwz r7,4(r4)
  66. lwzu r8,8(r4)
  67. stw r7,4(r6)
  68. stwu r8,8(r6)
  69. bdnz 1b
  70. andi. r5,r5,7
  71. 2: cmplwi 0,r5,4
  72. blt 3f
  73. lwzu r0,4(r4)
  74. addi r5,r5,-4
  75. stwu r0,4(r6)
  76. 3: cmpwi 0,r5,0
  77. beqlr
  78. mtctr r5
  79. addi r4,r4,3
  80. addi r6,r6,3
  81. 4: lbzu r0,1(r4)
  82. stbu r0,1(r6)
  83. bdnz 4b
  84. blr
  85. 5: subfic r0,r0,4
  86. mtctr r0
  87. 6: lbz r7,4(r4)
  88. addi r4,r4,1
  89. stb r7,4(r6)
  90. addi r6,r6,1
  91. bdnz 6b
  92. subf r5,r0,r5
  93. rlwinm. r7,r5,32-3,3,31
  94. beq 2b
  95. mtctr r7
  96. b 1b
  97. .globl backwards_memcpy
  98. backwards_memcpy:
  99. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  100. add r6,r3,r5
  101. add r4,r4,r5
  102. beq 2f
  103. andi. r0,r6,3
  104. mtctr r7
  105. bne 5f
  106. 1: lwz r7,-4(r4)
  107. lwzu r8,-8(r4)
  108. stw r7,-4(r6)
  109. stwu r8,-8(r6)
  110. bdnz 1b
  111. andi. r5,r5,7
  112. 2: cmplwi 0,r5,4
  113. blt 3f
  114. lwzu r0,-4(r4)
  115. subi r5,r5,4
  116. stwu r0,-4(r6)
  117. 3: cmpwi 0,r5,0
  118. beqlr
  119. mtctr r5
  120. 4: lbzu r0,-1(r4)
  121. stbu r0,-1(r6)
  122. bdnz 4b
  123. blr
  124. 5: mtctr r0
  125. 6: lbzu r7,-1(r4)
  126. stbu r7,-1(r6)
  127. bdnz 6b
  128. subf r5,r0,r5
  129. rlwinm. r7,r5,32-3,3,31
  130. beq 2b
  131. mtctr r7
  132. b 1b
  133. .globl memcmp
  134. memcmp:
  135. cmpwi 0,r5,0
  136. blelr
  137. mtctr r5
  138. addi r6,r3,-1
  139. addi r4,r4,-1
  140. 1: lbzu r3,1(r6)
  141. lbzu r0,1(r4)
  142. subf. r3,r0,r3
  143. bdnzt 2,1b
  144. blr