bzero.S revision 1.4 1 1.4 skrll /* $NetBSD: bzero.S,v 1.4 2020/05/05 06:20:55 skrll Exp $ */
2 1.1 fredette
3 1.1 fredette /* $OpenBSD: bzero.S,v 1.3 2001/06/04 23:14:02 mickey Exp $ */
4 1.1 fredette
5 1.1 fredette /*
6 1.1 fredette * (c) Copyright 1988 HEWLETT-PACKARD COMPANY
7 1.1 fredette *
8 1.1 fredette * To anyone who acknowledges that this file is provided "AS IS"
9 1.1 fredette * without any express or implied warranty:
10 1.1 fredette * permission to use, copy, modify, and distribute this file
11 1.1 fredette * for any purpose is hereby granted without fee, provided that
12 1.1 fredette * the above copyright notice and this notice appears in all
13 1.1 fredette * copies, and that the name of Hewlett-Packard Company not be
14 1.1 fredette * used in advertising or publicity pertaining to distribution
15 1.1 fredette * of the software without specific, written prior permission.
16 1.1 fredette * Hewlett-Packard Company makes no representations about the
17 1.1 fredette * suitability of this software for any purpose.
18 1.1 fredette */
19 1.1 fredette /*
20 1.1 fredette * Copyright (c) 1990,1994 The University of Utah and
21 1.1 fredette * the Computer Systems Laboratory (CSL). All rights reserved.
22 1.1 fredette *
23 1.1 fredette * THE UNIVERSITY OF UTAH AND CSL PROVIDE THIS SOFTWARE IN ITS "AS IS"
24 1.1 fredette * CONDITION, AND DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
25 1.1 fredette * WHATSOEVER RESULTING FROM ITS USE.
26 1.1 fredette *
27 1.1 fredette * CSL requests users of this software to return to csl-dist (at) cs.utah.edu any
28 1.1 fredette * improvements that they make and grant CSL redistribution rights.
29 1.1 fredette *
30 1.1 fredette * Utah $Hdr: bzero.s 1.9 94/12/14$
31 1.1 fredette * Author: Bob Wheeler, University of Utah CSL
32 1.1 fredette */
33 1.1 fredette
34 1.1 fredette #include <machine/asm.h>
35 1.1 fredette
36 1.1 fredette #ifdef SYSLIBC_SCCS
37 1.1 fredette .text
38 1.1 fredette .asciz "$OpenBSD: bzero.S,v 1.3 2001/06/04 23:14:02 mickey Exp $"
39 1.1 fredette .align 4
40 1.1 fredette #endif
41 1.1 fredette
42 1.1 fredette /*
43 1.3 skrll * void
44 1.1 fredette * bzero(dst, count)
45 1.2 matt * void *dst;
46 1.2 matt * size_t count;
47 1.1 fredette */
48 1.1 fredette LEAF_ENTRY(bzero)
49 1.2 matt comb,>=,n %r0,%arg1,$bzero_exit
50 1.1 fredette
51 1.1 fredette /*
52 1.1 fredette * If we need to clear less than a word do it a byte at a time
53 1.1 fredette */
54 1.1 fredette
55 1.2 matt comib,>>,n 4,%arg1,$bzero_bytes
56 1.1 fredette
57 1.1 fredette /*
58 1.3 skrll * Since we are only clearing memory the alignment restrictions
59 1.1 fredette * are simplified. Figure out how many "extra" bytes we need to
60 1.1 fredette * store with stbys.
61 1.1 fredette */
62 1.1 fredette
63 1.2 matt extru %arg0,31,2,%t1
64 1.2 matt add %arg1,%t1,%arg1
65 1.1 fredette
66 1.1 fredette /*
67 1.3 skrll * We will zero the destination in blocks of 16 bytes as long as we
68 1.1 fredette * can and then we'll go to the 4 byte moves.
69 1.1 fredette */
70 1.1 fredette
71 1.1 fredette comib,>>= 15, %arg1, $bzero_word
72 1.1 fredette addi -16, %arg1, %arg1
73 1.1 fredette
74 1.2 matt $bzero_loop_16:
75 1.2 matt stbys,b,m %r0,4(%arg0)
76 1.2 matt stwm %r0,4(%arg0)
77 1.2 matt stwm %r0,4(%arg0)
78 1.2 matt stwm %r0,4(%arg0)
79 1.1 fredette comib,<< 15, %arg1, $bzero_loop_16
80 1.4 skrll addi -16, %arg1, %arg1
81 1.1 fredette
82 1.1 fredette /*
83 1.3 skrll * see if there is anything left that needs to be zeroed in a word
84 1.3 skrll * move. Since the count was decremented by 16, add 12 to test if
85 1.1 fredette * there are any full word moves left to do.
86 1.1 fredette */
87 1.1 fredette
88 1.2 matt $bzero_word:
89 1.2 matt addib,<,n 12,%arg1,$bzero_cleanup
90 1.1 fredette
91 1.2 matt $bzero_loop_4:
92 1.2 matt addib,>= -4,%arg1,$bzero_loop_4
93 1.4 skrll stbys,b,m %r0,4(%arg0)
94 1.1 fredette
95 1.1 fredette /*
96 1.1 fredette * zero the last bytes that may be unaligned on a word boundary
97 1.1 fredette */
98 1.1 fredette
99 1.2 matt $bzero_cleanup:
100 1.2 matt addib,=,n 4,%arg1,$bzero_exit
101 1.2 matt add %arg0,%arg1,%arg0
102 1.1 fredette b $bzero_exit
103 1.4 skrll stbys,e %r0,0(%arg0)
104 1.1 fredette b,n $bzero_exit
105 1.1 fredette
106 1.1 fredette
107 1.1 fredette /*
108 1.1 fredette * zero by bytes
109 1.1 fredette */
110 1.1 fredette
111 1.2 matt $bzero_bytes:
112 1.2 matt addib,> -1,%arg1,$bzero_bytes
113 1.4 skrll stbs,ma %r0,1(%arg0)
114 1.1 fredette
115 1.2 matt $bzero_exit:
116 1.1 fredette bv,n %r0(%rp)
117 1.1 fredette EXIT(bzero)
118 1.1 fredette
119 1.1 fredette .end
120