memcpy.S 1.1 KB

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