home *** CD-ROM | disk | FTP | other *** search
- ;---------------------------------------------------------------------
- ; memcpy() -- a faster version
- ;---------------------------------------------------------------------
- ; toaddr = memcpy( to,from,count)
-
- ; This routine copies "count" bytes from the "from" address to the "to"
- ; address. It attempts to move data in longwords whenever possible. The
- ; "to" address is returned.
-
- ; Robert Broughton
- ; 328-1027 Davie St.
- ; Vancouver, BC V6E 4L2
- ; Canada
- ; USENet: a1040@mindlink.UUCP
- ;
- MANX SET 1
- IFND MANX
- IDNT _memcpy
- CSECT _memcpy
- ENDC
- XDEF _memcpy
- _memcpy:
- link a5,#.127
- move.l 8(a5),a1 ;* out
- move.l 12(a5),a0 ;* in
- move.l 16(a5),d0 ;* count
-
- cmp.l #7,d0
- ble finish ;* too small, don't bother with optimization
-
- move.l a0,d1
- btst #0,d1 ;* even or odd
- beq ineven ;* it's even already
- move.b (a0)+,(a1)+ ;* now it's even
- subq.l #1,d0
- ineven:
- move.l a1,d1
- btst #0,d1 ;*ááhow about output
- beq outeven
-
- outodd:
- ; unfortunately, the output address is not word-aligned, so we will
- ; load a long word, and store it as four bytes
- cmp.l #3,d0
- ble finish
-
- move.l (a0)+,d1
- move.b d1,3(a1)
- lsr.w #8,d1
- move.b d1,2(a1)
- swap d1
- move.b d1,1(a1)
- lsr.w #8,d1
- move.b d1,(a1)
- addq.l #4,a1
- subq.l #4,d0
- bra outodd
-
- outeven:
- ; ideal situation; we can load and store longwords
- cmp.l #3,d0
- ble finish
-
- move.l (a0)+,(a1)+
- subq.l #4,d0
- bra outeven
-
- finish:
- cmp.b #0,d0
- ble really
- move.b (a0)+,(a1)+
- dbf d0,finish
-
- really:
- move.l 8(a5),d0 ;* Lattice memcpy does this
- unlk a5
- rts
- .127 equ 0
-
-