Linux Audio

Check our new training course

Loading...
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/* bzero.S: Simple prefetching memset, bzero, and clear_user
  3 *          implementations.
  4 *
  5 * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
  6 */
  7
  8#include <linux/linkage.h>
  9#include <asm/export.h>
 10
 11	.text
 12
 13ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
 14	and		%o1, 0xff, %o3
 15	mov		%o2, %o1
 16	sllx		%o3, 8, %g1
 17	or		%g1, %o3, %o2
 18	sllx		%o2, 16, %g1
 19	or		%g1, %o2, %o2
 20	sllx		%o2, 32, %g1
 21	ba,pt		%xcc, 1f
 22	 or		%g1, %o2, %o2
 23
 24ENTRY(__bzero) /* %o0=buf, %o1=len */
 25	clr		%o2
 261:	mov		%o0, %o3
 27	brz,pn		%o1, __bzero_done
 28	 cmp		%o1, 16
 29	bl,pn		%icc, __bzero_tiny
 30	 prefetch	[%o0 + 0x000], #n_writes
 31	andcc		%o0, 0x3, %g0
 32	be,pt		%icc, 2f
 331:	 stb		%o2, [%o0 + 0x00]
 34	add		%o0, 1, %o0
 35	andcc		%o0, 0x3, %g0
 36	bne,pn		%icc, 1b
 37	 sub		%o1, 1, %o1
 382:	andcc		%o0, 0x7, %g0
 39	be,pt		%icc, 3f
 40	 stw		%o2, [%o0 + 0x00]
 41	sub		%o1, 4, %o1
 42	add		%o0, 4, %o0
 433:	and		%o1, 0x38, %g1
 44	cmp		%o1, 0x40
 45	andn		%o1, 0x3f, %o4
 46	bl,pn		%icc, 5f
 47	 and		%o1, 0x7, %o1
 48	prefetch	[%o0 + 0x040], #n_writes
 49	prefetch	[%o0 + 0x080], #n_writes
 50	prefetch	[%o0 + 0x0c0], #n_writes
 51	prefetch	[%o0 + 0x100], #n_writes
 52	prefetch	[%o0 + 0x140], #n_writes
 534:	prefetch	[%o0 + 0x180], #n_writes
 54	stx		%o2, [%o0 + 0x00]
 55	stx		%o2, [%o0 + 0x08]
 56	stx		%o2, [%o0 + 0x10]
 57	stx		%o2, [%o0 + 0x18]
 58	stx		%o2, [%o0 + 0x20]
 59	stx		%o2, [%o0 + 0x28]
 60	stx		%o2, [%o0 + 0x30]
 61	stx		%o2, [%o0 + 0x38]
 62	subcc		%o4, 0x40, %o4
 63	bne,pt		%icc, 4b
 64	 add		%o0, 0x40, %o0
 65	brz,pn		%g1, 6f
 66	 nop
 675:	stx		%o2, [%o0 + 0x00]
 68	subcc		%g1, 8, %g1
 69	bne,pt		%icc, 5b
 70	 add		%o0, 0x8, %o0
 716:	brz,pt		%o1, __bzero_done
 72	 nop
 73__bzero_tiny:
 741:	stb		%o2, [%o0 + 0x00]
 75	subcc		%o1, 1, %o1
 76	bne,pt		%icc, 1b
 77	 add		%o0, 1, %o0
 78__bzero_done:
 79	retl
 80	 mov		%o3, %o0
 81ENDPROC(__bzero)
 82ENDPROC(memset)
 83EXPORT_SYMBOL(__bzero)
 84EXPORT_SYMBOL(memset)
 85
 86#define EX_ST(x,y)		\
 8798:	x,y;			\
 88	.section __ex_table,"a";\
 89	.align 4;		\
 90	.word 98b, __retl_o1;	\
 91	.text;			\
 92	.align 4;
 93
 94ENTRY(__clear_user) /* %o0=buf, %o1=len */
 95	brz,pn		%o1, __clear_user_done
 96	 cmp		%o1, 16
 97	bl,pn		%icc, __clear_user_tiny
 98	 EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
 99	andcc		%o0, 0x3, %g0
100	be,pt		%icc, 2f
1011:	 EX_ST(stba	%g0, [%o0 + 0x00] %asi)
102	add		%o0, 1, %o0
103	andcc		%o0, 0x3, %g0
104	bne,pn		%icc, 1b
105	 sub		%o1, 1, %o1
1062:	andcc		%o0, 0x7, %g0
107	be,pt		%icc, 3f
108	 EX_ST(stwa	%g0, [%o0 + 0x00] %asi)
109	sub		%o1, 4, %o1
110	add		%o0, 4, %o0
1113:	and		%o1, 0x38, %g1
112	cmp		%o1, 0x40
113	andn		%o1, 0x3f, %o4
114	bl,pn		%icc, 5f
115	 and		%o1, 0x7, %o1
116	EX_ST(prefetcha	[%o0 + 0x040] %asi, #n_writes)
117	EX_ST(prefetcha	[%o0 + 0x080] %asi, #n_writes)
118	EX_ST(prefetcha	[%o0 + 0x0c0] %asi, #n_writes)
119	EX_ST(prefetcha	[%o0 + 0x100] %asi, #n_writes)
120	EX_ST(prefetcha	[%o0 + 0x140] %asi, #n_writes)
1214:	EX_ST(prefetcha	[%o0 + 0x180] %asi, #n_writes)
122	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
123	EX_ST(stxa	%g0, [%o0 + 0x08] %asi)
124	EX_ST(stxa	%g0, [%o0 + 0x10] %asi)
125	EX_ST(stxa	%g0, [%o0 + 0x18] %asi)
126	EX_ST(stxa	%g0, [%o0 + 0x20] %asi)
127	EX_ST(stxa	%g0, [%o0 + 0x28] %asi)
128	EX_ST(stxa	%g0, [%o0 + 0x30] %asi)
129	EX_ST(stxa	%g0, [%o0 + 0x38] %asi)
130	subcc		%o4, 0x40, %o4
131	bne,pt		%icc, 4b
132	 add		%o0, 0x40, %o0
133	brz,pn		%g1, 6f
134	 nop
1355:	EX_ST(stxa	%g0, [%o0 + 0x00] %asi)
136	subcc		%g1, 8, %g1
137	bne,pt		%icc, 5b
138	 add		%o0, 0x8, %o0
1396:	brz,pt		%o1, __clear_user_done
140	 nop
141__clear_user_tiny:
1421:	EX_ST(stba	%g0, [%o0 + 0x00] %asi)
143	subcc		%o1, 1, %o1
144	bne,pt		%icc, 1b
145	 add		%o0, 1, %o0
146__clear_user_done:
147	retl
148	 clr		%o0
149ENDPROC(__clear_user)
150EXPORT_SYMBOL(__clear_user)
v4.10.11
 
  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)