Misc_amips.s 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. # vim:filetype=mips
  2. # Some misc routines for Allegrex MIPS
  3. # (c) Copyright 2007, Grazvydas "notaz" Ignotas
  4. # All Rights Reserved
  5. .set noreorder
  6. .set noat
  7. .text
  8. .align 4
  9. .globl memset32 # int *dest, int c, int count
  10. memset32:
  11. ms32_aloop:
  12. andi $t0, $a0, 0x3f
  13. beqz $t0, ms32_bloop_prep
  14. nop
  15. sw $a1, 0($a0)
  16. addiu $a2, -1
  17. beqz $a2, ms32_return
  18. addiu $a0, 4
  19. j ms32_aloop
  20. nop
  21. ms32_bloop_prep:
  22. srl $t0, $a2, 4 # we will do 64 bytes per iteration (cache line)
  23. beqz $t0, ms32_bloop_end
  24. ms32_bloop:
  25. addiu $t0, -1
  26. cache 0x18, ($a0) # create dirty exclusive
  27. sw $a1, 0x00($a0)
  28. sw $a1, 0x04($a0)
  29. sw $a1, 0x08($a0)
  30. sw $a1, 0x0c($a0)
  31. sw $a1, 0x10($a0)
  32. sw $a1, 0x14($a0)
  33. sw $a1, 0x18($a0)
  34. sw $a1, 0x1c($a0)
  35. sw $a1, 0x20($a0)
  36. sw $a1, 0x24($a0)
  37. sw $a1, 0x28($a0)
  38. sw $a1, 0x2c($a0)
  39. sw $a1, 0x30($a0)
  40. sw $a1, 0x34($a0)
  41. sw $a1, 0x38($a0)
  42. sw $a1, 0x3c($a0)
  43. bnez $t0, ms32_bloop
  44. addiu $a0, 0x40
  45. ms32_bloop_end:
  46. andi $a2, $a2, 0x0f
  47. beqz $a2, ms32_return
  48. ms32_cloop:
  49. addiu $a2, -1
  50. sw $a1, 0($a0)
  51. bnez $a2, ms32_cloop
  52. addiu $a0, 4
  53. ms32_return:
  54. jr $ra
  55. nop
  56. .globl memset32_uncached # int *dest, int c, int count
  57. memset32_uncached:
  58. srl $t0, $a2, 3 # we will do 32 bytes per iteration
  59. beqz $t0, ms32u_bloop_end
  60. ms32u_bloop:
  61. addiu $t0, -1
  62. sw $a1, 0x00($a0)
  63. sw $a1, 0x04($a0)
  64. sw $a1, 0x08($a0)
  65. sw $a1, 0x0c($a0)
  66. sw $a1, 0x10($a0)
  67. sw $a1, 0x14($a0)
  68. sw $a1, 0x18($a0)
  69. sw $a1, 0x1c($a0)
  70. bnez $t0, ms32u_bloop
  71. addiu $a0, 0x20
  72. ms32u_bloop_end:
  73. andi $a2, $a2, 0x0f
  74. beqz $a2, ms32u_return
  75. ms32u_cloop:
  76. addiu $a2, -1
  77. sw $a1, 0($a0)
  78. bnez $a2, ms32u_cloop
  79. addiu $a0, 4
  80. ms32u_return:
  81. jr $ra
  82. nop
  83. .globl memcpy32 # int *dest, int *src, int count
  84. memcpy32:
  85. mc32_aloop:
  86. andi $t0, $a0, 0x3f
  87. beqz $t0, mc32_bloop_prep
  88. nop
  89. lw $t1, 0($a1)
  90. addiu $a2, -1
  91. sw $t1, 0($a0)
  92. beqz $a2, mc32_return
  93. addiu $a0, 4
  94. j mc32_aloop
  95. addiu $a1, 4
  96. mc32_bloop_prep:
  97. srl $t0, $a2, 4 # we will do 64 bytes per iteration (cache line)
  98. beqz $t0, mc32_bloop_end
  99. mc32_bloop:
  100. addiu $t0, -1
  101. cache 0x18, ($a0) # create dirty exclusive
  102. lw $t2, 0x00($a1)
  103. lw $t3, 0x04($a1)
  104. lw $t4, 0x08($a1)
  105. lw $t5, 0x0c($a1)
  106. lw $t6, 0x10($a1)
  107. lw $t7, 0x14($a1)
  108. lw $t8, 0x18($a1)
  109. lw $t9, 0x1c($a1)
  110. sw $t2, 0x00($a0)
  111. sw $t3, 0x04($a0)
  112. sw $t4, 0x08($a0)
  113. sw $t5, 0x0c($a0)
  114. sw $t6, 0x10($a0)
  115. sw $t7, 0x14($a0)
  116. sw $t8, 0x18($a0)
  117. sw $t9, 0x1c($a0)
  118. lw $t2, 0x20($a1)
  119. lw $t3, 0x24($a1)
  120. lw $t4, 0x28($a1)
  121. lw $t5, 0x2c($a1)
  122. lw $t6, 0x30($a1)
  123. lw $t7, 0x34($a1)
  124. lw $t8, 0x38($a1)
  125. lw $t9, 0x3c($a1)
  126. sw $t2, 0x20($a0)
  127. sw $t3, 0x24($a0)
  128. sw $t4, 0x28($a0)
  129. sw $t5, 0x2c($a0)
  130. sw $t6, 0x30($a0)
  131. sw $t7, 0x34($a0)
  132. sw $t8, 0x38($a0)
  133. sw $t9, 0x3c($a0)
  134. addiu $a0, 0x40
  135. bnez $t0, mc32_bloop
  136. addiu $a1, 0x40
  137. mc32_bloop_end:
  138. andi $a2, $a2, 0x0f
  139. beqz $a2, mc32_return
  140. mc32_cloop:
  141. lw $t1, 0($a1)
  142. addiu $a2, -1
  143. addiu $a1, 4
  144. sw $t1, 0($a0)
  145. bnez $a2, mc32_cloop
  146. addiu $a0, 4
  147. mc32_return:
  148. jr $ra
  149. nop