strcpy.s 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. TEXT strcpy(SB), $0
  2. MOVW R7, 0(FP)
  3. MOVW s1+0(FP), R9 /* R9 is to pointer */
  4. MOVW s2+4(FP), R10 /* R10 is from pointer */
  5. /*
  6. * test if both pointers
  7. * are similarly word aligned
  8. */
  9. XOR R9,R10, R7
  10. ANDCC $3,R7, R0
  11. BNE una
  12. /*
  13. * make byte masks
  14. */
  15. MOVW $0xff, R17
  16. SLL $8,R17, R16
  17. SLL $16,R17, R13
  18. SLL $24,R17, R12
  19. /*
  20. * byte at a time to word align
  21. */
  22. al1:
  23. ANDCC $3,R10, R0
  24. BE al2
  25. MOVB (R10), R11
  26. ADD $1, R10
  27. MOVB R11, (R9)
  28. ADD $1, R9
  29. SUBCC R0,R11, R0
  30. BNE al1
  31. JMP out
  32. /*
  33. * word at a time
  34. */
  35. al2:
  36. ADD $4, R9
  37. MOVW (R10), R11 /* fetch */
  38. ADD $4, R10
  39. ANDCC R12,R11, R0 /* is it byte 0 */
  40. BE b0
  41. ANDCC R13,R11, R0 /* is it byte 1 */
  42. BE b1
  43. ANDCC R16,R11, R0 /* is it byte 2 */
  44. BE b2
  45. MOVW R11, -4(R9) /* store */
  46. ANDCC R17,R11, R0 /* is it byte 3 */
  47. BNE al2
  48. JMP out
  49. b0:
  50. MOVB R0, -4(R9)
  51. JMP out
  52. b1:
  53. SRL $24, R11
  54. MOVB R11, -4(R9)
  55. MOVB R0, -3(R9)
  56. JMP out
  57. b2:
  58. SRL $24,R11, R7
  59. MOVB R7, -4(R9)
  60. SRL $16, R11
  61. MOVB R11, -3(R9)
  62. MOVB R0, -2(R9)
  63. JMP out
  64. una:
  65. MOVB (R10), R11
  66. ADD $1, R10
  67. MOVB R11, (R9)
  68. ADD $1, R9
  69. SUBCC R0,R11, R0
  70. BNE una
  71. out:
  72. MOVW s1+0(FP),R7
  73. RETURN