strcpy.s 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. TEXT strcpy(SB), $0
  2. MOVW s2+4(FP),R2 /* R2 is from pointer */
  3. MOVW R1, R3 /* R3 is to pointer */
  4. /*
  5. * align 'from' pointer
  6. */
  7. l1:
  8. AND $3, R2, R5
  9. ADDU $1, R2
  10. BEQ R5, l2
  11. MOVB -1(R2), R5
  12. ADDU $1, R3
  13. MOVB R5, -1(R3)
  14. BNE R5, l1
  15. RET
  16. /*
  17. * test if 'to' is also alligned
  18. */
  19. l2:
  20. AND $3,R3, R5
  21. BEQ R5, l4
  22. /*
  23. * copy 4 at a time, 'to' not aligned
  24. */
  25. l3:
  26. MOVW -1(R2), R4
  27. ADD $4, R2
  28. ADD $4, R3
  29. SRL $24,R4, R5
  30. MOVB R5, -4(R3)
  31. BEQ R5, out
  32. SRL $16,R4, R5
  33. AND $0xff, R5
  34. MOVB R5, -3(R3)
  35. BEQ R5, out
  36. SRL $8,R4, R5
  37. AND $0xff, R5
  38. MOVB R5, -2(R3)
  39. BEQ R5, out
  40. AND $0xff,R4, R5
  41. MOVB R5, -1(R3)
  42. BNE R5, l3
  43. out:
  44. RET
  45. /*
  46. * word at a time both aligned
  47. */
  48. l4:
  49. MOVW $0xff000000, R7
  50. MOVW $0x00ff0000, R8
  51. l5:
  52. ADDU $4, R3
  53. MOVW -1(R2), R4 /* fetch */
  54. ADDU $4, R2
  55. AND R7,R4, R5 /* is it byte 0 */
  56. AND R8,R4, R6 /* is it byte 1 */
  57. BEQ R5, b0
  58. AND $0xff00,R4, R5 /* is it byte 2 */
  59. BEQ R6, b1
  60. AND $0xff,R4, R6 /* is it byte 3 */
  61. BEQ R5, b2
  62. MOVW R4, -4(R3) /* store */
  63. BNE R6, l5
  64. JMP out
  65. b0:
  66. MOVB $0, -4(R3)
  67. JMP out
  68. b1:
  69. SRL $24, R4
  70. MOVB R4, -4(R3)
  71. MOVB $0, -3(R3)
  72. JMP out
  73. b2:
  74. SRL $24,R4, R5
  75. MOVB R5, -4(R3)
  76. SRL $16, R4
  77. MOVB R4, -3(R3)
  78. MOVB $0, -2(R3)
  79. JMP out