memset.s 1002 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. TO = 1
  2. TOE = 2
  3. N = 3
  4. TMP = 3 /* N and TMP don't overlap */
  5. TEXT memset(SB), $0
  6. MOVW R0, R(TO)
  7. MOVW data+4(FP), R(4)
  8. MOVW n+8(FP), R(N)
  9. ADD R(N), R(TO), R(TOE) /* to end pointer */
  10. CMP $4, R(N) /* need at least 4 bytes to copy */
  11. BLT _1tail
  12. AND $0xFF, R(4)
  13. ORR R(4)<<8, R(4)
  14. ORR R(4)<<16, R(4) /* replicate to word */
  15. _4align: /* align on 4 */
  16. AND.S $3, R(TO), R(TMP)
  17. BEQ _4aligned
  18. MOVBU.P R(4), 1(R(TO)) /* implicit write back */
  19. B _4align
  20. _4aligned:
  21. SUB $15, R(TOE), R(TMP) /* do 16-byte chunks if possible */
  22. CMP R(TMP), R(TO)
  23. BHS _4tail
  24. MOVW R4, R5 /* replicate */
  25. MOVW R4, R6
  26. MOVW R4, R7
  27. _f16loop:
  28. CMP R(TMP), R(TO)
  29. BHS _4tail
  30. MOVM.IA.W [R4-R7], (R(TO))
  31. B _f16loop
  32. _4tail:
  33. SUB $3, R(TOE), R(TMP) /* do remaining words if possible */
  34. _4loop:
  35. CMP R(TMP), R(TO)
  36. BHS _1tail
  37. MOVW.P R(4), 4(R(TO)) /* implicit write back */
  38. B _4loop
  39. _1tail:
  40. CMP R(TO), R(TOE)
  41. BEQ _return
  42. MOVBU.P R(4), 1(R(TO)) /* implicit write back */
  43. B _1tail
  44. _return:
  45. RET