memset.s 844 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. TEXT memset(SB), $0
  2. MOVL R0, R6
  3. MOVBU data+4(FP), R2
  4. MOVL n+8(FP), R10
  5. ADDL R10, R0, R8
  6. CMPUGE $8, R10, R1 /* need at least 8 bytes */
  7. BNE R1, _1loop
  8. SLLQ $8, R2, R1 /* replicate the byte */
  9. OR R1, R2
  10. SLLQ $16, R2, R1
  11. OR R1, R2
  12. SLLQ $32, R2, R1
  13. OR R1, R2
  14. _align:
  15. AND $(8-1), R6, R1
  16. BEQ R1, _aligned
  17. MOVB R2, (R6)
  18. ADDL $1, R6, R6
  19. JMP _align
  20. _aligned:
  21. SUBL $(64-1), R8, R9 /* end pointer minus slop */
  22. _64loop:
  23. CMPUGT R9, R6, R1
  24. BEQ R1, _8tail
  25. MOVQ R2, (R6)
  26. MOVQ R2, 8(R6)
  27. MOVQ R2, 16(R6)
  28. MOVQ R2, 24(R6)
  29. MOVQ R2, 32(R6)
  30. MOVQ R2, 40(R6)
  31. MOVQ R2, 48(R6)
  32. MOVQ R2, 56(R6)
  33. ADDL $64, R6, R6
  34. JMP _64loop
  35. _8tail:
  36. SUBL $(8-1), R8, R9
  37. _8loop:
  38. CMPUGT R9, R6, R1
  39. BEQ R1, _1loop
  40. MOVQ R2, (R6)
  41. ADDL $8, R6
  42. JMP _8loop
  43. _1loop:
  44. CMPUGT R8, R6, R1
  45. BEQ R1, _ret
  46. MOVB R2, (R6)
  47. ADDL $1, R6
  48. JMP _1loop
  49. _ret:
  50. RET