xref: /netbsd-src/lib/libc/arch/mips/string/bcmp.S (revision 81b108b45f75f89f1e3ffad9fb6f074e771c0935)
1/*	$NetBSD: bcmp.S,v 1.4 1996/09/16 18:11:17 jonathan Exp $	*/
2
3/*-
4 * Copyright (c) 1991, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Ralph Campbell.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 *    must display the following acknowledgement:
20 *	This product includes software developed by the University of
21 *	California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 *    may be used to endorse or promote products derived from this software
24 *    without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39#include <machine/machAsmDefs.h>
40
41#if defined(LIBC_SCCS) && !defined(lint)
42	ASMSTR("from: @(#)bcmp.s	8.1 (Berkeley) 6/4/93")
43	ASMSTR("$NetBSD: bcmp.S,v 1.4 1996/09/16 18:11:17 jonathan Exp $")
44#endif /* LIBC_SCCS and not lint */
45
46/* bcmp(s1, s2, n) */
47
48#ifdef MIPSEL
49#	define	LWHI	lwr
50#	define	LWLO	lwl
51#	define	SWHI	swr
52#	define	SWLO	swl
53#endif
54#ifdef MIPSEB
55#	define	LWHI	lwl
56#	define	LWLO	lwr
57#	define	SWHI	swl
58#	define	SWLO	swr
59#endif
60
61LEAF(bcmp)
62	.set	noreorder
63	blt	a2, 16, small		# is it worth any trouble?
64	xor	v0, a0, a1		# compare low two bits of addresses
65	and	v0, v0, 3
66	subu	a3, zero, a1		# compute # bytes to word align address
67	bne	v0, zero, unaligned	# not possible to align addresses
68	and	a3, a3, 3
69
70	beq	a3, zero, 1f
71	subu	a2, a2, a3		# subtract from remaining count
72	move	v0, v1			# init v0,v1 so unmodified bytes match
73	LWHI	v0, 0(a0)		# read 1, 2, or 3 bytes
74	LWHI	v1, 0(a1)
75	addu	a1, a1, a3
76	bne	v0, v1, nomatch
77	addu	a0, a0, a3
781:
79	and	a3, a2, ~3		# compute number of whole words left
80	subu	a2, a2, a3		#   which has to be >= (16-3) & ~3
81	addu	a3, a3, a0		# compute ending address
822:
83	lw	v0, 0(a0)		# compare words
84	lw	v1, 0(a1)
85	addu	a0, a0, 4
86	bne	v0, v1, nomatch
87	addu	a1, a1, 4
88	bne	a0, a3, 2b
89	nop
90	b	small			# finish remainder
91	nop
92unaligned:
93	beq	a3, zero, 2f
94	subu	a2, a2, a3		# subtract from remaining count
95	addu	a3, a3, a0		# compute ending address
961:
97	lbu	v0, 0(a0)		# compare bytes until a1 word aligned
98	lbu	v1, 0(a1)
99	addu	a0, a0, 1
100	bne	v0, v1, nomatch
101	addu	a1, a1, 1
102	bne	a0, a3, 1b
103	nop
1042:
105	and	a3, a2, ~3		# compute number of whole words left
106	subu	a2, a2, a3		#   which has to be >= (16-3) & ~3
107	addu	a3, a3, a0		# compute ending address
1083:
109	LWHI	v0, 0(a0)		# compare words a0 unaligned, a1 aligned
110	LWLO	v0, 3(a0)
111	lw	v1, 0(a1)
112	addu	a0, a0, 4
113	bne	v0, v1, nomatch
114	addu	a1, a1, 4
115	bne	a0, a3, 3b
116	nop
117small:
118	ble	a2, zero, match
119	addu	a3, a2, a0		# compute ending address
1201:
121	lbu	v0, 0(a0)
122	lbu	v1, 0(a1)
123	addu	a0, a0, 1
124	bne	v0, v1, nomatch
125	addu	a1, a1, 1
126	bne	a0, a3, 1b
127	nop
128match:
129	j	ra
130	move	v0, zero
131nomatch:
132	j	ra
133	li	v0, 1
134	.set	reorder
135END(bcmp)
136