memset.s 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 $31, R(TOE), R(TMP) /* do 32-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. MOVW R4, R8
  28. MOVW R4, R9
  29. MOVW R4, R10
  30. MOVW R4, R11
  31. _f32loop:
  32. CMP R(TMP), R(TO)
  33. BHS _4tail
  34. MOVM.IA.W [R4-R11], (R(TO))
  35. B _f32loop
  36. _4tail:
  37. SUB $3, R(TOE), R(TMP) /* do remaining words if possible */
  38. _4loop:
  39. CMP R(TMP), R(TO)
  40. BHS _1tail
  41. MOVW.P R(4), 4(R(TO)) /* implicit write back */
  42. B _4loop
  43. _1tail:
  44. CMP R(TO), R(TOE)
  45. BEQ _return
  46. MOVBU.P R(4), 1(R(TO)) /* implicit write back */
  47. B _1tail
  48. _return:
  49. RET