memset.S 814 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /* $Id: memset.S,v 1.1 2000/04/14 16:49:01 mjd Exp $
  2. *
  3. * "memset" implementation of SuperH
  4. *
  5. * Copyright (C) 1999 Niibe Yutaka
  6. *
  7. */
  8. /*
  9. * void *memset(void *s, int c, size_t n);
  10. */
  11. #include <linux/linkage.h>
  12. ENTRY(memset)
  13. tst r6,r6
  14. bt/s 5f ! if n=0, do nothing
  15. add r6,r4
  16. mov #12,r0
  17. cmp/gt r6,r0
  18. bt/s 4f ! if it's too small, set a byte at once
  19. mov r4,r0
  20. and #3,r0
  21. cmp/eq #0,r0
  22. bt/s 2f ! It's aligned
  23. sub r0,r6
  24. 1:
  25. dt r0
  26. bf/s 1b
  27. mov.b r5,@-r4
  28. 2: ! make VVVV
  29. swap.b r5,r0 ! V0
  30. or r0,r5 ! VV
  31. swap.w r5,r0 ! VV00
  32. or r0,r5 ! VVVV
  33. !
  34. mov r6,r0
  35. shlr2 r0
  36. shlr r0 ! r0 = r6 >> 3
  37. 3:
  38. dt r0
  39. mov.l r5,@-r4 ! set 8-byte at once
  40. bf/s 3b
  41. mov.l r5,@-r4
  42. !
  43. mov #7,r0
  44. and r0,r6
  45. tst r6,r6
  46. bt 5f
  47. ! fill bytes
  48. 4:
  49. dt r6
  50. bf/s 4b
  51. mov.b r5,@-r4
  52. 5:
  53. rts
  54. mov r4,r0