bzero.S revision 1.1 1 1.1 fredette /* $NetBSD: bzero.S,v 1.1 2002/06/06 20:31:22 fredette 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.1 fredette * void
44 1.1 fredette * bzero(dst, count)
45 1.1 fredette * vm_offset_t dst;
46 1.1 fredette * int count;
47 1.1 fredette */
48 1.1 fredette LEAF_ENTRY(bzero)
49 1.1 fredette 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.1 fredette comib,>>,n 4,arg1,$bzero_bytes
56 1.1 fredette
57 1.1 fredette /*
58 1.1 fredette * 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.1 fredette extru arg0,31,2,t2
64 1.1 fredette add arg1,t2,arg1
65 1.1 fredette
66 1.1 fredette /*
67 1.1 fredette * 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.1 fredette $bzero_loop_16
75 1.1 fredette stbys,b,m r0,4(arg0)
76 1.1 fredette stwm r0,4(arg0)
77 1.1 fredette stwm r0,4(arg0)
78 1.1 fredette stwm r0,4(arg0)
79 1.1 fredette comib,<< 15, %arg1, $bzero_loop_16
80 1.1 fredette addi -16, %arg1, %arg1
81 1.1 fredette
82 1.1 fredette /*
83 1.1 fredette * see if there is anything left that needs to be zeroed in a word
84 1.1 fredette * 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.1 fredette $bzero_word
89 1.1 fredette addib,<,n 12,arg1,$bzero_cleanup
90 1.1 fredette
91 1.1 fredette $bzero_loop_4
92 1.1 fredette addib,>= -4,arg1,$bzero_loop_4
93 1.1 fredette 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.1 fredette $bzero_cleanup
100 1.1 fredette addib,=,n 4,arg1,$bzero_exit
101 1.1 fredette add arg0,arg1,arg0
102 1.1 fredette b $bzero_exit
103 1.1 fredette 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.1 fredette $bzero_bytes
112 1.1 fredette addib,> -1,arg1,$bzero_bytes
113 1.1 fredette stbs,ma r0,1(arg0)
114 1.1 fredette
115 1.1 fredette $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