ppcstring.S 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. * String handling functions for PowerPC.
  3. *
  4. * Copyright (C) 1996 Paul Mackerras.
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <ppc_asm.tmpl>
  9. #include <asm/errno.h>
  10. .globl strcpy
  11. strcpy:
  12. addi r5,r3,-1
  13. addi r4,r4,-1
  14. 1: lbzu r0,1(r4)
  15. cmpwi 0,r0,0
  16. stbu r0,1(r5)
  17. bne 1b
  18. blr
  19. .globl strncpy
  20. strncpy:
  21. cmpwi 0,r5,0
  22. beqlr
  23. mtctr r5
  24. addi r6,r3,-1
  25. addi r4,r4,-1
  26. 1: lbzu r0,1(r4)
  27. cmpwi 0,r0,0
  28. stbu r0,1(r6)
  29. bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */
  30. blr
  31. .globl strcat
  32. strcat:
  33. addi r5,r3,-1
  34. addi r4,r4,-1
  35. 1: lbzu r0,1(r5)
  36. cmpwi 0,r0,0
  37. bne 1b
  38. addi r5,r5,-1
  39. 1: lbzu r0,1(r4)
  40. cmpwi 0,r0,0
  41. stbu r0,1(r5)
  42. bne 1b
  43. blr
  44. .globl strcmp
  45. strcmp:
  46. addi r5,r3,-1
  47. addi r4,r4,-1
  48. 1: lbzu r3,1(r5)
  49. cmpwi 1,r3,0
  50. lbzu r0,1(r4)
  51. subf. r3,r0,r3
  52. beqlr 1
  53. beq 1b
  54. blr
  55. .globl strlen
  56. strlen:
  57. addi r4,r3,-1
  58. 1: lbzu r0,1(r4)
  59. cmpwi 0,r0,0
  60. bne 1b
  61. subf r3,r3,r4
  62. blr
  63. .globl memset
  64. memset:
  65. rlwimi r4,r4,8,16,23
  66. rlwimi r4,r4,16,0,15
  67. addi r6,r3,-4
  68. cmplwi 0,r5,4
  69. blt 7f
  70. stwu r4,4(r6)
  71. beqlr
  72. andi. r0,r6,3
  73. add r5,r0,r5
  74. subf r6,r0,r6
  75. rlwinm r0,r5,32-2,2,31
  76. mtctr r0
  77. bdz 6f
  78. 1: stwu r4,4(r6)
  79. bdnz 1b
  80. 6: andi. r5,r5,3
  81. 7: cmpwi 0,r5,0
  82. beqlr
  83. mtctr r5
  84. addi r6,r6,3
  85. 8: stbu r4,1(r6)
  86. bdnz 8b
  87. blr
  88. .globl bcopy
  89. bcopy:
  90. mr r6,r3
  91. mr r3,r4
  92. mr r4,r6
  93. b memcpy
  94. .globl memmove
  95. memmove:
  96. cmplw 0,r3,r4
  97. bgt backwards_memcpy
  98. /* fall through */
  99. .globl memcpy
  100. memcpy:
  101. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  102. addi r6,r3,-4
  103. addi r4,r4,-4
  104. beq 2f /* if less than 8 bytes to do */
  105. andi. r0,r6,3 /* get dest word aligned */
  106. mtctr r7
  107. bne 5f
  108. 1: lwz r7,4(r4)
  109. lwzu r8,8(r4)
  110. stw r7,4(r6)
  111. stwu r8,8(r6)
  112. bdnz 1b
  113. andi. r5,r5,7
  114. 2: cmplwi 0,r5,4
  115. blt 3f
  116. lwzu r0,4(r4)
  117. addi r5,r5,-4
  118. stwu r0,4(r6)
  119. 3: cmpwi 0,r5,0
  120. beqlr
  121. mtctr r5
  122. addi r4,r4,3
  123. addi r6,r6,3
  124. 4: lbzu r0,1(r4)
  125. stbu r0,1(r6)
  126. bdnz 4b
  127. blr
  128. 5: subfic r0,r0,4
  129. mtctr r0
  130. 6: lbz r7,4(r4)
  131. addi r4,r4,1
  132. stb r7,4(r6)
  133. addi r6,r6,1
  134. bdnz 6b
  135. subf r5,r0,r5
  136. rlwinm. r7,r5,32-3,3,31
  137. beq 2b
  138. mtctr r7
  139. b 1b
  140. .globl backwards_memcpy
  141. backwards_memcpy:
  142. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  143. add r6,r3,r5
  144. add r4,r4,r5
  145. beq 2f
  146. andi. r0,r6,3
  147. mtctr r7
  148. bne 5f
  149. 1: lwz r7,-4(r4)
  150. lwzu r8,-8(r4)
  151. stw r7,-4(r6)
  152. stwu r8,-8(r6)
  153. bdnz 1b
  154. andi. r5,r5,7
  155. 2: cmplwi 0,r5,4
  156. blt 3f
  157. lwzu r0,-4(r4)
  158. subi r5,r5,4
  159. stwu r0,-4(r6)
  160. 3: cmpwi 0,r5,0
  161. beqlr
  162. mtctr r5
  163. 4: lbzu r0,-1(r4)
  164. stbu r0,-1(r6)
  165. bdnz 4b
  166. blr
  167. 5: mtctr r0
  168. 6: lbzu r7,-1(r4)
  169. stbu r7,-1(r6)
  170. bdnz 6b
  171. subf r5,r0,r5
  172. rlwinm. r7,r5,32-3,3,31
  173. beq 2b
  174. mtctr r7
  175. b 1b
  176. .globl memcmp
  177. memcmp:
  178. cmpwi 0,r5,0
  179. ble- 2f
  180. mtctr r5
  181. addi r6,r3,-1
  182. addi r4,r4,-1
  183. 1: lbzu r3,1(r6)
  184. lbzu r0,1(r4)
  185. subf. r3,r0,r3
  186. bdnzt 2,1b
  187. blr
  188. 2: li r3,0
  189. blr
  190. .global memchr
  191. memchr:
  192. cmpwi 0,r5,0
  193. ble- 2f
  194. mtctr r5
  195. addi r3,r3,-1
  196. 1: lbzu r0,1(r3)
  197. cmpw 0,r0,r4
  198. bdnzf 2,1b
  199. beqlr
  200. 2: li r3,0
  201. blr