mem_64.S 2.0 KB

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