memset.S 867 B

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