Annotation of researchv10no/libc/gen/memcmp.s, revision 1.1

1.1     ! root        1:        .file   "memcmp.s"
        !             2: #      @(#)memcmp.s    1.5
        !             3: # Fast assembler language version of the following C-program for
        !             4: #                      memcmp
        !             5: # which represents the `standard' for the C-library.
        !             6: 
        !             7: # Compare n bytes:  s1>s2: >0  s1==s2: 0  s1<s2: <0
        !             8: 
        !             9: #      int
        !            10: #      memcmp(s1, s2, n)
        !            11: #      register char *s1, *s2;
        !            12: #      register int n;
        !            13: #      {
        !            14: #              int diff;
        !            15: #
        !            16: #              if (s1 != s2)
        !            17: #                      while (--n >= 0)
        !            18: #                              if (diff = *s1++ - *s2++)
        !            19: #                                      return (diff);
        !            20: #              return (0);
        !            21: #      }
        !            22:        .globl  _memcmp
        !            23:        .text
        !            24:        .align  2
        !            25: _memcmp:
        !            26:        .word   0x0000          # uses regs. 0,1,2,3,4
        !            27:        movl    12(ap),r4       # arg `n'
        !            28:        bleq    L4              #      should be > 0
        !            29:        movq    4(ap),r1        # s1 in r1; s2 in r2
        !            30:        cmpl    r1,r2           # if pointers are eql, strings are also
        !            31:        beql    L4              # return a zero
        !            32:        movl    r2,r3           # s2
        !            33: L0:
        !            34:        cmpl    $65535,r4       # check for whether `n' <= 65535
        !            35:        bgeq    L1              # skip if r4 is not too big
        !            36:        cmpc3   $65535,(r1),(r3)        # Compare s1 and s2
        !            37:        bneq    L2              # skip if strings are !=
        !            38:        subl2   $65535,r4
        !            39:        jbr     L0              # more compare is needed, go back
        !            40: L1:
        !            41:        cmpc3   r4,(r1),(r3)    # Compare s1 and s2
        !            42:        beql    L3              # skip if strings are ==
        !            43: L2:
        !            44:        subb3   (r3),(r1),r0    # difference is returned
        !            45:        cvtbl   r0,r0           # gotta make it an int
        !            46: L3:
        !            47:        ret                     # else return a zero (r0 = 0 already)
        !            48: L4:
        !            49:        clrl    r0              # n <= 0; return a zero
        !            50:        ret

unix.superglobalmegacorp.com

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