Annotation of 42BSD/usr.lib/sendmail/src/bmove.11.s, revision 1.1.1.1

1.1       root        1: /
                      2: /  BMOVE -- block move
                      3: /
                      4: /      @(#)bmove.11.s  4.1     7/25/83
                      5: /
                      6: /      This is a highly optimized version of the old C-language
                      7: /      bmove routine; it's function (should be) identical.
                      8: /      It uses a fancy algorithm to move words instead of bytes
                      9: /      whenever possible.
                     10: /
                     11: /      In C the routine is:
                     12: /              char *bmove(a, b, l)
                     13: /              char    *a, *b;
                     14: /              int     l;
                     15: /              {
                     16: /                      register int    n;
                     17: /                      register char   *p, *q;
                     18: /                      p = a;
                     19: /                      q = b;
                     20: /                      n = l;
                     21: /                      while (n--)
                     22: /                              *q++ = *p++;
                     23: /                      return (q);
                     24: /              }
                     25: /
                     26: /      Parameters:
                     27: /              a [4(sp)] -- source area
                     28: /              b [6(sp)] -- target area
                     29: /              l [10(sp)] -- byte count
                     30: /
                     31: /      Returns:
                     32: /              Pointer to end of target area.
                     33: /
                     34: /      History:
                     35: /              3/14/79 [rse] -- added odd to odd case
                     36: /              2/9/78 [bob] -- converted from "C"
                     37: /
                     38: /
                     39: 
                     40: .globl _bmove
                     41: 
                     42: _bmove:
                     43:        mov     r2,-(sp)        / save r2
                     44:        mov     4(sp),r1        / get src address
                     45:        mov     6(sp),r0        / get dst address
                     46: 
                     47:        / determine whether to use word or byte move
                     48:        mov     r0,r2           / r2 will reflect the three cases
                     49:        bic     $177776,r2      / keep only last bit of dst
                     50:        ror     4(sp)           / get least significant bit of src
                     51:        adc     r2              / add it in.
                     52:        beq     wordm           / both on even boundary
                     53:        dec     r2              / check for odd case
                     54:        bgt     wordodd         / both on odd boundary
                     55: 
                     56:        mov     10(sp),r2       / get count
                     57:        beq     done
                     58: bytem:
                     59:        movb    (r1)+,(r0)+     / copy next byte
                     60:        sob     r2,bytem        / branch until done
                     61:        br      done
                     62: 
                     63: wordm:
                     64:        mov     10(sp),r2       / get count
                     65: wordt:
                     66:        beq     done
                     67:        asr     r2              / get word count
                     68:        bcs     odd             / count was odd
                     69: even:
                     70:        mov     (r1)+,(r0)+     / copy word
                     71:        sob     r2,even         / more to do if non-zero
                     72:        br      done
                     73: 
                     74: wordodd:
                     75:        mov     10(sp),r2       / get count
                     76:        beq     done
                     77:        movb    (r1)+,(r0)+     / copy byte
                     78:        dec     r2              / dec count
                     79:        br      wordt           / now treat as an even word move
                     80: 
                     81: odd:
                     82:        beq     odd2            / special case of count = 1
                     83: odd1:
                     84:        mov     (r1)+,(r0)+     / copy word
                     85:        sob     r2,odd1         / continue
                     86: odd2:
                     87:        movb    (r1)+,(r0)+     / count was odd. do last one
                     88: 
                     89: done:
                     90:        mov     (sp)+,r2        / restore r2
                     91:        rts     pc              / return

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.