From 9abce105a2cba81344501b57ee9157ebe55f0651 Mon Sep 17 00:00:00 2001 From: Keith Bostic Date: Sat, 12 May 1990 23:16:10 -0800 Subject: [PATCH] date and time created 90/05/12 16:16:10 by bostic SCCS-vsn: lib/libc/hp300/string/bcmp.s 5.1 --- usr/src/lib/libc/hp300/string/bcmp.s | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 usr/src/lib/libc/hp300/string/bcmp.s diff --git a/usr/src/lib/libc/hp300/string/bcmp.s b/usr/src/lib/libc/hp300/string/bcmp.s new file mode 100644 index 0000000000..a398d06767 --- /dev/null +++ b/usr/src/lib/libc/hp300/string/bcmp.s @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department. + * + * %sccs.include.redist.c% + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)bcmp.s 5.1 (Berkeley) %G%" +#endif /* LIBC_SCCS and not lint */ + +/* bcmp(s1, s2, n) */ + +#include "DEFS.h" + +/* + * This is probably not the best we can do, but it is still 2-10 times + * faster than the C version in the portable gen directory. + * + * Things that might help: + * - longword align when possible (only on the 68020) + * - use nested DBcc instructions or use one and limit size to 64K + */ +ENTRY(bcmp) + movl sp@(4),a0 /* string 1 */ + movl sp@(8),a1 /* string 2 */ + movl sp@(12),d0 /* length */ + jeq bcdone /* if zero, nothing to do */ + movl a0,d1 + btst #0,d1 /* string 1 address odd? */ + jeq bceven /* no, skip alignment */ + cmpmb a0@+,a1@+ /* yes, compare a byte */ + jne bcnoteq /* not equal, return non-zero */ + subql #1,d0 /* adjust count */ + jeq bcdone /* count 0, reutrn zero */ +bceven: + movl a1,d1 + btst #0,d1 /* string 2 address odd? */ + jne bcbloop /* yes, no hope for alignment, compare bytes */ + movl d0,d1 /* no, both even */ + lsrl #2,d1 /* convert count to longword count */ + jeq bcbloop /* count 0, skip longword loop */ +bclloop: + cmpml a0@+,a1@+ /* compare a longword */ + jne bcnoteq /* not equal, return non-zero */ + subql #1,d1 /* adjust count */ + jne bclloop /* still more, keep comparing */ + andl #3,d0 /* what remains */ + jeq bcdone /* nothing, all done */ +bcbloop: + cmpmb a0@+,a1@+ /* compare a byte */ + jne bcnoteq /* not equal, return non-zero */ + subql #1,d0 /* adjust count */ + jne bcbloop /* still more, keep going */ + rts +bcnoteq: + moveq #1,d0 +bcdone: + rts -- 2.20.1