home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib25.zoo / bcopy.s < prev    next >
Text File  |  1992-12-12  |  4KB  |  215 lines

  1.  
  2. |    new version of bcopy, memcpy and memmove
  3. |    handles overlap, odd/even alignment
  4. |    uses movem to copy 256 bytes blocks faster.
  5. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  6. |    sortof inspired by jrbs bcopy
  7.  
  8.     .text
  9.     .even
  10.     .globl _bcopy
  11.     .globl    __bcopy
  12.     .globl _memcpy
  13.     .globl _memmove
  14.  
  15. |    void *memcpy( void *dest, const void *src, size_t len );
  16. |    void *memmove( void *dest, const void *src, size_t len );
  17. |    returns dest
  18. |    functions are aliased
  19.  
  20. _memcpy:
  21. _memmove:
  22.     movl    sp@(4),a1    | dest
  23.     movl    sp@(8),a0    | src
  24.     jra    common        | the rest is samea as bcopy
  25.  
  26. |    void bcopy( const void *src, void *dest, size_t length );
  27. |    void lbcopy( const void *src, void *dest, size_t length );
  28. |    return value not used (returns src)
  29. |    functions are aliased
  30.  
  31. _bcopy:
  32. __bcopy:
  33.     movl    sp@(4),a0    | src
  34.     movl    sp@(8),a1    | dest
  35. common:    movl    sp@(12),d0    | length
  36.     jeq    exit        | length==0? (size_t)
  37.  
  38.                 | a0 src, a1 dest, d0.l length
  39.     movel    d2,sp@-
  40.  
  41.     | overlay ?
  42.     cmpl    a0,a1
  43.     jgt    top_down
  44.  
  45.     movw    a0,d1        | test for alignment
  46.     movw    a1,d2
  47.     eorw    d2,d1
  48.     btst    #0,d1        | one odd one even ?
  49.     jne    slow_copy
  50.     btst    #0,d2        | both even ?
  51.     jeq    both_even
  52.     movb    a0@+,a1@+    | copy one byte, now we are both even
  53.     subql    #1,d0
  54. both_even:
  55.     clrw    d1        | save length less 256
  56.     movb    d0,d1
  57.     lsrl    #8,d0        | number of 256 bytes blocks
  58.     jeq    less256
  59.     movml    d1/d3-d7/a2/a3/a5/a6,sp@-    | d2 is already saved
  60.                     | exclude a4 because of -mbaserel
  61. copy256:
  62.     movml    a0@+,d1-d7/a2/a3/a5/a6    | copy 5*44+36=256 bytes
  63.     movml    d1-d7/a2/a3/a5/a6,a1@
  64.     movml    a0@+,d1-d7/a2/a3/a5/a6
  65.     movml    d1-d7/a2/a3/a5/a6,a1@(44)
  66.     movml    a0@+,d1-d7/a2/a3/a5/a6
  67.     movml    d1-d7/a2/a3/a5/a6,a1@(88)
  68.     movml    a0@+,d1-d7/a2/a3/a5/a6
  69.     movml    d1-d7/a2/a3/a5/a6,a1@(132)
  70.     movml    a0@+,d1-d7/a2/a3/a5/a6
  71.     movml    d1-d7/a2/a3/a5/a6,a1@(176)
  72.     movml    a0@+,d1-d7/a2-a3
  73.     movml    d1-d7/a2-a3,a1@(220)
  74.     lea    a1@(256),a1        | increment dest, src is already
  75.     subql    #1,d0
  76.     jne    copy256         | next, please
  77.     movml    sp@+,d1/d3-d7/a2/a3/a5/a6
  78. less256:            | copy 16 bytes blocks
  79.     movw    d1,d0
  80.     lsrw    #2,d0        | number of 4 bytes blocks
  81.     jeq    less4        | less that 4 bytes left
  82.     movw    d0,d2
  83.     negw    d2
  84.     andw    #3,d2        | d2 = number of bytes below 16 (-n)&3
  85.     subqw    #1,d0
  86.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d2==0
  87.     addw    d2,d2        | offset in code (movl two bytes)
  88.     jmp    pc@(2,d2:w)    | jmp into loop
  89. copy16:
  90.     movl    a0@+,a1@+
  91.     movl    a0@+,a1@+
  92.     movl    a0@+,a1@+
  93.     movl    a0@+,a1@+
  94.     dbra    d0,copy16
  95. less4:
  96.     btst    #1,d1
  97.     jeq    less2
  98.     movw    a0@+,a1@+
  99. less2:
  100.     btst    #0,d1
  101.     jeq    none
  102.     movb    a0@,a1@
  103. none:
  104. exit_d2:
  105.     movl    sp@+,d2
  106. exit:
  107.     movl sp@(4),d0        | return dest (for memcpy only)
  108.     rts
  109.  
  110. slow_copy:            | byte by bytes copy
  111.     movw    d0,d1
  112.     negw    d1
  113.     andw    #7,d1        | d1 = number of bytes blow 8 (-n)&7
  114.     addql    #7,d0
  115.     lsrl    #3,d0        | number of 8 bytes block plus 1, if d1!=0
  116.     addw    d1,d1        | offset in code (movb two bytes)
  117.     jmp    pc@(2,d1:w)    | jump into loop
  118. scopy:
  119.     movb    a0@+,a1@+
  120.     movb    a0@+,a1@+
  121.     movb    a0@+,a1@+
  122.     movb    a0@+,a1@+
  123.     movb    a0@+,a1@+
  124.     movb    a0@+,a1@+
  125.     movb    a0@+,a1@+
  126.     movb    a0@+,a1@+
  127.     subql    #1,d0
  128.     jne    scopy
  129.     jra    exit_d2
  130.  
  131. top_down:
  132.     addl    d0,a0        | a0 byte after end of src
  133.     addl    d0,a1        | a1 byte after end of dest
  134.  
  135.     movw    a0,d1        | exact the same as above, only with predec
  136.     movw    a1,d2
  137.     eorw    d2,d1
  138.     btst    #0,d1
  139.     jne    slow_copy_d
  140.  
  141.     btst    #0,d2
  142.     jeq    both_even_d
  143.     movb    a0@-,a1@-
  144.     subql    #1,d0
  145. both_even_d:
  146.     clrw    d1
  147.     movb    d0,d1
  148.     lsrl    #8,d0
  149.     jeq    less256_d
  150.     movml    d1/d3-d7/a2/a3/a5/a6,sp@-
  151. copy256_d:
  152.     movml    a0@(-44),d1-d7/a2/a3/a5/a6
  153.     movml    d1-d7/a2/a3/a5/a6,a1@-
  154.     movml    a0@(-88),d1-d7/a2/a3/a5/a6
  155.     movml    d1-d7/a2/a3/a5/a6,a1@-
  156.     movml    a0@(-132),d1-d7/a2/a3/a5/a6
  157.     movml    d1-d7/a2/a3/a5/a6,a1@-
  158.     movml    a0@(-176),d1-d7/a2/a3/a5/a6
  159.     movml    d1-d7/a2/a3/a5/a6,a1@-
  160.     movml    a0@(-220),d1-d7/a2/a3/a5/a6
  161.     movml    d1-d7/a2/a3/a5/a6,a1@-
  162.     movml    a0@(-256),d1-d7/a2-a3
  163.     movml    d1-d7/a2-a3,a1@-
  164.     lea    a0@(-256),a0
  165.     subql    #1,d0
  166.     jne    copy256_d
  167.     movml    sp@+,d1/d3-d7/a2/a3/a5/a6
  168. less256_d:
  169.     movw    d1,d0
  170.     lsrw    #2,d0
  171.     jeq    less4_d
  172.     movw    d0,d2
  173.     negw    d2
  174.     andw    #3,d2
  175.     subqw    #1,d0
  176.     lsrw    #2,d0
  177.     addw    d2,d2
  178.     jmp    pc@(2,d2:w)
  179. copy16_d:
  180.     movl    a0@-,a1@-
  181.     movl    a0@-,a1@-
  182.     movl    a0@-,a1@-
  183.     movl    a0@-,a1@-
  184.     dbra    d0,copy16_d
  185. less4_d:
  186.     btst    #1,d1
  187.     jeq    less2_d
  188.     movw    a0@-,a1@-
  189. less2_d:
  190.     btst    #0,d1
  191.     jeq    exit_d2
  192.     movb    a0@-,a1@-
  193.     jra    exit_d2
  194. slow_copy_d:
  195.     movw    d0,d1
  196.     negw    d1
  197.     andw    #7,d1
  198.     addql    #7,d0
  199.     lsrl    #3,d0
  200.     addw    d1,d1
  201.     jmp    pc@(2,d1:w)
  202. scopy_d:
  203.     movb    a0@-,a1@-
  204.     movb    a0@-,a1@-
  205.     movb    a0@-,a1@-
  206.     movb    a0@-,a1@-
  207.     movb    a0@-,a1@-
  208.     movb    a0@-,a1@-
  209.     movb    a0@-,a1@-
  210.     movb    a0@-,a1@-
  211.     subql    #1,d0
  212.     jne    scopy_d
  213.     jra    exit_d2
  214.  
  215.