Fix mdoc(7)/man(7) mix up.
[netbsd-mini2440.git] / lib / libc / arch / m68k / string / memccpy.S
blobc0035e75ee8c6c91e91723490f29b63d2e80e4f2
1 /*      $NetBSD: memccpy.S,v 1.10 1999/10/25 23:48:16 thorpej Exp $     */
3 /*
4  * Copyright (C) 1999 Scott Reynolds.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
29 #include <machine/asm.h>
31 #if defined(LIBC_SCCS) && !defined(lint)
32         RCSID("$NetBSD: memccpy.S,v 1.10 1999/10/25 23:48:16 thorpej Exp $")
33 #endif /* LIBC_SCCS and not lint */
35 ENTRY(memccpy)
36         movl    %sp@(16),%d0            | count
37         jeq     Lmcbail                 | nothing to do
39         movl    %sp@(4),%a0             | a0 = toaddr
40         subql   #1,%d0                  |   prepare count for DBcc loop
41         movl    %sp@(8),%a1             | a1 = fromaddr
42         movl    %sp@(12),%d1            | d1 = terminator
43         jeq     Lmcloop                 |   handle ASCII NUL specially
45         movl    %d2,%sp@-               | save scratch register
46 Lmcnzloop:
47         movb    %a1@+,%d2               | move a byte
48         movb    %d2,%a0@+
49         cmpb    %d2,%d1                 | found the terminator?
50         dbeq    %d0,Lmcnzloop           | if not, keep transferring,
51         jeq     Lmcnzdone               |   otherwise done
52         clrw    %d0                     | check to see if more to do
53         subql   #1,%d0
54         jcc     Lmcnzloop               | yes, keep going...
56         movl    %sp@+,%d2               | restore scratch register
57         movql   #0,%d0                  | no terminator found, return NULL
58 #ifdef __SVR4_ABI__
59         movl    %d0,%a0                 | XXX maybe use lea to avoid stall?
60 #endif
61         rts
63 Lmcloop:
64         movb    %a1@+,%a0@+             | move a byte; was it NUL?
65         dbeq    %d0,Lmcloop             | if not, keep transferring,
66         jeq     Lmcdone                 |   otherwise done
67         clrw    %d0                     | check to see if more to do
68         subql   #1,%d0
69         jcc     Lmcloop                 | yes, keep going...
70                                         | Note: %d0 is now -1!
71         movql   #0,%d0                  | no terminator found, return NULL
72 Lmcbail:
73 #ifdef __SVR4_ABI__
74         movl    %d0,%a0                 | XXX maybe use lea to avoid stall?
75 #endif
76         rts
78 Lmcnzdone:
79         movl    %sp@+,%d2               | restore scratch register
80 Lmcdone:
81         movl    %a0,%d0
82         rts