memset.S 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. * linux/arch/m32r/lib/memset.S
  3. *
  4. * Copyright (C) 2001,2002 Hiroyuki Kondo, and Hirokazu Takata
  5. * Copyright (C) 2004 Hirokazu Takata
  6. *
  7. * void *memset(void *dst, int val, int len);
  8. *
  9. * dst: r0
  10. * val: r1
  11. * len: r2
  12. * ret: r0
  13. *
  14. */
  15. /* $Id$ */
  16. .text
  17. .global memset
  18. #ifdef CONFIG_ISA_DUAL_ISSUE
  19. .align 4
  20. memset:
  21. mv r4, r0 || cmpz r2
  22. jc r14
  23. cmpui r2, #16
  24. bnc qword_align_check
  25. cmpui r2, #4
  26. bc byte_set
  27. word_align_check: /* len >= 4 */
  28. and3 r3, r4, #3
  29. beqz r3, word_set
  30. addi r3, #-4
  31. neg r3, r3 /* r3 = -(r3 - 4) */
  32. align_word:
  33. stb r1, @r4 || addi r4, #1
  34. addi r2, #-1 || addi r3, #-1
  35. bnez r3, align_word
  36. cmpui r2, #4
  37. bc byte_set
  38. word_set:
  39. and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
  40. sll3 r3, r1, #8
  41. or r1, r3 || addi r4, #-4
  42. sll3 r3, r1, #16
  43. or r1, r3 || addi r2, #-4
  44. word_set_loop:
  45. st r1, @+r4 || addi r2, #-4
  46. bgtz r2, word_set_loop
  47. bnez r2, byte_set_wrap
  48. st r1, @+r4
  49. jmp r14
  50. qword_align_check: /* len >= 16 */
  51. and3 r3, r4, #15
  52. bnez r3, word_align_check
  53. qword_set:
  54. and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
  55. sll3 r3, r1, #8
  56. or r1, r3 || addi r4, #-4
  57. sll3 r3, r1, #16
  58. or r1, r3 || ldi r5, #16
  59. qword_set_loop:
  60. ld r3, @(4,r4) /* cache line allocate */
  61. st r1, @+r4 || addi r2, #-16
  62. st r1, @+r4 || cmpu r2, r5
  63. st r1, @+r4
  64. st r1, @+r4
  65. bnc qword_set_loop || cmpz r2
  66. jc r14
  67. set_remainder:
  68. cmpui r2, #4
  69. bc byte_set_wrap1
  70. addi r2, #-4
  71. bra word_set_loop
  72. byte_set_wrap:
  73. addi r2, #4
  74. cmpz r2
  75. jc r14
  76. byte_set_wrap1:
  77. addi r4, #4
  78. #if defined(CONFIG_ISA_M32R2)
  79. byte_set:
  80. addi r2, #-1 || stb r1, @r4+
  81. bnez r2, byte_set
  82. #elif defined(CONFIG_ISA_M32R)
  83. byte_set:
  84. addi r2, #-1 || stb r1, @r4
  85. addi r4, #1
  86. bnez r2, byte_set
  87. #else
  88. #error unknown isa configuration
  89. #endif
  90. end_memset:
  91. jmp r14
  92. #else /* not CONFIG_ISA_DUAL_ISSUE */
  93. .align 4
  94. memset:
  95. mv r4, r0
  96. beqz r2, end_memset
  97. cmpui r2, #16
  98. bnc qword_align_check
  99. cmpui r2, #4
  100. bc byte_set
  101. word_align_check: /* len >= 4 */
  102. and3 r3, r4, #3
  103. beqz r3, word_set
  104. addi r3, #-4
  105. neg r3, r3 /* r3 = -(r3 - 4) */
  106. align_word:
  107. stb r1, @r4
  108. addi r4, #1
  109. addi r2, #-1
  110. addi r3, #-1
  111. bnez r3, align_word
  112. cmpui r2, #4
  113. bc byte_set
  114. word_set:
  115. and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
  116. sll3 r3, r1, #8
  117. or r1, r3
  118. sll3 r3, r1, #16
  119. or r1, r3
  120. addi r2, #-4
  121. addi r4, #-4
  122. word_set_loop:
  123. st r1, @+r4
  124. addi r2, #-4
  125. bgtz r2, word_set_loop
  126. bnez r2, byte_set_wrap
  127. st r1, @+r4
  128. jmp r14
  129. qword_align_check: /* len >= 16 */
  130. and3 r3, r4, #15
  131. bnez r3, word_align_check
  132. qword_set:
  133. and3 r1, r1, #0x00ff /* r1: abababab <-- ??????ab */
  134. sll3 r3, r1, #8
  135. or r1, r3
  136. sll3 r3, r1, #16
  137. or r1, r3
  138. addi r4, #-4
  139. qword_set_loop:
  140. ld r3, @(4,r4) /* cache line allocate */
  141. addi r2, #-16
  142. st r1, @+r4
  143. st r1, @+r4
  144. cmpui r2, #16
  145. st r1, @+r4
  146. st r1, @+r4
  147. bnc qword_set_loop
  148. bnez r2, set_remainder
  149. jmp r14
  150. set_remainder:
  151. cmpui r2, #4
  152. bc byte_set_wrap1
  153. addi r2, #-4
  154. bra word_set_loop
  155. byte_set_wrap:
  156. addi r2, #4
  157. beqz r2, end_memset
  158. byte_set_wrap1:
  159. addi r4, #4
  160. byte_set:
  161. addi r2, #-1
  162. stb r1, @r4
  163. addi r4, #1
  164. bnez r2, byte_set
  165. end_memset:
  166. jmp r14
  167. #endif /* not CONFIG_ISA_DUAL_ISSUE */
  168. .end