memset.S 3.2 KB

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