version 1.8, 2003/08/07 16:42:16 |
version 1.9, 2009/12/14 01:07:42 |
|
|
#include <machine/endian.h> /* LWLO/LWHI, SWLO/SWHI */ |
#include <machine/endian.h> /* LWLO/LWHI, SWLO/SWHI */ |
|
|
#if defined(LIBC_SCCS) && !defined(lint) |
#if defined(LIBC_SCCS) && !defined(lint) |
ASMSTR("from: @(#)bcmp.s 8.1 (Berkeley) 6/4/93") |
#if 0 |
ASMSTR("$NetBSD$") |
RCSID("from: @(#)bcmp.s 8.1 (Berkeley) 6/4/93") |
#endif /* LIBC_SCCS and not lint */ |
#else |
|
RCSID("$NetBSD$") |
#ifdef __ABICALLS__ |
|
.abicalls |
|
#endif |
#endif |
|
#endif /* LIBC_SCCS and not lint */ |
|
|
/* bcmp(s1, s2, n) */ |
/* bcmp(s1, s2, n) */ |
|
|
|
|
LEAF(bcmp) |
LEAF(bcmp) |
.set noreorder |
.set noreorder |
blt a2, 16, small # is it worth any trouble? |
blt a2, 16, small # is it worth any trouble? |
xor v0, a0, a1 # compare low two bits of addresses |
xor v0, a0, a1 # compare low two bits of addresses |
and v0, v0, 3 |
and v0, v0, 3 |
subu a3, zero, a1 # compute # bytes to word align address |
PTR_SUBU a3, zero, a1 # compute # bytes to word align address |
bne v0, zero, unaligned # not possible to align addresses |
bne v0, zero, unaligned # not possible to align addresses |
and a3, a3, 3 |
and a3, a3, 3 |
|
|
beq a3, zero, 1f |
beq a3, zero, 1f |
subu a2, a2, a3 # subtract from remaining count |
PTR_SUBU a2, a2, a3 # subtract from remaining count |
move v0, v1 # init v0,v1 so unmodified bytes match |
move v0, v1 # init v0,v1 so unmodified bytes match |
LWHI v0, 0(a0) # read 1, 2, or 3 bytes |
LWHI v0, 0(a0) # read 1, 2, or 3 bytes |
LWHI v1, 0(a1) |
LWHI v1, 0(a1) |
addu a1, a1, a3 |
PTR_ADDU a1, a1, a3 |
bne v0, v1, nomatch |
bne v0, v1, nomatch |
addu a0, a0, a3 |
PTR_ADDU a0, a0, a3 |
1: |
1: |
and a3, a2, ~3 # compute number of whole words left |
and a3, a2, ~3 # compute number of whole words left |
subu a2, a2, a3 # which has to be >= (16-3) & ~3 |
PTR_SUBU a2, a2, a3 # which has to be >= (16-3) & ~3 |
addu a3, a3, a0 # compute ending address |
PTR_ADDU a3, a3, a0 # compute ending address |
2: |
2: |
lw v0, 0(a0) # compare words |
lw v0, 0(a0) # compare words |
lw v1, 0(a1) |
lw v1, 0(a1) |
addu a0, a0, 4 |
PTR_ADDU a0, a0, 4 |
bne v0, v1, nomatch |
bne v0, v1, nomatch |
addu a1, a1, 4 |
PTR_ADDU a1, a1, 4 |
bne a0, a3, 2b |
bne a0, a3, 2b |
nop |
nop |
b small # finish remainder |
b small # finish remainder |
nop |
nop |
unaligned: |
unaligned: |
beq a3, zero, 2f |
beq a3, zero, 2f |
subu a2, a2, a3 # subtract from remaining count |
PTR_SUBU a2, a2, a3 # subtract from remaining count |
addu a3, a3, a0 # compute ending address |
PTR_ADDU a3, a3, a0 # compute ending address |
1: |
1: |
lbu v0, 0(a0) # compare bytes until a1 word aligned |
lbu v0, 0(a0) # compare bytes until a1 word aligned |
lbu v1, 0(a1) |
lbu v1, 0(a1) |
addu a0, a0, 1 |
PTR_ADDU a0, a0, 1 |
bne v0, v1, nomatch |
bne v0, v1, nomatch |
addu a1, a1, 1 |
PTR_ADDU a1, a1, 1 |
bne a0, a3, 1b |
bne a0, a3, 1b |
nop |
nop |
2: |
2: |
and a3, a2, ~3 # compute number of whole words left |
and a3, a2, ~3 # compute number of whole words left |
subu a2, a2, a3 # which has to be >= (16-3) & ~3 |
PTR_SUBU a2, a2, a3 # which has to be >= (16-3) & ~3 |
addu a3, a3, a0 # compute ending address |
PTR_ADDU a3, a3, a0 # compute ending address |
3: |
3: |
LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned |
LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned |
LWLO v0, 3(a0) |
LWLO v0, 3(a0) |
lw v1, 0(a1) |
lw v1, 0(a1) |
addu a0, a0, 4 |
PTR_ADDU a0, a0, 4 |
bne v0, v1, nomatch |
bne v0, v1, nomatch |
addu a1, a1, 4 |
PTR_ADDU a1, a1, 4 |
bne a0, a3, 3b |
bne a0, a3, 3b |
nop |
nop |
small: |
small: |
ble a2, zero, match |
ble a2, zero, match |
addu a3, a2, a0 # compute ending address |
PTR_ADDU a3, a2, a0 # compute ending address |
1: |
1: |
lbu v0, 0(a0) |
lbu v0, 0(a0) |
lbu v1, 0(a1) |
lbu v1, 0(a1) |
addu a0, a0, 1 |
PTR_ADDU a0, a0, 1 |
bne v0, v1, nomatch |
bne v0, v1, nomatch |
addu a1, a1, 1 |
PTR_ADDU a1, a1, 1 |
bne a0, a3, 1b |
bne a0, a3, 1b |
nop |
nop |
match: |
match: |
j ra |
j ra |
move v0, zero |
move v0, zero |
nomatch: |
nomatch: |
j ra |
j ra |
li v0, 1 |
li v0, 1 |
.set reorder |
.set reorder |
END(bcmp) |
END(bcmp) |