* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* %sccs.include.redist.c%
#include <machine/machAsmDefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
ASMSTR("@(#)bcmp.s 8.1 (Berkeley) %G%")
#endif /* LIBC_SCCS and not lint */
blt a2, 16, small # is it worth any trouble?
xor v0, a0, a1 # compare low two bits of addresses
subu a3, zero, a1 # compute # bytes to word align address
bne v0, zero, unaligned # not possible to align addresses
subu a2, a2, a3 # subtract from remaining count
move v0, v1 # init v0,v1 so unmodified bytes match
LWHI v0, 0(a0) # read 1, 2, or 3 bytes
and a3, a2, ~3 # compute number of whole words left
subu a2, a2, a3 # which has to be >= (16-3) & ~3
addu a3, a3, a0 # compute ending address
lw v0, 0(a0) # compare words
b small # finish remainder
subu a2, a2, a3 # subtract from remaining count
addu a3, a3, a0 # compute ending address
lbu v0, 0(a0) # compare bytes until a1 word aligned
and a3, a2, ~3 # compute number of whole words left
subu a2, a2, a3 # which has to be >= (16-3) & ~3
addu a3, a3, a0 # compute ending address
LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned
addu a3, a2, a0 # compute ending address