memcpy.S 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. ;;; memcpy.S
  2. #include <asm/linkage.h>
  3. #if defined(__H8300H__)
  4. .h8300h
  5. #endif
  6. #if defined(__H8300S__)
  7. .h8300s
  8. #endif
  9. .text
  10. .global SYMBOL_NAME(memcpy)
  11. ;;; void *memcpy(void *to, void *from, size_t n)
  12. SYMBOL_NAME_LABEL(memcpy)
  13. mov.l er2,er2
  14. bne 1f
  15. rts
  16. 1:
  17. ;; address check
  18. bld #0,r0l
  19. bxor #0,r1l
  20. bcs 4f
  21. mov.l er4,@-sp
  22. mov.l er0,@-sp
  23. btst #0,r0l
  24. beq 1f
  25. ;; (aligned even) odd address
  26. mov.b @er1,r3l
  27. mov.b r3l,@er0
  28. adds #1,er1
  29. adds #1,er0
  30. dec.l #1,er2
  31. beq 3f
  32. 1:
  33. ;; n < sizeof(unsigned long) check
  34. sub.l er4,er4
  35. adds #4,er4 ; loop count check value
  36. cmp.l er4,er2
  37. blo 2f
  38. ;; unsigned long copy
  39. 1:
  40. mov.l @er1,er3
  41. mov.l er3,@er0
  42. adds #4,er0
  43. adds #4,er1
  44. subs #4,er2
  45. cmp.l er4,er2
  46. bcc 1b
  47. ;; rest
  48. 2:
  49. mov.l er2,er2
  50. beq 3f
  51. 1:
  52. mov.b @er1,r3l
  53. mov.b r3l,@er0
  54. adds #1,er1
  55. adds #1,er0
  56. dec.l #1,er2
  57. bne 1b
  58. 3:
  59. mov.l @sp+,er0
  60. mov.l @sp+,er4
  61. rts
  62. ;; odd <- even / even <- odd
  63. 4:
  64. mov.l er4,er3
  65. mov.l er2,er4
  66. mov.l er5,er2
  67. mov.l er1,er5
  68. mov.l er6,er1
  69. mov.l er0,er6
  70. 1:
  71. eepmov.w
  72. mov.w r4,r4
  73. bne 1b
  74. dec.w #1,e4
  75. bpl 1b
  76. mov.l er1,er6
  77. mov.l er2,er5
  78. mov.l er3,er4
  79. rts