bcopy, bcmp, bzero for 4.1BSD
Chris Torek
chris at eneevax.UUCP
Sat Aug 18 18:31:41 AEST 1984
I've received (justified) complaints for not explaining bcmp(),
bcopy(), and bzero() in my mdbm source posting. This is one of those
4.2 dependencies I warned about. Anyway, here are implementations of
bcopy, bcmp, and bzero in Vax assembly and in C. WARNING: I haven't
tested the Vax assembly version of bcmp (nor any of the C routines but
who needs to test those?). Also, the assembly routines won't work
under VMS, which (I believe) needs r2-r11 saved; you'd have to change
the entry masks.
If you're running 4.2 you should already have these in your C library,
so in that case, ignore this posting. (Otherwise, why not rewrite
these for your particular machine and *install* it in your C library?)
--Chris Torek, U of MD CS/EE, seismo!umcp-cs!chris, chris at maryland.ARPA,
chris at umcp-cs.CSNet (I don't have my regular .signature installed on
this machine)
-------------------------------------------
: Run this shell script with "sh" not "csh"
PATH=:/bin:/usr/bin:/usr/ucb
export PATH
/bin/echo 'Extracting bcmp.c'
sed 's/^X//' <<'//go.sysin dd *' >bcmp.c
/*
* bcmp
*
* compare count bytes at s1 and s2; return 0 iff equal
*
* N.B.: Beware large counts (>32767) on machines with 16 bit `int's.
* (This routine should really be rewritten for those.)
*/
bcmp (s1, s2, count)
register char *s1, *s2;
register int count;
{
while (--count >= 0)
if (*s1++ != *s2++)
return 1; /* or ``return *--s1 - *--s2;'' */
return 0;
}
//go.sysin dd *
/bin/chmod 644 bcmp.c
/bin/echo -n ' '; /bin/ls -ld bcmp.c
/bin/echo 'Extracting bcmp.s'
sed 's/^X//' <<'//go.sysin dd *' >bcmp.s
# bcmp (s1, s2, count) char *s1, *s2; int count;
#
# Compare "count" bytes at "s1" with those at "s2"; return 0 iff equal
.align 2
.globl _bcopy
_bcopy:
.word 0
movl 4(ap),r1 # r1 = s1
movl 8(ap),r3 # r3 = s2
brb 2f
1:
subl2 r0,12(ap) # count-=65535 (bytes compared)
cmpc3 r0,(r1),(r3) # r1, r3 magically point to next 65K
bneq 3f
2:
movzwl $65535,r0
cmpl 12(ap),r0 # <= 65535 bytes to compare?
jgtr 1b # brif not, do 65535 and try again
cmpc3 12(ap),(r1),(r3) # compare up to 65535 bytes
3:
ret
//go.sysin dd *
/bin/chmod 644 bcmp.s
/bin/echo -n ' '; /bin/ls -ld bcmp.s
/bin/echo 'Extracting bcopy.c'
sed 's/^X//' <<'//go.sysin dd *' >bcopy.c
/*
* bcopy - copy count bytes from "from" to "to" - not guaranteed to work
* if "from" and "to" overlap
*
* N.B.: Beware large counts (>32767) on machines with 16 bit `int's.
* (This routine should really be rewritten for those.)
*/
bcopy (from, to, count)
register char *from, *to;
register int count;
{
while (--count >= 0)
*to++ = *from++;
}
//go.sysin dd *
/bin/chmod 644 bcopy.c
/bin/echo -n ' '; /bin/ls -ld bcopy.c
/bin/echo 'Extracting bcopy.s'
sed 's/^X//' <<'//go.sysin dd *' >bcopy.s
# bcopy (from, to, count) char *from, *to; int count;
#
# Copy "count" bytes from "from" to "to"; not guaranteed to
# work if "from" and "to" overlap.
.align 2
.globl _bcopy
_bcopy:
.word 0
movl 4(ap),r1 # r1 = from
movl 8(ap),r3 # r3 = to
brb 2f
1:
subl2 r0,12(ap) # count-=65535 (bytes moved this time)
movc3 r0,(r1),(r3) # r1, r3 magically point to next 65K
2:
movzwl $65535,r0
cmpl 12(ap),r0 # <= 65535 bytes to move?
jgtr 1b # brif not, move 65535 and try again
movc3 12(ap),(r1),(r3) # move up to 65535 bytes
ret
//go.sysin dd *
/bin/chmod 644 bcopy.s
/bin/echo -n ' '; /bin/ls -ld bcopy.s
/bin/echo 'Extracting bzero.c'
sed 's/^X//' <<'//go.sysin dd *' >bzero.c
/*
* bzero - zero count bytes at address addr
*
* N.B.: Beware large counts (>32767) on machines with 16 bit `int's.
* (This routine should really be rewritten for those.)
*/
bzero (addr, count)
register char *addr;
register int count;
{
while (--count >= 0)
*addr++ = 0;
}
//go.sysin dd *
/bin/chmod 644 bzero.c
/bin/echo -n ' '; /bin/ls -ld bzero.c
/bin/echo 'Extracting bzero.s'
sed 's/^X//' <<'//go.sysin dd *' >bzero.s
# bzero (addr, count) char *addr; int count;
#
# Zero "count" bytes at address "addr"
.align 2
.globl _bzero
_bzero:
.word 0
movl 4(ap),r3 # r3 = addr
brb 2f
1:
subl2 r0,8(ap) # count-=65535 (bytes zeroed this time)
movc5 $0,(sp),$0,r0,(r3) # r3 magically points to next 65K
2:
movzwl $65535,r0
cmpl 8(ap),r0 # <= 65535 bytes to zero?
jgtr 1b # brif not, zero 65535 and try again
movc5 $0,(sp),$0,8(ap),(r3) # zero up to 65535 bytes
ret
//go.sysin dd *
/bin/chmod 644 bzero.s
/bin/echo -n ' '; /bin/ls -ld bzero.s
More information about the Comp.sources.unix
mailing list