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 
10 ENTRY_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]
46 END_CFI(memset)
47 
48 ; memzero: @r0 = mem, @r1 = size_t
49 ; memset:  @r0 = mem, @r1 = char, @r2 = size_t
50 
51 ENTRY_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
56 END_CFI(memzero)
57