strcpy.s 885 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. TEXT strcpy(SB), $-4
  2. MOVW R0, to+0(FP) /* need to save for return value */
  3. MOVW from+4(FP), R1
  4. MOVW $0xFF, R2 /* mask */
  5. salign: /* align source on 4 */
  6. AND.S $3, R1, R3
  7. BEQ dalign
  8. MOVBU.P 1(R1), R3 /* implicit write back */
  9. TST R3, R2
  10. MOVBU.P R3, 1(R0) /* implicit write back */
  11. BNE salign
  12. B return
  13. dalign: /* is destination now aligned? */
  14. AND.S $3, R0, R3
  15. BNE uloop
  16. aloop:
  17. MOVW.P 4(R1), R4 /* read 4, write 4 */
  18. TST R4, R2 /* AND.S R3, R2, Rx */
  19. TST.NE R4>>8, R2
  20. TST.NE R4>>16, R2
  21. TST.NE R4>>24, R2
  22. BEQ tail
  23. MOVW.P R4, 4(R0)
  24. B aloop
  25. uloop:
  26. MOVW.P 4(R1), R4 /* read 4, write 1,1,1,1 */
  27. tail:
  28. AND.S R4, R2, R3
  29. MOVBU.NE.P R3, 1(R0)
  30. AND.NE.S R4>>8, R2, R3
  31. MOVBU.NE.P R3, 1(R0)
  32. AND.NE.S R4>>16, R2, R3
  33. MOVBU.NE.P R3, 1(R0)
  34. AND.NE.S R4>>24, R2, R3
  35. MOVBU.P R3, 1(R0)
  36. BNE uloop
  37. B return
  38. return:
  39. MOVW to+0(FP), R0
  40. RET