memset.S 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */
  7. .global memset
  8. .align 4
  9. memset:
  10. mov_s %r4, %r0
  11. or %r12, %r0, %r2
  12. bmsk.f %r12, %r12, 1
  13. extb_s %r1, %r1
  14. asl %r3, %r1, 8
  15. beq.d .Laligned
  16. or_s %r1, %r1, %r3
  17. brls %r2, SMALL, .Ltiny
  18. add %r3, %r2, %r0
  19. stb %r1, [%r3, -1]
  20. bclr_s %r3, %r3, 0
  21. stw %r1, [%r3, -2]
  22. bmsk.f %r12, %r0, 1
  23. add_s %r2, %r2, %r12
  24. sub.ne %r2, %r2, 4
  25. stb.ab %r1, [%r4, 1]
  26. and %r4, %r4, -2
  27. stw.ab %r1, [%r4, 2]
  28. and %r4, %r4, -4
  29. .balign 4
  30. .Laligned:
  31. asl %r3, %r1, 16
  32. lsr.f %lp_count, %r2, 2
  33. or_s %r1, %r1, %r3
  34. lpne .Loop_end
  35. st.ab %r1, [%r4, 4]
  36. .Loop_end:
  37. j_s [%blink]
  38. .balign 4
  39. .Ltiny:
  40. mov.f %lp_count, %r2
  41. lpne .Ltiny_end
  42. stb.ab %r1, [%r4, 1]
  43. .Ltiny_end:
  44. j_s [%blink]
  45. /*
  46. * memzero: @r0 = mem, @r1 = size_t
  47. * memset: @r0 = mem, @r1 = char, @r2 = size_t
  48. */
  49. .global memzero
  50. .align 4
  51. memzero:
  52. /* adjust bzero args to memset args */
  53. mov %r2, %r1
  54. mov %r1, 0
  55. /* tail call so need to tinker with blink */
  56. b memset