xref: /openbmc/linux/arch/arc/lib/memset.S (revision 3cea11cd)
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4 */
5
6#include <linux/linkage.h>
7
8#define SMALL	7 /* Must be at least 6 to deal with alignment/loop issues.  */
9
10ENTRY_CFI(memset)
11	mov_s	r4,r0
12	or	r12,r0,r2
13	bmsk.f	r12,r12,1
14	extb_s	r1,r1
15	asl	r3,r1,8
16	beq.d	.Laligned
17	or_s	r1,r1,r3
18	brls	r2,SMALL,.Ltiny
19	add	r3,r2,r0
20	stb	r1,[r3,-1]
21	bclr_s	r3,r3,0
22	stw	r1,[r3,-2]
23	bmsk.f	r12,r0,1
24	add_s	r2,r2,r12
25	sub.ne	r2,r2,4
26	stb.ab	r1,[r4,1]
27	and	r4,r4,-2
28	stw.ab	r1,[r4,2]
29	and	r4,r4,-4
30.Laligned:	; This code address should be aligned for speed.
31	asl	r3,r1,16
32	lsr.f	lp_count,r2,2
33	or_s	r1,r1,r3
34	lpne	.Loop_end
35	st.ab	r1,[r4,4]
36.Loop_end:
37	j_s	[blink]
38
39	.balign	4
40.Ltiny:
41	mov.f	lp_count,r2
42	lpne	.Ltiny_end
43	stb.ab	r1,[r4,1]
44.Ltiny_end:
45	j_s	[blink]
46END_CFI(memset)
47
48; memzero: @r0 = mem, @r1 = size_t
49; memset:  @r0 = mem, @r1 = char, @r2 = size_t
50
51ENTRY_CFI(memzero)
52    ; adjust bzero args to memset args
53    mov r2, r1
54    mov r1, 0
55    b  memset    ;tail call so need to tinker with blink
56END_CFI(memzero)
57