ppcstring.S 2.7 KB

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