xref: /linux/arch/sparc/lib/bzero.S (revision 40bdac7dbc161639a498697f34fbd1ee800e51f4)
1478b8fecSSam Ravnborg/* bzero.S: Simple prefetching memset, bzero, and clear_user
2478b8fecSSam Ravnborg *          implementations.
3478b8fecSSam Ravnborg *
4478b8fecSSam Ravnborg * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
5478b8fecSSam Ravnborg */
6478b8fecSSam Ravnborg
7478b8fecSSam Ravnborg	.text
8478b8fecSSam Ravnborg
9478b8fecSSam Ravnborg	.globl	__memset
10478b8fecSSam Ravnborg	.type	__memset, #function
11478b8fecSSam Ravnborg__memset:		/* %o0=buf, %o1=pat, %o2=len */
12478b8fecSSam Ravnborg
13478b8fecSSam Ravnborg	.globl	memset
14478b8fecSSam Ravnborg	.type	memset, #function
15478b8fecSSam Ravnborgmemset:			/* %o0=buf, %o1=pat, %o2=len */
16478b8fecSSam Ravnborg	and		%o1, 0xff, %o3
17478b8fecSSam Ravnborg	mov		%o2, %o1
18478b8fecSSam Ravnborg	sllx		%o3, 8, %g1
19478b8fecSSam Ravnborg	or		%g1, %o3, %o2
20478b8fecSSam Ravnborg	sllx		%o2, 16, %g1
21478b8fecSSam Ravnborg	or		%g1, %o2, %o2
22478b8fecSSam Ravnborg	sllx		%o2, 32, %g1
23478b8fecSSam Ravnborg	ba,pt		%xcc, 1f
24478b8fecSSam Ravnborg	 or		%g1, %o2, %o2
25478b8fecSSam Ravnborg
26478b8fecSSam Ravnborg	.globl	__bzero
27478b8fecSSam Ravnborg	.type	__bzero, #function
28478b8fecSSam Ravnborg__bzero:		/* %o0=buf, %o1=len */
29478b8fecSSam Ravnborg	clr		%o2
30478b8fecSSam Ravnborg1:	mov		%o0, %o3
31478b8fecSSam Ravnborg	brz,pn		%o1, __bzero_done
32478b8fecSSam Ravnborg	 cmp		%o1, 16
33478b8fecSSam Ravnborg	bl,pn		%icc, __bzero_tiny
34478b8fecSSam Ravnborg	 prefetch	[%o0 + 0x000], #n_writes
35478b8fecSSam Ravnborg	andcc		%o0, 0x3, %g0
36478b8fecSSam Ravnborg	be,pt		%icc, 2f
37478b8fecSSam Ravnborg1:	 stb		%o2, [%o0 + 0x00]
38478b8fecSSam Ravnborg	add		%o0, 1, %o0
39478b8fecSSam Ravnborg	andcc		%o0, 0x3, %g0
40478b8fecSSam Ravnborg	bne,pn		%icc, 1b
41478b8fecSSam Ravnborg	 sub		%o1, 1, %o1
42478b8fecSSam Ravnborg2:	andcc		%o0, 0x7, %g0
43478b8fecSSam Ravnborg	be,pt		%icc, 3f
44478b8fecSSam Ravnborg	 stw		%o2, [%o0 + 0x00]
45478b8fecSSam Ravnborg	sub		%o1, 4, %o1
46478b8fecSSam Ravnborg	add		%o0, 4, %o0
47478b8fecSSam Ravnborg3:	and		%o1, 0x38, %g1
48478b8fecSSam Ravnborg	cmp		%o1, 0x40
49478b8fecSSam Ravnborg	andn		%o1, 0x3f, %o4
50478b8fecSSam Ravnborg	bl,pn		%icc, 5f
51478b8fecSSam Ravnborg	 and		%o1, 0x7, %o1
52478b8fecSSam Ravnborg	prefetch	[%o0 + 0x040], #n_writes
53478b8fecSSam Ravnborg	prefetch	[%o0 + 0x080], #n_writes
54478b8fecSSam Ravnborg	prefetch	[%o0 + 0x0c0], #n_writes
55478b8fecSSam Ravnborg	prefetch	[%o0 + 0x100], #n_writes
56478b8fecSSam Ravnborg	prefetch	[%o0 + 0x140], #n_writes
57478b8fecSSam Ravnborg4:	prefetch	[%o0 + 0x180], #n_writes
58478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x00]
59478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x08]
60478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x10]
61478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x18]
62478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x20]
63478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x28]
64478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x30]
65478b8fecSSam Ravnborg	stx		%o2, [%o0 + 0x38]
66478b8fecSSam Ravnborg	subcc		%o4, 0x40, %o4
67478b8fecSSam Ravnborg	bne,pt		%icc, 4b
68478b8fecSSam Ravnborg	 add		%o0, 0x40, %o0
69478b8fecSSam Ravnborg	brz,pn		%g1, 6f
70478b8fecSSam Ravnborg	 nop
71478b8fecSSam Ravnborg5:	stx		%o2, [%o0 + 0x00]
72478b8fecSSam Ravnborg	subcc		%g1, 8, %g1
73478b8fecSSam Ravnborg	bne,pt		%icc, 5b
74478b8fecSSam Ravnborg	 add		%o0, 0x8, %o0
75478b8fecSSam Ravnborg6:	brz,pt		%o1, __bzero_done
76478b8fecSSam Ravnborg	 nop
77478b8fecSSam Ravnborg__bzero_tiny:
78478b8fecSSam Ravnborg1:	stb		%o2, [%o0 + 0x00]
79478b8fecSSam Ravnborg	subcc		%o1, 1, %o1
80478b8fecSSam Ravnborg	bne,pt		%icc, 1b
81478b8fecSSam Ravnborg	 add		%o0, 1, %o0
82478b8fecSSam Ravnborg__bzero_done:
83478b8fecSSam Ravnborg	retl
84478b8fecSSam Ravnborg	 mov		%o3, %o0
85478b8fecSSam Ravnborg	.size		__bzero, .-__bzero
86478b8fecSSam Ravnborg	.size		__memset, .-__memset
87478b8fecSSam Ravnborg	.size		memset, .-memset
88478b8fecSSam Ravnborg
89478b8fecSSam Ravnborg#define EX_ST(x,y)		\
90478b8fecSSam Ravnborg98:	x,y;			\
91478b8fecSSam Ravnborg	.section __ex_table,"a";\
92478b8fecSSam Ravnborg	.align 4;		\
93*40bdac7dSDavid S. Miller	.word 98b, __retl_o1;	\
94478b8fecSSam Ravnborg	.text;			\
95478b8fecSSam Ravnborg	.align 4;
96478b8fecSSam Ravnborg
97478b8fecSSam Ravnborg	.globl	__clear_user
98478b8fecSSam Ravnborg	.type	__clear_user, #function
99478b8fecSSam Ravnborg__clear_user:		/* %o0=buf, %o1=len */
100478b8fecSSam Ravnborg	brz,pn		%o1, __clear_user_done
101478b8fecSSam Ravnborg	 cmp		%o1, 16
102478b8fecSSam Ravnborg	bl,pn		%icc, __clear_user_tiny
103478b8fecSSam Ravnborg	 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
104478b8fecSSam Ravnborg	andcc		%o0, 0x3, %g0
105478b8fecSSam Ravnborg	be,pt		%icc, 2f
106478b8fecSSam Ravnborg1:	 EX_ST(stba	%g0, [%o0 + 0x00] %asi)
107478b8fecSSam Ravnborg	add		%o0, 1, %o0
108478b8fecSSam Ravnborg	andcc		%o0, 0x3, %g0
109478b8fecSSam Ravnborg	bne,pn		%icc, 1b
110478b8fecSSam Ravnborg	 sub		%o1, 1, %o1
111478b8fecSSam Ravnborg2:	andcc		%o0, 0x7, %g0
112478b8fecSSam Ravnborg	be,pt		%icc, 3f
113478b8fecSSam Ravnborg	 EX_ST(stwa	%g0, [%o0 + 0x00] %asi)
114478b8fecSSam Ravnborg	sub		%o1, 4, %o1
115478b8fecSSam Ravnborg	add		%o0, 4, %o0
116478b8fecSSam Ravnborg3:	and		%o1, 0x38, %g1
117478b8fecSSam Ravnborg	cmp		%o1, 0x40
118478b8fecSSam Ravnborg	andn		%o1, 0x3f, %o4
119478b8fecSSam Ravnborg	bl,pn		%icc, 5f
120478b8fecSSam Ravnborg	 and		%o1, 0x7, %o1
121478b8fecSSam Ravnborg	EX_ST(prefetcha	[%o0 + 0x040] %asi, #n_writes)
122478b8fecSSam Ravnborg	EX_ST(prefetcha	[%o0 + 0x080] %asi, #n_writes)
123478b8fecSSam Ravnborg	EX_ST(prefetcha	[%o0 + 0x0c0] %asi, #n_writes)
124478b8fecSSam Ravnborg	EX_ST(prefetcha	[%o0 + 0x100] %asi, #n_writes)
125478b8fecSSam Ravnborg	EX_ST(prefetcha	[%o0 + 0x140] %asi, #n_writes)
126478b8fecSSam Ravnborg4:	EX_ST(prefetcha	[%o0 + 0x180] %asi, #n_writes)
127478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
128478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x08] %asi)
129478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x10] %asi)
130478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x18] %asi)
131478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x20] %asi)
132478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x28] %asi)
133478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x30] %asi)
134478b8fecSSam Ravnborg	EX_ST(stxa	%g0, [%o0 + 0x38] %asi)
135478b8fecSSam Ravnborg	subcc		%o4, 0x40, %o4
136478b8fecSSam Ravnborg	bne,pt		%icc, 4b
137478b8fecSSam Ravnborg	 add		%o0, 0x40, %o0
138478b8fecSSam Ravnborg	brz,pn		%g1, 6f
139478b8fecSSam Ravnborg	 nop
140478b8fecSSam Ravnborg5:	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
141478b8fecSSam Ravnborg	subcc		%g1, 8, %g1
142478b8fecSSam Ravnborg	bne,pt		%icc, 5b
143478b8fecSSam Ravnborg	 add		%o0, 0x8, %o0
144478b8fecSSam Ravnborg6:	brz,pt		%o1, __clear_user_done
145478b8fecSSam Ravnborg	 nop
146478b8fecSSam Ravnborg__clear_user_tiny:
147478b8fecSSam Ravnborg1:	EX_ST(stba	%g0, [%o0 + 0x00] %asi)
148478b8fecSSam Ravnborg	subcc		%o1, 1, %o1
149478b8fecSSam Ravnborg	bne,pt		%icc, 1b
150478b8fecSSam Ravnborg	 add		%o0, 1, %o0
151478b8fecSSam Ravnborg__clear_user_done:
152478b8fecSSam Ravnborg	retl
153478b8fecSSam Ravnborg	 clr		%o0
154478b8fecSSam Ravnborg	.size		__clear_user, .-__clear_user
155