misc_arm.s 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. @ 0x12345678 -> 0x34127856
  9. @ r4=temp, lr=0x00ff00ff
  10. .macro bswap reg
  11. and r4, \reg, lr
  12. and \reg, lr, \reg, lsr #8
  13. orr \reg, \reg, r4, lsl #8
  14. .endm
  15. @ dest must be halfword aligned, src can be unaligned
  16. .global memcpy16bswap @ unsigned short *dest, void *src, int count
  17. memcpy16bswap:
  18. tst r1, #1
  19. bne mcp16bs_cant_align2
  20. eor r3, r0, r1
  21. tst r3, #2
  22. bne mcp16bs_cant_align
  23. tst r0, #2
  24. beq mcp16bs_aligned
  25. ldrh r3, [r1], #2
  26. sub r2, r2, #1
  27. orr r3, r3, r3, lsl #16
  28. mov r3, r3, lsr #8
  29. strh r3, [r0], #2
  30. mcp16bs_aligned:
  31. stmfd sp!, {r4,lr}
  32. mov lr, #0xff
  33. orr lr, lr, lr, lsl #16
  34. subs r2, r2, #4
  35. bmi mcp16bs_fin4
  36. mcp16bs_loop:
  37. ldmia r1!, {r3,r12}
  38. subs r2, r2, #4
  39. bswap r3
  40. bswap r12
  41. stmia r0!, {r3,r12}
  42. bpl mcp16bs_loop
  43. mcp16bs_fin4:
  44. tst r2, #2
  45. beq mcp16bs_fin2
  46. ldr r3, [r1], #4
  47. bswap r3
  48. str r3, [r0], #4
  49. mcp16bs_fin2:
  50. ldmfd sp!, {r4,lr}
  51. ands r2, r2, #1
  52. bxeq lr
  53. mcp16bs_cant_align:
  54. ldrh r3, [r1], #2
  55. subs r2, r2, #1
  56. orr r3, r3, r3, lsl #16
  57. mov r3, r3, lsr #8
  58. strh r3, [r0], #2
  59. bne mcp16bs_cant_align
  60. bx lr
  61. @ worst case
  62. mcp16bs_cant_align2:
  63. ldrb r3, [r1], #1
  64. ldrb r12,[r1], #1
  65. subs r2, r2, #1
  66. mov r3, r3, lsl #8
  67. orr r3, r3, r12
  68. strh r3, [r0], #2
  69. bne mcp16bs_cant_align2
  70. bx lr
  71. .global memset32 @ int *dest, int c, int count
  72. memset32:
  73. stmfd sp!, {lr}
  74. mov r3, r1
  75. subs r2, r2, #4
  76. bmi mst32_fin
  77. mov r12,r1
  78. mov lr, r1
  79. mst32_loop:
  80. subs r2, r2, #4
  81. stmia r0!, {r1,r3,r12,lr}
  82. bpl mst32_loop
  83. mst32_fin:
  84. tst r2, #1
  85. strne r1, [r0], #4
  86. tst r2, #2
  87. stmneia r0!, {r1,r3}
  88. ldmfd sp!, {lr}
  89. bx lr
  90. @ vim:filetype=armasm