Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site eneevax.UUCP Path: utzoo!watmath!clyde!burl!mgnetp!ihnp4!zehntel!hplabs!hao!seismo!umcp-cs!eneevax!chris From: chris@eneevax.UUCP (Chris Torek) Newsgroups: net.sources Subject: bcopy, bcmp, bzero for 4.1BSD Message-ID: <153@eneevax.UUCP> Date: Sat, 18-Aug-84 04:31:41 EDT Article-I.D.: eneevax.153 Posted: Sat Aug 18 04:31:41 1984 Date-Received: Mon, 20-Aug-84 01:39:49 EDT Organization: Univ. of Maryland, EE Dept. Lines: 156 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@maryland.ARPA, chris@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