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