memset.S 975 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (C) 2004-2006 Atmel Corporation
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. /*
  7. * r12: void *b
  8. * r11: int c
  9. * r10: size_t len
  10. *
  11. * Returns b in r12
  12. */
  13. .section .text.memset, "ax", @progbits
  14. .global memset
  15. .type memset, @function
  16. .align 2
  17. memset:
  18. mov r9, r12
  19. mov r8, r12
  20. or r11, r11, r11 << 8
  21. andl r9, 3, COH
  22. brne 1f
  23. 2: or r11, r11, r11 << 16
  24. sub r10, 4
  25. brlt 5f
  26. /* Let's do some real work */
  27. 4: st.w r8++, r11
  28. sub r10, 4
  29. brge 4b
  30. /*
  31. * When we get here, we've got less than 4 bytes to set. r10
  32. * might be negative.
  33. */
  34. 5: sub r10, -4
  35. reteq r12
  36. /* Fastpath ends here, exactly 32 bytes from memset */
  37. /* Handle unaligned count or pointer */
  38. bld r10, 1
  39. brcc 6f
  40. st.b r8++, r11
  41. st.b r8++, r11
  42. bld r10, 0
  43. retcc r12
  44. 6: st.b r8++, r11
  45. mov pc, lr
  46. /* Handle unaligned pointer */
  47. 1: sub r10, 4
  48. brlt 5b
  49. add r10, r9
  50. lsl r9, 1
  51. add pc, r9
  52. st.b r8++, r11
  53. st.b r8++, r11
  54. st.b r8++, r11
  55. rjmp 2b
  56. .size memset, . - memset