Drop main() prototype. Syncs with NetBSD-8
[minix.git] / common / lib / libc / arch / m68k / string / bcmp.S
blob081a551cbd4cd84a92453bfc41f2b7f224a0a133
1 /*      $NetBSD: bcmp.S,v 1.6 2013/09/07 19:06:29 chs Exp $     */
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  */
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  */
65 #include <machine/asm.h>
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.6 2013/09/07 19:06:29 chs Exp $")
72 #endif
73 #endif /* LIBC_SCCS and not lint */
75 #ifdef __mcoldfire__
76 #define CMPMB(a,b)      movb b,%d2; cmpb a,%d2
77 #define CMPMW(a,b)      movw b,%d2; cmpw a,%d2
78 #define CMPML(a,b)      movl b,%d2; cmpl a,%d2
79 #else
80 #define CMPMB(a,b)      cmpmb a,b
81 #define CMPMW(a,b)      cmpmw a,b
82 #define CMPML(a,b)      cmpml a,b
83 #endif
85 ENTRY(bcmp)
86         movl    4(%sp),%a0              | string 1
87         movl    8(%sp),%a1              | string 2
88         movl    12(%sp),%d1             | length
89 #ifdef __mcoldfire__
90         movl    %d2,-(%sp)              | save temp
91 #endif
93         /*
94          * It isn't worth the overhead of aligning to {long}word boundries
95          * if the string is too short.
96          */
97         cmpl    #8,%d1
98         jlt     .Lbcbyte                        
100 #ifdef  __mc68010__
101         /*
102          * The 68010 cannot access a word or long on an odd boundary,
103          * period.  If the source and the destination addresses aren't
104          * of the same evenness, we're forced to do a bytewise compare.
105          */
106         movl    %a0,%d0
107         addl    %a1,%d0
108         btst    #0,%d0
109         jne     .Lbcbyte
110 #endif  /* __mc68010__ */
111         
112         /* word align */
113         movl    %a0,%d0
114         btst    #0,%d0
115         jeq     .Lbcalgndw
116         CMPMB((%a0)+,(%a1)+)
117         jne     .Lbcnoteq
118         subql   #1,%d1
119 .Lbcalgndw:
120         /* long word align */
121         btst    #1,%d0
122         jeq     .Lbcalgndl
123         CMPMW((%a0)+,(%a1)+)
124         jne     .Lbcnoteq
125         subql   #2,%d1
126 .Lbcalgndl:
127         /* compare by 8 longwords */
128         movl    %d1,%d0
129         lsrl    #5,%d0                  | cnt = len / 32
130         jeq     .Lbclong                        | if (cnt)
131         andl    #31,%d1                 |       len %= 32
132         subql   #1,%d0                  |       set up for dbf
133 .Lbc32loop:
134         CMPML((%a0)+,(%a1)+)            |       compare 1 of 8 longwords
135         jne     .Lbcnoteq               |       not equal, return non-zero
136         CMPML((%a0)+,(%a1)+)            |       compare 2 of 8 longwords
137         jne     .Lbcnoteq
138         CMPML((%a0)+,(%a1)+)            |       compare 3 of 8 longwords
139         jne     .Lbcnoteq
140         CMPML((%a0)+,(%a1)+)            |       compare 4 of 8 longwords
141         jne     .Lbcnoteq
142         CMPML((%a0)+,(%a1)+)            |       compare 5 of 8 longwords
143         jne     .Lbcnoteq
144         CMPML((%a0)+,(%a1)+)            |       compare 6 of 8 longwords
145         jne     .Lbcnoteq
146         CMPML((%a0)+,(%a1)+)            |       compare 7 of 8 longwords
147         jne     .Lbcnoteq
148         CMPML((%a0)+,(%a1)+)            |       compare 8 of 8 longwords
149         jne     .Lbcnoteq
150 #ifndef __mcoldfire__
151         dbf     %d0,.Lbc32loop          |       till done
152         clrw    %d0
153 #endif
154         subql   #1,%d0
155         jcc     .Lbc32loop
157 .Lbclong:
158         /* compare by longwords */
159         movl    %d1,%d0
160         lsrl    #2,%d0                  | cnt = len / 4
161         jeq     .Lbcbyte                        | if (cnt)
162         subql   #1,%d0                  |       set up for dbf
163 .Lbclloop:
164         CMPML((%a0)+,(%a1)+)            |       compare a longword
165         jne     .Lbcnoteq               |       not equal, return non-zero
166 #ifdef __mcoldfire__
167         subql   #1,%d0                  |       decrement
168         jcc     .Lbclloop               |       till done
169 #else
170         dbf     %d0,.Lbclloop           |       till done
171 #endif
172         andl    #3,%d1                  |       len %= 4
173         jeq     .Lbcdone 
175         subql   #1,%d1                  | set up for dbf
176 .Lbcbloop:
177         CMPMB((%a0)+,(%a1)+)            | compare a byte
178         jne     .Lbcnoteq               | not equal, return non-zero
179 .Lbcbyte:
180 #ifdef __mcoldfire__
181         subql   #1,%d0                  |       decrement
182         jcc     .Lbcbloop               |       till done
183 #else
184         dbf     %d1,.Lbcbloop
185 #endif
186 .Lbcdone:
187 #ifdef __mcoldfire__
188         movl    (%sp)+,%d2              | restore temp
189 #endif
190         movql   #0,%d0
191         rts
193 .Lbcnoteq:
194         movql   #1,%d0
195         rts
196 END(bcmp)