Merge branch 'x86-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / arch / arc / lib / memset.S
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)