memset.S 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. */
  8. #include <linux/linkage.h>
  9. #define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */
  10. ENTRY_CFI(memset)
  11. mov_s r4,r0
  12. or r12,r0,r2
  13. bmsk.f r12,r12,1
  14. extb_s r1,r1
  15. asl r3,r1,8
  16. beq.d .Laligned
  17. or_s r1,r1,r3
  18. brls r2,SMALL,.Ltiny
  19. add r3,r2,r0
  20. stb r1,[r3,-1]
  21. bclr_s r3,r3,0
  22. stw r1,[r3,-2]
  23. bmsk.f r12,r0,1
  24. add_s r2,r2,r12
  25. sub.ne r2,r2,4
  26. stb.ab r1,[r4,1]
  27. and r4,r4,-2
  28. stw.ab r1,[r4,2]
  29. and r4,r4,-4
  30. .Laligned: ; This code address should be aligned for speed.
  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. END_CFI(memset)
  46. ; memzero: @r0 = mem, @r1 = size_t
  47. ; memset: @r0 = mem, @r1 = char, @r2 = size_t
  48. ENTRY_CFI(memzero)
  49. ; adjust bzero args to memset args
  50. mov r2, r1
  51. mov r1, 0
  52. b memset ;tail call so need to tinker with blink
  53. END_CFI(memzero)