Linux Audio

Check our new training course

Loading...
v3.15
  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
  9	.text
 10
 11ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
 12	and		%o1, 0xff, %o3
 13	mov		%o2, %o1
 14	sllx		%o3, 8, %g1
 15	or		%g1, %o3, %o2
 16	sllx		%o2, 16, %g1
 17	or		%g1, %o2, %o2
 18	sllx		%o2, 32, %g1
 19	ba,pt		%xcc, 1f
 20	 or		%g1, %o2, %o2
 21
 22ENTRY(__bzero) /* %o0=buf, %o1=len */
 23	clr		%o2
 241:	mov		%o0, %o3
 25	brz,pn		%o1, __bzero_done
 26	 cmp		%o1, 16
 27	bl,pn		%icc, __bzero_tiny
 28	 prefetch	[%o0 + 0x000], #n_writes
 29	andcc		%o0, 0x3, %g0
 30	be,pt		%icc, 2f
 311:	 stb		%o2, [%o0 + 0x00]
 32	add		%o0, 1, %o0
 33	andcc		%o0, 0x3, %g0
 34	bne,pn		%icc, 1b
 35	 sub		%o1, 1, %o1
 362:	andcc		%o0, 0x7, %g0
 37	be,pt		%icc, 3f
 38	 stw		%o2, [%o0 + 0x00]
 39	sub		%o1, 4, %o1
 40	add		%o0, 4, %o0
 413:	and		%o1, 0x38, %g1
 42	cmp		%o1, 0x40
 43	andn		%o1, 0x3f, %o4
 44	bl,pn		%icc, 5f
 45	 and		%o1, 0x7, %o1
 46	prefetch	[%o0 + 0x040], #n_writes
 47	prefetch	[%o0 + 0x080], #n_writes
 48	prefetch	[%o0 + 0x0c0], #n_writes
 49	prefetch	[%o0 + 0x100], #n_writes
 50	prefetch	[%o0 + 0x140], #n_writes
 514:	prefetch	[%o0 + 0x180], #n_writes
 52	stx		%o2, [%o0 + 0x00]
 53	stx		%o2, [%o0 + 0x08]
 54	stx		%o2, [%o0 + 0x10]
 55	stx		%o2, [%o0 + 0x18]
 56	stx		%o2, [%o0 + 0x20]
 57	stx		%o2, [%o0 + 0x28]
 58	stx		%o2, [%o0 + 0x30]
 59	stx		%o2, [%o0 + 0x38]
 60	subcc		%o4, 0x40, %o4
 61	bne,pt		%icc, 4b
 62	 add		%o0, 0x40, %o0
 63	brz,pn		%g1, 6f
 64	 nop
 655:	stx		%o2, [%o0 + 0x00]
 66	subcc		%g1, 8, %g1
 67	bne,pt		%icc, 5b
 68	 add		%o0, 0x8, %o0
 696:	brz,pt		%o1, __bzero_done
 70	 nop
 71__bzero_tiny:
 721:	stb		%o2, [%o0 + 0x00]
 73	subcc		%o1, 1, %o1
 74	bne,pt		%icc, 1b
 75	 add		%o0, 1, %o0
 76__bzero_done:
 77	retl
 78	 mov		%o3, %o0
 79ENDPROC(__bzero)
 80ENDPROC(memset)
 81
 82#define EX_ST(x,y)		\
 8398:	x,y;			\
 84	.section __ex_table,"a";\
 85	.align 4;		\
 86	.word 98b, __retl_o1;	\
 87	.text;			\
 88	.align 4;
 89
 90ENTRY(__clear_user) /* %o0=buf, %o1=len */
 91	brz,pn		%o1, __clear_user_done
 92	 cmp		%o1, 16
 93	bl,pn		%icc, __clear_user_tiny
 94	 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
 95	andcc		%o0, 0x3, %g0
 96	be,pt		%icc, 2f
 971:	 EX_ST(stba	%g0, [%o0 + 0x00] %asi)
 98	add		%o0, 1, %o0
 99	andcc		%o0, 0x3, %g0
