mem_64.S 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. #include <asm/processor.h>
  12. #include <asm/errno.h>
  13. #include <asm/ppc_asm.h>
  14. #include <asm/export.h>
  15. _GLOBAL(memset)
  16. neg r0,r3
  17. rlwimi r4,r4,8,16,23
  18. andi. r0,r0,7 /* # bytes to be 8-byte aligned */
  19. rlwimi r4,r4,16,0,15
  20. cmplw cr1,r5,r0 /* do we get that far? */
  21. rldimi r4,r4,32,0
  22. PPC_MTOCRF(1,r0)
  23. mr r6,r3
  24. blt cr1,8f
  25. beq+ 3f /* if already 8-byte aligned */
  26. subf r5,r0,r5
  27. bf 31,1f
  28. stb r4,0(r6)
  29. addi r6,r6,1
  30. 1: bf 30,2f
  31. sth r4,0(r6)
  32. addi r6,r6,2
  33. 2: bf 29,3f
  34. stw r4,0(r6)
  35. addi r6,r6,4
  36. 3: srdi. r0,r5,6
  37. clrldi r5,r5,58
  38. mtctr r0
  39. beq 5f
  40. .balign 16
  41. 4: std r4,0(r6)
  42. std r4,8(r6)
  43. std r4,16(r6)
  44. std r4,24(r6)
  45. std r4,32(r6)
  46. std r4,40(r6)
  47. std r4,48(r6)
  48. std r4,56(r6)
  49. addi r6,r6,64
  50. bdnz 4b
  51. 5: srwi. r0,r5,3
  52. clrlwi r5,r5,29
  53. PPC_MTOCRF(1,r0)
  54. beq 8f
  55. bf 29,6f
  56. std r4,0(r6)
  57. std r4,8(r6)
  58. std r4,16(r6)
  59. std r4,24(r6)
  60. addi r6,r6,32
  61. 6: bf 30,7f
  62. std r4,0(r6)
  63. std r4,8(r6)
  64. addi r6,r6,16
  65. 7: bf 31,8f
  66. std r4,0(r6)
  67. addi r6,r6,8
  68. 8: cmpwi r5,0
  69. PPC_MTOCRF(1,r5)
  70. beqlr+
  71. bf 29,9f
  72. stw r4,0(r6)
  73. addi r6,r6,4
  74. 9: bf 30,10f
  75. sth r4,0(r6)
  76. addi r6,r6,2
  77. 10: bflr 31
  78. stb r4,0(r6)
  79. blr
  80. EXPORT_SYMBOL(memset)
  81. _GLOBAL_TOC(memmove)
  82. cmplw 0,r3,r4
  83. bgt backwards_memcpy
  84. b memcpy
  85. _GLOBAL(backwards_memcpy)
  86. rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
  87. add r6,r3,r5
  88. add r4,r4,r5
  89. beq 2f
  90. andi. r0,r6,3
  91. mtctr r7
  92. bne 5f
  93. .balign 16
  94. 1: lwz r7,-4(r4)
  95. lwzu r8,-8(r4)
  96. stw r7,-4(r6)
  97. stwu r8,-8(r6)
  98. bdnz 1b
  99. andi. r5,r5,7
  100. 2: cmplwi 0,r5,4
  101. blt 3f
  102. lwzu r0,-4(r4)
  103. subi r5,r5,4
  104. stwu r0,-4(r6)
  105. 3: cmpwi 0,r5,0
  106. beqlr
  107. mtctr r5
  108. 4: lbzu r0,-1(r4)
  109. stbu r0,-1(r6)
  110. bdnz 4b
  111. blr
  112. 5: mtctr r0
  113. 6: lbzu r7,-1(r4)
  114. stbu r7,-1(r6)
  115. bdnz 6b
  116. subf r5,r0,r5
  117. rlwinm. r7,r5,32-3,3,31
  118. beq 2b
  119. mtctr r7
  120. b 1b
  121. EXPORT_SYMBOL(memmove)