xref: /OK3568_Linux_fs/u-boot/arch/arc/lib/memset.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1/*
2 * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier:	GPL-2.0+
5 */
6
7#define SMALL	7 /* Must be at least 6 to deal with alignment/loop issues.  */
8
9.global memset
10.align 4
11memset:
12	mov_s	%r4, %r0
13	or	%r12, %r0, %r2
14	bmsk.f	%r12, %r12, 1
15	extb_s	%r1, %r1
16	asl	%r3, %r1, 8
17	beq.d	.Laligned
18	or_s	%r1, %r1, %r3
19	brls	%r2, SMALL, .Ltiny
20	add	%r3, %r2, %r0
21	stb	%r1, [%r3, -1]
22	bclr_s	%r3, %r3, 0
23	stw	%r1, [%r3, -2]
24	bmsk.f	%r12, %r0, 1
25	add_s	%r2, %r2, %r12
26	sub.ne	%r2, %r2, 4
27	stb.ab	%r1, [%r4, 1]
28	and	%r4, %r4, -2
29	stw.ab	%r1, [%r4, 2]
30	and	%r4, %r4, -4
31
32	.balign	4
33.Laligned:
34	asl	%r3, %r1, 16
35	lsr.f	%lp_count, %r2, 2
36	or_s	%r1, %r1, %r3
37	lpne	.Loop_end
38	st.ab	%r1, [%r4, 4]
39.Loop_end:
40	j_s	[%blink]
41
42	.balign	4
43.Ltiny:
44	mov.f	%lp_count, %r2
45	lpne	.Ltiny_end
46	stb.ab	%r1, [%r4, 1]
47.Ltiny_end:
48	j_s	[%blink]
49
50/*
51 * memzero: @r0 = mem, @r1 = size_t
52 * memset:  @r0 = mem, @r1 = char, @r2 = size_t
53 */
54
55.global memzero
56.align 4
57memzero:
58	/* adjust bzero args to memset args */
59	mov	%r2, %r1
60	mov	%r1, 0
61	/* tail call so need to tinker with blink */
62	b	memset
63