100	bne,pn		%icc, 1b
101	 sub		%o1, 1, %o1
1022:	andcc		%o0, 0x7, %g0
103	be,pt		%icc, 3f
104	 EX_ST(stwa	%g0, [%o0 + 0x00] %asi)
105	sub		%o1, 4, %o1
106	add		%o0, 4, %o0
1073:	and		%o1, 0x38, %g1
108	cmp		%o1, 0x40
109	andn		%o1, 0x3f, %o4
110	bl,pn		%icc, 5f
111	 and		%o1, 0x7, %o1
112	EX_ST(prefetcha	[%o0 + 0x040] %asi, #n_writes)
113	EX_ST(prefetcha	[%o0 + 0x080] %asi, #n_writes)
114	EX_ST(prefetcha	[%o0 + 0x0c0] %asi, #n_writes)
115	EX_ST(prefetcha	[%o0 + 0x100] %asi, #n_writes)
116	EX_ST(prefetcha	[%o0 + 0x140] %asi, #n_writes)
1174:	EX_ST(prefetcha	[%o0 + 0x180] %asi, #n_writes)
118	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
119	EX_ST(stxa	%g0, [%o0 + 0x08] %asi)
120	EX_ST(stxa	%g0, [%o0 + 0x10] %asi)
121	EX_ST(stxa	%g0, [%o0 + 0x18] %asi)
122	EX_ST(stxa	%g0, [%o0 + 0x20] %asi)
123	EX_ST(stxa	%g0, [%o0 + 0x28] %asi)
124	EX_ST(stxa	%g0, [%o0 + 0x30] %asi)
125	EX_ST(stxa	%g0, [%o0 + 0x38] %asi)
126	subcc		%o4, 0x40, %o4
127	bne,pt		%icc, 4b
128	 add		%o0, 0x40, %o0
129	brz,pn		%g1, 6f
130	 nop
1315:	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
132	subcc		%g1, 8, %g1
133	bne,pt		%icc, 5b
134	 add		%o0, 0x8, %o0
1356:	brz,pt		%o1, __clear_user_done
136	 nop
137__clear_user_tiny:
1381:	EX_ST(stba	%g0, [%o0 + 0x00] %asi)
139	subcc		%o1, 1, %o1
140	bne,pt		%icc, 1b
141	 add		%o0, 1, %o0
142__clear_user_done:
143	retl
144	 clr		%o0
145ENDPROC(__clear_user)
v3.5.6
  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
  9	.text
 10
 11ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
 12	and		%o1, 0xff, %o3
 13	mov		%o2, %o1
 14	sllx		%o3, 8, %g1
 15	or		%g1, %o3, %o2
 16	sllx		%o2, 16, %g1
 17	or		%g1, %o2, %o2
 18	sllx		%o2, 32, %g1
 19	ba,pt		%xcc, 1f
 20	 or		%g1, %o2, %o2
 21
 22ENTRY(__bzero) /* %o0=buf, %o1=len */
 23	clr		%o2
 241:	mov		%o0, %o3
 25	brz,pn		%o1, __bzero_done
 26	 cmp		%o1, 16
 27	bl,pn		%icc, __bzero_tiny
 28	 prefetch	[%o0 + 0x000], #n_writes
 29	andcc		%o0, 0x3, %g0
 30	be,pt		%icc, 2f
 311:	 stb		%o2, [%o0 + 0x00]
 32	add		%o0, 1, %o0
 33	andcc		%o0, 0x3, %g0
 34	bne,pn		%icc, 1b
 35	 sub		%o1, 1, %o1
 362:	andcc		%o0, 0x7, %g0
 37	be,pt		%icc, 3f
 38	 stw		%o2, [%o0 + 0x00]
 39	sub		%o1, 4, %o1
 40	add		%o0, 4, %o0
 413:	and		%o1, 0x38, %g1
 42	cmp		%o1, 0x40
 43	andn		%o1, 0x3f, %o4
 44	bl,pn		%icc, 5f
 45	 and		%o1, 0x7, %o1
 46	prefetch	[%o0 + 0x040], #n_writes
 47	prefetch	[%o0 + 0x080], #n_writes
 48	prefetch	[%o0 + 0x0c0], #n_writes
 49	prefetch	[%o0 + 0x100], #n_writes
 50	prefetch	[%o0 + 0x140], #n_writes
 514:	prefetch	[%o0 + 0x180], #n_writes
 52	stx		%o2, [%o0 + 0x00]
 53	stx		%o2, [%o0 + 0x08]
 54	stx		%o2, [%o0 + 0x10]
 55	stx		%o2, [%o0 + 0x18]
 56	stx		%o2, [%o0 + 0x20]
 57	stx		%o2, [%o0 + 0x28]
 58	stx		%o2, [%o0 + 0x30]
 59	stx		%o2, [%o0 + 0x38]
 60	subcc		%o4, 0x40, %o4
 61	bne,pt		%icc, 4b
 62	 add		%o0, 0x40, %o0
 63	brz,pn		%g1, 6f
 64	 nop
 655:	stx		%o2, [%o0 + 0x00]
 66	subcc		%g1, 8, %g1
 67	bne,pt		%icc, 5b
 68	 add		%o0, 0x8, %o0
 696:	brz,pt		%o1, __bzero_done
 70	 nop
 71__bzero_tiny:
 721:	stb		%o2, [%o0 + 0x00]
 73	subcc		%o1, 1, %o1
 74	bne,pt		%icc, 1b
 75	 add		%o0, 1, %o0
 76__bzero_done:
 77	retl
 78	 mov		%o3, %o0
 79ENDPROC(__bzero)
 80ENDPROC(memset)
 81
 82#define EX_ST(x,y)		\
 8398:	x,y;			\
 84	.section __ex_table,"a";\
 85	.align 4;		\
 86	.word 98b, __retl_o1;	\
 87	.text;			\
 88	.align 4;
 89
 90ENTRY(__clear_user) /* %o0=buf, %o1=len */
 91	brz,pn		%o1, __clear_user_done
 92	 cmp		%o1, 16
 93	bl,pn		%icc, __clear_user_tiny
 94	 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
 95	andcc		%o0, 0x3, %g0
 96	be,pt		%icc, 2f
 971:	 EX_ST(stba	%g0, [%o0 + 0x00] %asi)
 98	add		%o0, 1, %o0
 99	andcc		%o0, 0x3, %g0
100	bne,pn		%icc, 1b
101	 sub		%o1, 1, %o1
1022:	andcc		%o0, 0x7, %g0
103	be,pt		%icc, 3f
104	 EX_ST(stwa	%g0, [%o0 + 0x00] %asi)
105	sub		%o1, 4, %o1
106	add		%o0, 4, %o0
1073:	and		%o1, 0x38, %g1
108	cmp		%o1, 0x40
109	andn		%o1, 0x3f, %o4
110	bl,pn		%icc, 5f
111	 and		%o1, 0x7, %o1
112	EX_ST(prefetcha	[%o0 + 0x040] %asi, #n_writes)
113	EX_ST(prefetcha	[%o0 + 0x080] %asi, #n_writes)
114	EX_ST(prefetcha	[%o0 + 0x0c0] %asi, #n_writes)
115	EX_ST(prefetcha	[%o0 + 0x100] %asi, #n_writes)
116	EX_ST(prefetcha	[%o0 + 0x140] %asi, #n_writes)
1174:	EX_ST(prefetcha	[%o0 + 0x180] %asi, #n_writes)
118	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
119	EX_ST(stxa	%g0, [%o0 + 0x08] %asi)
120	EX_ST(stxa	%g0, [%o0 + 0x10] %asi)
121	EX_ST(stxa	%g0, [%o0 + 0x18] %asi)
122	EX_ST(stxa	%g0, [%o0 + 0x20] %asi)
123	EX_ST(stxa	%g0, [%o0 + 0x28] %asi)
124	EX_ST(stxa	%g0, [%o0 + 0x30] %asi)
125	EX_ST(stxa	%g0, [%o0 + 0x38] %asi)
126	subcc		%o4, 0x40, %o4
127	bne,pt		%icc, 4b
128	 add		%o0, 0x40, %o0
129	brz,pn		%g1, 6f
130	 nop
1315:	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
132	subcc		%g1, 8, %g1
133	bne,pt		%icc, 5b
134	 add		%o0, 0x8, %o0
1356:	brz,pt		%o1, __clear_user_done
136	 nop
137__clear_user_tiny:
1381:	EX_ST(stba	%g0, [%o0 + 0x00] %asi)
139	subcc		%o1, 1, %o1
140	bne,pt		%icc, 1b
141	 add		%o0, 1, %o0
142__clear_user_done:
143	retl
144	 clr		%o0
145ENDPROC(__clear_user)