xref: /openbmc/linux/arch/sparc/lib/bzero.S (revision 1c2dd16a)
1/* bzero.S: Simple prefetching memset, bzero, and clear_user
2 *          implementations.
3 *
4 * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
5 */
6
7#include <linux/linkage.h>
8#include <asm/export.h>
9
10	.text
11
12ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
13	and		%o1, 0xff, %o3
14	mov		%o2, %o1
15	sllx		%o3, 8, %g1
16	or		%g1, %o3, %o2
17	sllx		%o2, 16, %g1
18	or		%g1, %o2, %o2
19	sllx		%o2, 32, %g1
20	ba,pt		%xcc, 1f
21	 or		%g1, %o2, %o2
22
23ENTRY(__bzero) /* %o0=buf, %o1=len */
24	clr		%o2
251:	mov		%o0, %o3
26	brz,pn		%o1, __bzero_done
27	 cmp		%o1, 16
28	bl,pn		%icc, __bzero_tiny
29	 prefetch	[%o0 + 0x000], #n_writes
30	andcc		%o0, 0x3, %g0
31	be,pt		%icc, 2f
321:	 stb		%o2, [%o0 + 0x00]
33	add		%o0, 1, %o0
34	andcc		%o0, 0x3, %g0
35	bne,pn		%icc, 1b
36	 sub		%o1, 1, %o1
372:	andcc		%o0, 0x7, %g0
38	be,pt		%icc, 3f
39	 stw		%o2, [%o0 + 0x00]
40	sub		%o1, 4, %o1
41	add		%o0, 4, %o0
423:	and		%o1, 0x38, %g1
43	cmp		%o1, 0x40
44	andn		%o1, 0x3f, %o4
45	bl,pn		%icc, 5f
46	 and		%o1, 0x7, %o1
47	prefetch	[%o0 + 0x040], #n_writes
48	prefetch	[%o0 + 0x080], #n_writes
49	prefetch	[%o0 + 0x0c0], #n_writes
50	prefetch	[%o0 + 0x100], #n_writes
51	prefetch	[%o0 + 0x140], #n_writes
524:	prefetch	[%o0 + 0x180], #n_writes
53	stx		%o2, [%o0 + 0x00]
54	stx		%o2, [%o0 + 0x08]
55	stx		%o2, [%o0 + 0x10]
56	stx		%o2, [%o0 + 0x18]
57	stx		%o2, [%o0 + 0x20]
58	stx		%o2, [%o0 + 0x28]
59	stx		%o2, [%o0 + 0x30]
60	stx		%o2, [%o0 + 0x38]
61	subcc		%o4, 0x40, %o4
62	bne,pt		%icc, 4b
63	 add		%o0, 0x40, %o0
64	brz,pn		%g1, 6f
65	 nop
665:	stx		%o2, [%o0 + 0x00]
67	subcc		%g1, 8, %g1
68	bne,pt		%icc, 5b
69	 add		%o0, 0x8, %o0
706:	brz,pt		%o1, __bzero_done
71	 nop
72__bzero_tiny:
731:	stb		%o2, [%o0 + 0x00]
74	subcc		%o1, 1, %o1
75	bne,pt		%icc, 1b
76	 add		%o0, 1, %o0
77__bzero_done:
78	retl
79	 mov		%o3, %o0
80ENDPROC(__bzero)
81ENDPROC(memset)
82EXPORT_SYMBOL(__bzero)
83EXPORT_SYMBOL(memset)
84
85#define EX_ST(x,y)		\
8698:	x,y;			\
87	.section __ex_table,"a";\
88	.align 4;		\
89	.word 98b, __retl_o1;	\
90	.text;			\
91	.align 4;
92
93ENTRY(__clear_user) /* %o0=buf, %o1=len */
94	brz,pn		%o1, __clear_user_done
95	 cmp		%o1, 16
96	bl,pn		%icc, __clear_user_tiny
97	 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
98	andcc		%o0, 0x3, %g0
99	be,pt		%icc, 2f
1001:	 EX_ST(stba	%g0, [%o0 + 0x00] %asi)
101	add		%o0, 1, %o0
102	andcc		%o0, 0x3, %g0
103	bne,pn		%icc, 1b
104	 sub		%o1, 1, %o1
1052:	andcc		%o0, 0x7, %g0
106	be,pt		%icc, 3f
107	 EX_ST(stwa	%g0, [%o0 + 0x00] %asi)
108	sub		%o1, 4, %o1
109	add		%o0, 4, %o0
1103:	and		%o1, 0x38, %g1
111	cmp		%o1, 0x40
112	andn		%o1, 0x3f, %o4
113	bl,pn		%icc, 5f
114	 and		%o1, 0x7, %o1
115	EX_ST(prefetcha	[%o0 + 0x040] %asi, #n_writes)
116	EX_ST(prefetcha	[%o0 + 0x080] %asi, #n_writes)
117	EX_ST(prefetcha	[%o0 + 0x0c0] %asi, #n_writes)
118	EX_ST(prefetcha	[%o0 + 0x100] %asi, #n_writes)
119	EX_ST(prefetcha	[%o0 + 0x140] %asi, #n_writes)
1204:	EX_ST(prefetcha	[%o0 + 0x180] %asi, #n_writes)
121	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
122	EX_ST(stxa	%g0, [%o0 + 0x08] %asi)
123	EX_ST(stxa	%g0, [%o0 + 0x10] %asi)
124	EX_ST(stxa	%g0, [%o0 + 0x18] %asi)
125	EX_ST(stxa	%g0, [%o0 + 0x20] %asi)
126	EX_ST(stxa	%g0, [%o0 + 0x28] %asi)
127	EX_ST(stxa	%g0, [%o0 + 0x30] %asi)
128	EX_ST(stxa	%g0, [%o0 + 0x38] %asi)
129	subcc		%o4, 0x40, %o4
130	bne,pt		%icc, 4b
131	 add		%o0, 0x40, %o0
132	brz,pn		%g1, 6f
133	 nop
1345:	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
135	subcc		%g1, 8, %g1
136	bne,pt		%icc, 5b
137	 add		%o0, 0x8, %o0
1386:	brz,pt		%o1, __clear_user_done
139	 nop
140__clear_user_tiny:
1411:	EX_ST(stba	%g0, [%o0 + 0x00] %asi)
142	subcc		%o1, 1, %o1
143	bne,pt		%icc, 1b
144	 add		%o0, 1, %o0
145__clear_user_done:
146	retl
147	 clr		%o0
148ENDPROC(__clear_user)
149EXPORT_SYMBOL(__clear_user)
150