ppcstring.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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 <linux/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 memmove
  89. memmove:
  90. cmplw 0,r3,r4
  91. bgt backwards_memcpy
  92. /* fall through */
  93. .globl memcpy
  94. memcpy:
  95. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  96. addi r6,r3,-4
  97. addi r4,r4,-4
  98. beq 2f /* if less than 8 bytes to do */
  99. andi. r0,r6,3 /* get dest word aligned */
  100. mtctr r7
  101. bne 5f
  102. 1: lwz r7,4(r4)
  103. lwzu r8,8(r4)
  104. stw r7,4(r6)
  105. stwu r8,8(r6)
  106. bdnz 1b
  107. andi. r5,r5,7
  108. 2: cmplwi 0,r5,4
  109. blt 3f
  110. lwzu r0,4(r4)
  111. addi r5,r5,-4
  112. stwu r0,4(r6)
  113. 3: cmpwi 0,r5,0
  114. beqlr
  115. mtctr r5
  116. addi r4,r4,3
  117. addi r6,r6,3
  118. 4: lbzu r0,1(r4)
  119. stbu r0,1(r6)
  120. bdnz 4b
  121. blr
  122. 5: subfic r0,r0,4
  123. mtctr r0
  124. 6: lbz r7,4(r4)
  125. addi r4,r4,1
  126. stb r7,4(r6)
  127. addi r6,r6,1
  128. bdnz 6b
  129. subf r5,r0,r5
  130. rlwinm. r7,r5,32-3,3,31
  131. beq 2b
  132. mtctr r7
  133. b 1b
  134. .globl backwards_memcpy
  135. backwards_memcpy:
  136. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  137. add r6,r3,r5
  138. add r4,r4,r5
  139. beq 2f
  140. andi. r0,r6,3
  141. mtctr r7
  142. bne 5f
  143. 1: lwz r7,-4(r4)
  144. lwzu r8,-8(r4)
  145. stw r7,-4(r6)
  146. stwu r8,-8(r6)
  147. bdnz 1b
  148. andi. r5,r5,7
  149. 2: cmplwi 0,r5,4
  150. blt 3f
  151. lwzu r0,-4(r4)
  152. subi r5,r5,4
  153. stwu r0,-4(r6)
  154. 3: cmpwi 0,r5,0
  155. beqlr
  156. mtctr r5
  157. 4: lbzu r0,-1(r4)
  158. stbu r0,-1(r6)
  159. bdnz 4b
  160. blr
  161. 5: mtctr r0
  162. 6: lbzu r7,-1(r4)
  163. stbu r7,-1(r6)
  164. bdnz 6b
  165. subf r5,r0,r5
  166. rlwinm. r7,r5,32-3,3,31
  167. beq 2b
  168. mtctr r7
  169. b 1b
  170. .globl memcmp
  171. memcmp:
  172. cmpwi 0,r5,0
  173. ble- 2f
  174. mtctr r5
  175. addi r6,r3,-1
  176. addi r4,r4,-1
  177. 1: lbzu r3,1(r6)
  178. lbzu r0,1(r4)
  179. subf. r3,r0,r3
  180. bdnzt 2,1b
  181. blr
  182. 2: li r3,0
  183. blr
  184. .global memchr
  185. memchr:
  186. cmpwi 0,r5,0
  187. ble- 2f
  188. mtctr r5
  189. addi r3,r3,-1
  190. 1: lbzu r0,1(r3)
  191. cmpw 0,r0,r4
  192. bdnzf 2,1b
  193. beqlr
  194. 2: li r3,0
  195. blr