misc_arm.s 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * Generic memory routines.
  3. * (C) notaz, 2007-2008
  4. *
  5. * This work is licensed under the terms of MAME license.
  6. * See COPYING file in the top-level directory.
  7. */
  8. .global memcpy16 @ unsigned short *dest, unsigned short *src, int count
  9. memcpy16:
  10. eor r3, r0, r1
  11. tst r3, #2
  12. bne mcp16_cant_align
  13. tst r0, #2
  14. ldrneh r3, [r1], #2
  15. subne r2, r2, #1
  16. strneh r3, [r0], #2
  17. subs r2, r2, #4
  18. bmi mcp16_fin
  19. mcp16_loop:
  20. ldmia r1!, {r3,r12}
  21. subs r2, r2, #4
  22. stmia r0!, {r3,r12}
  23. bpl mcp16_loop
  24. mcp16_fin:
  25. tst r2, #2
  26. ldrne r3, [r1], #4
  27. strne r3, [r0], #4
  28. ands r2, r2, #1
  29. bxeq lr
  30. mcp16_cant_align:
  31. ldrh r3, [r1], #2
  32. subs r2, r2, #1
  33. strh r3, [r0], #2
  34. bne mcp16_cant_align
  35. bx lr
  36. @ 0x12345678 -> 0x34127856
  37. @ r4=temp, lr=0x00ff00ff
  38. .macro bswap reg
  39. and r4, \reg, lr
  40. and \reg, lr, \reg, lsr #8
  41. orr \reg, \reg, r4, lsl #8
  42. .endm
  43. @ dest must be halfword aligned, src can be unaligned
  44. .global memcpy16bswap @ unsigned short *dest, void *src, int count
  45. memcpy16bswap:
  46. tst r1, #1
  47. bne mcp16bs_cant_align2
  48. eor r3, r0, r1
  49. tst r3, #2
  50. bne mcp16bs_cant_align
  51. tst r0, #2
  52. beq mcp16bs_aligned
  53. ldrh r3, [r1], #2
  54. sub r2, r2, #1
  55. orr r3, r3, r3, lsl #16
  56. mov r3, r3, lsr #8
  57. strh r3, [r0], #2
  58. mcp16bs_aligned:
  59. stmfd sp!, {r4,lr}
  60. mov lr, #0xff
  61. orr lr, lr, lr, lsl #16
  62. subs r2, r2, #4
  63. bmi mcp16bs_fin4
  64. mcp16bs_loop:
  65. ldmia r1!, {r3,r12}
  66. subs r2, r2, #4
  67. bswap r3
  68. bswap r12
  69. stmia r0!, {r3,r12}
  70. bpl mcp16bs_loop
  71. mcp16bs_fin4:
  72. tst r2, #2
  73. beq mcp16bs_fin2
  74. ldr r3, [r1], #4
  75. bswap r3
  76. str r3, [r0], #4
  77. mcp16bs_fin2:
  78. ldmfd sp!, {r4,lr}
  79. ands r2, r2, #1
  80. bxeq lr
  81. mcp16bs_cant_align:
  82. ldrh r3, [r1], #2
  83. subs r2, r2, #1
  84. orr r3, r3, r3, lsl #16
  85. mov r3, r3, lsr #8
  86. strh r3, [r0], #2
  87. bne mcp16bs_cant_align
  88. bx lr
  89. @ worst case
  90. mcp16bs_cant_align2:
  91. ldrb r3, [r1], #1
  92. ldrb r12,[r1], #1
  93. subs r2, r2, #1
  94. mov r3, r3, lsl #8
  95. orr r3, r3, r12
  96. strh r3, [r0], #2
  97. bne mcp16bs_cant_align2
  98. bx lr
  99. .global memcpy32 @ int *dest, int *src, int count
  100. memcpy32:
  101. stmfd sp!, {r4,lr}
  102. subs r2, r2, #4
  103. bmi mcp32_fin
  104. mcp32_loop:
  105. ldmia r1!, {r3,r4,r12,lr}
  106. subs r2, r2, #4
  107. stmia r0!, {r3,r4,r12,lr}
  108. bpl mcp32_loop
  109. mcp32_fin:
  110. tst r2, #3
  111. ldmeqfd sp!, {r4,pc}
  112. tst r2, #1
  113. ldrne r3, [r1], #4
  114. strne r3, [r0], #4
  115. mcp32_no_unal1:
  116. tst r2, #2
  117. ldmneia r1!, {r3,r12}
  118. ldmfd sp!, {r4,lr}
  119. stmneia r0!, {r3,r12}
  120. bx lr
  121. .global memset32 @ int *dest, int c, int count
  122. memset32:
  123. stmfd sp!, {lr}
  124. mov r3, r1
  125. subs r2, r2, #4
  126. bmi mst32_fin
  127. mov r12,r1
  128. mov lr, r1
  129. mst32_loop:
  130. subs r2, r2, #4
  131. stmia r0!, {r1,r3,r12,lr}
  132. bpl mst32_loop
  133. mst32_fin:
  134. tst r2, #1
  135. strne r1, [r0], #4
  136. tst r2, #2
  137. stmneia r0!, {r1,r3}
  138. ldmfd sp!, {lr}
  139. bx lr
  140. @ vim:filetype=armasm