memset.S 819 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* memset.S */
  2. #include <asm/linkage.h>
  3. #if defined(CONFIG_CPU_H8300H)
  4. .h8300h
  5. #endif
  6. #if defined(CONFIG_CPU_H8S)
  7. .h8300s
  8. #endif
  9. .text
  10. .global memset
  11. .global clear_user
  12. ;;void *memset(*ptr, int c, size_t count)
  13. ;; ptr = er0
  14. ;; c = er1(r1l)
  15. ;; count = er2
  16. memset:
  17. btst #0,r0l
  18. beq 2f
  19. ;; odd address
  20. 1:
  21. mov.b r1l,@er0
  22. adds #1,er0
  23. dec.l #1,er2
  24. beq 6f
  25. ;; even address
  26. 2:
  27. mov.l er2,er3
  28. cmp.l #4,er2
  29. blo 4f
  30. ;; count>=4 -> count/4
  31. #if defined(CONFIG_CPU_H8300H)
  32. shlr.l er2
  33. shlr.l er2
  34. #endif
  35. #if defined(CONFIG_CPU_H8S)
  36. shlr.l #2,er2
  37. #endif
  38. ;; byte -> long
  39. mov.b r1l,r1h
  40. mov.w r1,e1
  41. 3:
  42. mov.l er1,@er0
  43. adds #4,er0
  44. dec.l #1,er2
  45. bne 3b
  46. 4:
  47. ;; count % 4
  48. and.b #3,r3l
  49. beq 6f
  50. 5:
  51. mov.b r1l,@er0
  52. adds #1,er0
  53. dec.b r3l
  54. bne 5b
  55. 6:
  56. rts
  57. clear_user:
  58. mov.l er1, er2
  59. sub.l er1, er1
  60. bra memset
  61. .end