string.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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