summaryrefslogtreecommitdiffstats
path: root/lib/libc/mips/string/bcmp.S
diff options
context:
space:
mode:
authorjchandra <jchandra@FreeBSD.org>2010-06-16 12:55:14 +0000
committerjchandra <jchandra@FreeBSD.org>2010-06-16 12:55:14 +0000
commitfa919cddc1801bfb0624d56f3a24c4a57fdc911f (patch)
treed284347736f86f7dd0b741263f711a8858174bbc /lib/libc/mips/string/bcmp.S
parent9a2679124843ce869c9271e1d4a16d8c41c7ee1c (diff)
downloadFreeBSD-src-fa919cddc1801bfb0624d56f3a24c4a57fdc911f.zip
FreeBSD-src-fa919cddc1801bfb0624d56f3a24c4a57fdc911f.tar.gz
Merge jmallett@'s n64 work into HEAD - changeset 1.
Update libc assembly code to use macros that work on both o32 and n64. Merge string functions from NetBSD. The changes are from http://svn.freebsd.org/base/user/jmallett/octeon Approved by: rrs (mentor), jmallett
Diffstat (limited to 'lib/libc/mips/string/bcmp.S')
-rw-r--r--lib/libc/mips/string/bcmp.S130
1 files changed, 63 insertions, 67 deletions
diff --git a/lib/libc/mips/string/bcmp.S b/lib/libc/mips/string/bcmp.S
index 7b7fa68..ffcaeeb 100644
--- a/lib/libc/mips/string/bcmp.S
+++ b/lib/libc/mips/string/bcmp.S
@@ -1,4 +1,4 @@
-/* $NetBSD: bcmp.S,v 1.8 2003/08/07 16:42:16 agc Exp $ */
+/* $NetBSD: bcmp.S,v 1.9 2009/12/14 01:07:42 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -35,9 +35,15 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
+#define _LOCORE /* XXX not really, just assembly-code source */
+#include <machine/endian.h> /* LWLO/LWHI, SWLO/SWHI */
+
#if defined(LIBC_SCCS) && !defined(lint)
+#if 0
ASMSTR("from: @(#)bcmp.s 8.1 (Berkeley) 6/4/93")
- ASMSTR("$NetBSD: bcmp.S,v 1.8 2003/08/07 16:42:16 agc Exp $")
+#else
+ ASMSTR("$NetBSD: bcmp.S,v 1.9 2009/12/14 01:07:42 matt Exp $")
+#endif
#endif /* LIBC_SCCS and not lint */
#ifdef __ABICALLS__
@@ -49,86 +55,76 @@ __FBSDID("$FreeBSD$");
LEAF(bcmp)
.set noreorder
- blt a2, 16, small # is it worth any trouble?
- xor v0, a0, a1 # compare low two bits of addresses
- and v0, v0, 3
- subu a3, zero, a1 # compute # bytes to word align address
- bne v0, zero, unaligned # not possible to align addresses
- and a3, a3, 3
+ blt a2, 16, small # is it worth any trouble?
+ xor v0, a0, a1 # compare low two bits of addresses
+ and v0, v0, 3
+ PTR_SUBU a3, zero, a1 # compute # bytes to word align address
+ bne v0, zero, unaligned # not possible to align addresses
+ and a3, a3, 3
- beq a3, zero, 1f
- subu a2, a2, a3 # subtract from remaining count
- move v0, v1 # init v0,v1 so unmodified bytes match
-#ifdef __MIPSEB__
- lwl v0, 0(a0) # read 1, 2, or 3 bytes
- lwl v1, 0(a1)
-#else
- lwr v0, 0(a0) # read 1, 2, or 3 bytes
- lwr v1, 0(a1)
-#endif
- addu a1, a1, a3
- bne v0, v1, nomatch
- addu a0, a0, a3
+ beq a3, zero, 1f
+ PTR_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
+ LWHI v1, 0(a1)
+ PTR_ADDU a1, a1, a3
+ bne v0, v1, nomatch
+ PTR_ADDU a0, a0, a3
1:
- 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
+ and a3, a2, ~3 # compute number of whole words left
+ PTR_SUBU a2, a2, a3 # which has to be >= (16-3) & ~3
+ PTR_ADDU a3, a3, a0 # compute ending address
2:
- lw v0, 0(a0) # compare words
- lw v1, 0(a1)
- addu a0, a0, 4
- bne v0, v1, nomatch
- addu a1, a1, 4
- bne a0, a3, 2b
+ lw v0, 0(a0) # compare words
+ lw v1, 0(a1)
+ PTR_ADDU a0, a0, 4
+ bne v0, v1, nomatch
+ PTR_ADDU a1, a1, 4
+ bne a0, a3, 2b
nop
- b small # finish remainder
+ b small # finish remainder
nop
unaligned:
- beq a3, zero, 2f
- subu a2, a2, a3 # subtract from remaining count
- addu a3, a3, a0 # compute ending address
+ beq a3, zero, 2f
+ PTR_SUBU a2, a2, a3 # subtract from remaining count
+ PTR_ADDU a3, a3, a0 # compute ending address
1:
- lbu v0, 0(a0) # compare bytes until a1 word aligned
- lbu v1, 0(a1)
- addu a0, a0, 1
- bne v0, v1, nomatch
- addu a1, a1, 1
- bne a0, a3, 1b
+ lbu v0, 0(a0) # compare bytes until a1 word aligned
+ lbu v1, 0(a1)
+ PTR_ADDU a0, a0, 1
+ bne v0, v1, nomatch
+ PTR_ADDU a1, a1, 1
+ bne a0, a3, 1b
nop
2:
- 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
+ and a3, a2, ~3 # compute number of whole words left
+ PTR_SUBU a2, a2, a3 # which has to be >= (16-3) & ~3
+ PTR_ADDU a3, a3, a0 # compute ending address
3:
-#ifdef __MIPSEB__
- lwl v0, 0(a0) # compare words a0 unaligned, a1 aligned
- lwr v0, 3(a0)
-#else
- lwr v0, 0(a0) # compare words a0 unaligned, a1 aligned
- lwl v0, 3(a0)
-#endif
- lw v1, 0(a1)
- addu a0, a0, 4
- bne v0, v1, nomatch
- addu a1, a1, 4
- bne a0, a3, 3b
+ LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned
+ LWLO v0, 3(a0)
+ lw v1, 0(a1)
+ PTR_ADDU a0, a0, 4
+ bne v0, v1, nomatch
+ PTR_ADDU a1, a1, 4
+ bne a0, a3, 3b
nop
small:
- ble a2, zero, match
- addu a3, a2, a0 # compute ending address
+ ble a2, zero, match
+ PTR_ADDU a3, a2, a0 # compute ending address
1:
- lbu v0, 0(a0)
- lbu v1, 0(a1)
- addu a0, a0, 1
- bne v0, v1, nomatch
- addu a1, a1, 1
- bne a0, a3, 1b
+ lbu v0, 0(a0)
+ lbu v1, 0(a1)
+ PTR_ADDU a0, a0, 1
+ bne v0, v1, nomatch
+ PTR_ADDU a1, a1, 1
+ bne a0, a3, 1b
nop
match:
- j ra
- move v0, zero
+ j ra
+ move v0, zero
nomatch:
- j ra
- li v0, 1
+ j ra
+ li v0, 1
.set reorder
END(bcmp)
OpenPOWER on IntegriCloud