memset.S 747 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /* memset.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(memset)
  11. ;;void *memset(*ptr, int c, size_t count)
  12. ;; ptr = er0
  13. ;; c = er1(r1l)
  14. ;; count = er2
  15. SYMBOL_NAME_LABEL(memset)
  16. btst #0,r0l
  17. beq 2f
  18. ;; odd address
  19. 1:
  20. mov.b r1l,@er0
  21. adds #1,er0
  22. dec.l #1,er2
  23. beq 6f
  24. ;; even address
  25. 2:
  26. mov.l er2,er3
  27. cmp.l #4,er2
  28. blo 4f
  29. ;; count>=4 -> count/4
  30. #if defined(__H8300H__)
  31. shlr.l er2
  32. shlr.l er2
  33. #endif
  34. #if defined(__H8300S__)
  35. shlr.l #2,er2
  36. #endif
  37. ;; byte -> long
  38. mov.b r1l,r1h
  39. mov.w r1,e1
  40. 3:
  41. mov.l er1,@er0
  42. adds #4,er0
  43. dec.l #1,er2
  44. bne 3b
  45. 4:
  46. ;; count % 4
  47. and.b #3,r3l
  48. beq 6f
  49. 5:
  50. mov.b r1l,@er0
  51. adds #1,er0
  52. dec.b r3l
  53. bne 5b
  54. 6:
  55. rts