home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib32.zoo / bzero.cpp < prev    next >
C/C++ Source or Header  |  1993-01-30  |  3KB  |  131 lines

  1. |    new version of bcopy and memset
  2. |    uses movem to set 256 bytes blocks faster.
  3. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  4. |    sortof inspired by jrbs bcopy
  5. |    has to be preprocessed (int parameter in memset)
  6.  
  7.     .text
  8.     .even
  9.     .globl _bzero
  10.     .globl __bzero
  11.     .globl _memset
  12.  
  13. |    void *memset( void *dest, int val, size_t len );
  14. |    returns dest
  15. |    two versions for 16/32 bits
  16.  
  17. _memset:
  18.     movl    sp@(4),a0    | dest
  19. #ifdef __MSHORT__
  20.     movb    sp@(9),d0    | value
  21. # ifndef __SOZOBON__
  22.     movl    sp@(10),d1    | length
  23. # else
  24.     clrl    d1
  25.     movw    sp@(10),d1    | length
  26. # endif
  27. #else
  28.     movb    sp@(11),d0    | value
  29.     movl    sp@(12),d1    | length
  30. #endif
  31.     jeq    exit        | length==0? (size_t)
  32.     jra    do_set
  33.  
  34. |    void bzero( void *dest, size_t length );
  35. |    void _bzero( void *dest, unsigned long length );
  36. |    return value not used (returns dest)
  37.  
  38. #ifdef __SOZOBON__
  39. _bzero:
  40.     movl    sp@(4),a0    | dest
  41.     clrl    d1
  42.     movw    sp@(8),d1    | length
  43.     jra    scommon
  44. #else
  45. _bzero:
  46. #endif
  47. __bzero:
  48.     movl    sp@(4),a0    | dest
  49.     movl    sp@(8),d1    | length
  50. scommon:
  51.     jeq    exit        | length==0? (size_t)
  52.     clrb    d0        | value
  53.  
  54. do_set:             | a0 dest, d0.b byte, d1.l length
  55.     movel    d2,sp@-
  56.  
  57.     addl    d1,a0        | a0 points to end of area, needed for predec
  58.  
  59.     movw    a0,d2        | test for alignment
  60.     btst    #0,d2        | odd ?
  61.     jeq    areeven
  62.     movb    d0,a0@-     | set one byte, now we are even
  63.     subql    #1,d1
  64. areeven:
  65.     movb    d0,d2
  66.     lslw    #8,d0
  67.     movb    d2,d0
  68.     movw    d0,d2
  69.     swap    d2
  70.     movw    d0,d2        | d2 has byte now four times
  71.  
  72.     clrw    d0        | save length less 256
  73.     movb    d1,d0
  74.     lsrl    #8,d1        | number of 256 bytes blocks
  75.     jeq    less256
  76.     movml    d0/d3-d7/a2/a3/a5/a6,sp@-    | d2 is already saved
  77.                 | exclude a4 because of -mbaserel
  78.     movl    d2,d0
  79.     movl    d2,d3
  80.     movl    d2,d4
  81.     movl    d2,d5
  82.     movl    d2,d6
  83.     movl    d2,d7
  84.     movl    d2,a2
  85.     movl    d2,a3
  86.     movl    d2,a5
  87.     movl    d2,a6
  88. set256:
  89.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-    | set 5*44+36=256 bytes
  90.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  91.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  92.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  93.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  94.     movml    d0/d2-d7/a2-a3,a0@-
  95.     subql    #1,d1
  96.     jne    set256            | next, please
  97.     movml    sp@+,d0/d3-d7/a2/a3/a5/a6
  98. less256:            | set 16 bytes blocks
  99.     movw    d0,sp@-     | save length below 256 for last 3 bytes
  100.     lsrw    #2,d0        | number of 4 bytes blocks
  101.     jeq    less4        | less that 4 bytes left
  102.     movw    d0,d1
  103.     negw    d1
  104.     andw    #3,d1        | d1 = number of bytes below 16 (-n)&3
  105.     subqw    #1,d0
  106.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d1==0
  107.     addw    d1,d1        | offset in code (movl two bytes)
  108.     jmp    pc@(2,d1:w)    | jmp into loop
  109. set16:
  110.     movl    d2,a0@-
  111.     movl    d2,a0@-
  112.     movl    d2,a0@-
  113.     movl    d2,a0@-
  114.     dbra    d0,set16
  115. less4:
  116.     movw    sp@+,d0
  117.     btst    #1,d0
  118.     jeq    less2
  119.     movw    d2,a0@-
  120. less2:
  121.     btst    #0,d0
  122.     jeq    none
  123.     movb    d2,a0@-
  124. none:
  125. exit_d2:
  126.     movl    sp@+,d2
  127. exit:
  128.     movl sp@(4),d0        | return dest (for memset only)
  129.     rts
  130.  
  131.