memcpy.s 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. TEXT memcpy(SB), $0
  2. MOVL n+8(FP),R0
  3. BEQ return
  4. BGT ok
  5. MOVL 0, R0
  6. ok:
  7. MOVL s1+0(FP),A2
  8. MOVL s2+4(FP),A1
  9. CMPL A2,A1
  10. BHI back
  11. /*
  12. * speed depends on source allignment
  13. * destination allignment is secondary
  14. * byte-at-a-time foreward copy to
  15. * get source (A1) alligned.
  16. */
  17. f1:
  18. MOVL A1, R1
  19. ANDL $3, R1
  20. BEQ f2
  21. SUBL $1, R0
  22. BLT return
  23. MOVB (A1)+, (A2)+
  24. BRA f1
  25. /*
  26. * quad-long-at-a-time forward copy
  27. */
  28. f2:
  29. SUBL $16, R0
  30. BLT f3
  31. MOVL (A1)+, (A2)+
  32. MOVL (A1)+, (A2)+
  33. MOVL (A1)+, (A2)+
  34. MOVL (A1)+, (A2)+
  35. BRA f2
  36. /*
  37. * cleanup byte-at-a-time
  38. */
  39. f3:
  40. ADDL $15, R0
  41. BLT return
  42. f4:
  43. MOVB (A1)+, (A2)+
  44. SUBL $1, R0
  45. BGE f4
  46. BRA return
  47. return:
  48. MOVL s1+0(FP),R0
  49. RTS
  50. /*
  51. * everything the same, but
  52. * copy backwards
  53. */
  54. back:
  55. ADDL R0, A1
  56. ADDL R0, A2
  57. /*
  58. * byte-at-a-time backward copy to
  59. * get source (A1) alligned.
  60. */
  61. b1:
  62. MOVL A1, R1
  63. ANDL $3, R1
  64. BEQ b2
  65. SUBL $1, R0
  66. BLT return
  67. MOVB -(A1), -(A2)
  68. BRA b1
  69. /*
  70. * quad-long-at-a-time backward copy
  71. */
  72. b2:
  73. SUBL $16, R0
  74. BLT b3
  75. MOVL -(A1), -(A2)
  76. MOVL -(A1), -(A2)
  77. MOVL -(A1), -(A2)
  78. MOVL -(A1), -(A2)
  79. BRA b2
  80. /*
  81. * cleanup byte-at-a-time backward
  82. */
  83. b3:
  84. ADDL $15, R0
  85. BLT return
  86. b4:
  87. MOVB -(A1), -(A2)
  88. SUBL $1, R0
  89. BGE b4
  90. BRA return