|
|
researchv10 Norman
.file "memcmp.s"
# @(#)memcmp.s 1.5
# Fast assembler language version of the following C-program for
# memcmp
# which represents the `standard' for the C-library.
# Compare n bytes: s1>s2: >0 s1==s2: 0 s1<s2: <0
# int
# memcmp(s1, s2, n)
# register char *s1, *s2;
# register int n;
# {
# int diff;
#
# if (s1 != s2)
# while (--n >= 0)
# if (diff = *s1++ - *s2++)
# return (diff);
# return (0);
# }
.globl _memcmp
.text
.align 2
_memcmp:
.word 0x0000 # uses regs. 0,1,2,3,4
movl 12(ap),r4 # arg `n'
bleq L4 # should be > 0
movq 4(ap),r1 # s1 in r1; s2 in r2
cmpl r1,r2 # if pointers are eql, strings are also
beql L4 # return a zero
movl r2,r3 # s2
L0:
cmpl $65535,r4 # check for whether `n' <= 65535
bgeq L1 # skip if r4 is not too big
cmpc3 $65535,(r1),(r3) # Compare s1 and s2
bneq L2 # skip if strings are !=
subl2 $65535,r4
jbr L0 # more compare is needed, go back
L1:
cmpc3 r4,(r1),(r3) # Compare s1 and s2
beql L3 # skip if strings are ==
L2:
subb3 (r3),(r1),r0 # difference is returned
cvtbl r0,r0 # gotta make it an int
L3:
ret # else return a zero (r0 = 0 already)
L4:
clrl r0 # n <= 0; return a zero
ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.