bcmp.S revision 1.4 1 /* $NetBSD: bcmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $ */
2
3 /*-
4 * Copyright (c) 1997 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by J.T. Conklin.
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 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /*-
33 * Copyright (c) 1990 The Regents of the University of California.
34 * All rights reserved.
35 *
36 * This code is derived from software contributed to Berkeley by
37 * the Systems Programming Group of the University of Utah Computer
38 * Science Department.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 * notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 * notice, this list of conditions and the following disclaimer in the
47 * documentation and/or other materials provided with the distribution.
48 * 3. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 */
64
65 #include <machine/asm.h>
66
67 #if defined(LIBC_SCCS) && !defined(lint)
68 #if 0
69 RCSID("from: @(#)bcmp.s 5.1 (Berkeley) 5/12/90")
70 #else
71 RCSID("$NetBSD: bcmp.S,v 1.4 2013/07/16 23:24:19 matt Exp $")
72 #endif
73 #endif /* LIBC_SCCS and not lint */
74
75 ENTRY(bcmp)
76 movl 4(%sp),%a0 | string 1
77 movl 8(%sp),%a1 | string 2
78 movl 12(%sp),%d1 | length
79
80 /*
81 * It isn't worth the overhead of aligning to {long}word boundries
82 * if the string is too short.
83 */
84 cmpl #8,%d1
85 jlt Lbcbyte
86
87 #ifdef __mc68010__
88 /*
89 * The 68010 cannot access a word or long on an odd boundary,
90 * period. If the source and the destination addresses aren't
91 * of the same evenness, we're forced to do a bytewise compare.
92 */
93 movl %a0,%d0
94 addl %a1,%d0
95 btst #0,%d0
96 jne Lbcbyte
97 #endif /* __mc68010__ */
98
99 /* word align */
100 movl %a0,%d0
101 btst #0,%d0
102 jeq Lbcalgndw
103 cmpmb (%a0)+,(%a1)+
104 jne Lbcnoteq
105 subql #1,%d1
106 Lbcalgndw:
107 /* long word align */
108 btst #1,%d0
109 jeq Lbcalgndl
110 cmpmw (%a0)+,(%a1)+
111 jne Lbcnoteq
112 subql #2,%d1
113 Lbcalgndl:
114 /* compare by 8 longwords */
115 movl %d1,%d0
116 lsrl #5,%d0 | cnt = len / 32
117 jeq Lbclong | if (cnt)
118 andl #31,%d1 | len %= 32
119 subql #1,%d0 | set up for dbf
120 Lbc32loop:
121 cmpml (%a0)+,(%a1)+ | compare 8 longwords
122 jne Lbcnoteq | not equal, return non-zero
123 cmpml (%a0)+,(%a1)+
124 jne Lbcnoteq
125 cmpml (%a0)+,(%a1)+
126 jne Lbcnoteq
127 cmpml (%a0)+,(%a1)+
128 jne Lbcnoteq
129 cmpml (%a0)+,(%a1)+
130 jne Lbcnoteq
131 cmpml (%a0)+,(%a1)+
132 jne Lbcnoteq
133 cmpml (%a0)+,(%a1)+
134 jne Lbcnoteq
135 cmpml (%a0)+,(%a1)+
136 jne Lbcnoteq
137 dbf %d0,Lbc32loop | till done
138 clrw %d0
139 subql #1,%d0
140 jcc Lbc32loop
141
142 Lbclong:
143 /* compare by longwords */
144 movl %d1,%d0
145 lsrl #2,%d0 | cnt = len / 4
146 jeq Lbcbyte | if (cnt)
147 subql #1,%d0 | set up for dbf
148 Lbclloop:
149 cmpml (%a0)+,(%a1)+ | compare a longword
150 jne Lbcnoteq | not equal, return non-zero
151 dbf %d0,Lbclloop | till done
152 andl #3,%d1 | len %= 4
153 jeq Lbcdone
154
155 subql #1,%d1 | set up for dbf
156 Lbcbloop:
157 cmpmb (%a0)+,(%a1)+ | compare a byte
158 jne Lbcnoteq | not equal, return non-zero
159 Lbcbyte:
160 dbf %d1,Lbcbloop
161 Lbcdone:
162 movql #0,%d0
163 rts
164
165 Lbcnoteq:
166 movql #1,%d0
167 rts
168 END(bcmp)
169