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