home *** CD-ROM | disk | FTP | other *** search
/ Dream 48 / Amiga_Dream_48.iso / Atari / c / libs / dlibs.memcpy < prev    next >
Text File  |  1998-01-19  |  3KB  |  95 lines

  1. Article 9733 of comp.sys.atari.st:
  2. Path: corona!pbinfo!unido!mcvax!uunet!seismo!sundc!pitstop!sun!decwrl!ucbvax!tut.cis.ohio-state.edu!unmvax!ncar!tank!shamash!com50!pwcs!stag!daemon
  3. From: to_stdnet@stag.UUCP
  4. Newsgroups: comp.sys.atari.st
  5. Subject: Replacement memcpy() for dLibs
  6. Message-ID: <736@stag.UUCP>
  7. Date: 10 Mar 89 03:03:17 GMT
  8. Sender: daemon@stag.UUCP
  9. Lines: 81
  10. Posted: Fri Mar 10 04:03:17 1989
  11.  
  12. From: thelake!steve@stag.UUCP (Steve Yelvington)
  13.  
  14.  
  15. I'm posting the following on the behalf of David Brooks, who is having
  16. some trouble with the postnews mechanism at his site.
  17.         -- Steve Yelvington
  18.  
  19. David Brooks   Internet:       BROOKS@CSSS-A.PRIME.COM
  20.                uucp:           {mit-eddie,uunet}!csss-a.prime.com!brooks
  21. -----8<-----------------------------------------------------------
  22. The broken memcpy() in the version of Dlibs distributed with Sozobon C
  23. will hurt xargs processing (and a few other routines).  Replace it with
  24. the following, which fixes several bugs...
  25.  
  26. * memcpy by David Brooks  1/23/89
  27. *
  28. *    char *memcpy(dest, source, len)
  29. *        char *dest        at 4(sp)
  30. *        char *source        at 8(sp)
  31. *        unsigned int len    at 12(sp)
  32. *
  33. * This is generally optimized around the commonest case (even alignment,
  34. * more than 4 bytes) but the time savings and space cost are minimal.
  35. * Also, we avoid using "btst #n,dn" because of a bug in the Sozobon
  36. * assembler.
  37.  
  38. .text
  39. .globl _memcpy
  40. _memcpy:
  41.     lea    12(a7),a2    ; Point to argument list
  42.     move.w    (a2),d2        ; d2 = len
  43.     move.l    -(a2),a0    ; a0 = source
  44.     move.l    -(a2),a1    ; a1 = dest
  45.     move.l    a1,d0        ; d0 = dest, ready to return
  46.  
  47.     move.l    a0,d1        ; Check for odd/even alignment
  48.     add.w    a1,d1        ; This is really eor.w on the lsb.  Really.
  49.     asr.w    #1,d1        ; Get lsb into C.  If it's 1, alignment is off.
  50.     bcs    memcpy8        ; Go do it slowly
  51.  
  52.     move.l    a0,d1        ; Check for initial odd byte
  53.     asr.w    #1,d1        ; Get lsb
  54.     bcc    memcpy1
  55.     subq.w    #1,d2        ; Move initial byte
  56.     bcs    memcpy6        ;  (unless d2 was 0).  We could use dbra here,
  57.     move.b    (a0)+,(a1)+    ;   but that would have been bigger.
  58. memcpy1:
  59.     moveq.l    #3,d1        ; Split into a longword count and remainder
  60.     and.w    d2,d1
  61.     lsr.w    #2,d2
  62.     bra    memcpy3        ; Enter loop.  Note d2 could equal 0.
  63. memcpy2:
  64.     move.l    (a0)+,(a1)+
  65. memcpy3:
  66.     dbra    d2,memcpy2
  67.  
  68.     bra    memcpy5        ; Enter final loop.  Again d1 could equal 0.
  69. memcpy4:
  70.     move.b    (a0)+,(a1)+    ; Up to 3 trailing bytes
  71. memcpy5:
  72.     dbra    d1,memcpy4
  73. memcpy6:
  74.     rts            ; All done.
  75.  
  76. memcpy7:
  77.     move.b    (a0)+,(a1)+    ; Handle the odd/even aligned case
  78. memcpy8:
  79.     dbra    d2,memcpy7
  80.     rts            ; and exit normally
  81.  
  82.  
  83. -----8<-----------------------------------------------------------
  84.  
  85. forwarded by:
  86.  
  87.  
  88. /*
  89.  * UUCP: {uunet!rosevax,amdahl!bungia,chinet,killer}!orbit!thelake!steve
  90.  * ARPA: crash!orbit!thelake!steve@nosc.mil
  91.  * #member <STdNET> The ST Developers Network
  92.  */
  93.  
  94.  
  95.