Annotation of researchv10no/libc/gen/memcmp.s, revision 1.1.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.