1/* SPDX-License-Identifier: GPL-2.0 */
2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
3
4#include <linux/linkage.h>
5#include "sysdep.h"
6
7 .weak memset
8ENTRY(__memset)
9ENTRY(memset)
10 /* Test if len less than 4 bytes. */
11 mov r12, r0
12 cmplti r2, 8
13 bt .L_set_by_byte
14
15 andi r13, r0, 3
16 movi r19, 4
17 /* Test if dest is not 4 bytes aligned. */
18 bnez r13, .L_dest_not_aligned
19 /* Hardware can handle unaligned access directly. */
20.L_dest_aligned:
21 zextb r3, r1
22 lsli r1, 8
23 or r1, r3
24 lsli r3, r1, 16
25 or r3, r1
26
27 /* If dest is aligned, then copy. */
28 zext r18, r2, 31, 4
29 /* Test if len less than 16 bytes. */
30 bez r18, .L_len_less_16bytes
31
32 LABLE_ALIGN
33.L_len_larger_16bytes:
34 stw r3, (r0, 0)
35 stw r3, (r0, 4)
36 stw r3, (r0, 8)
37 stw r3, (r0, 12)
38 PRE_BNEZAD (r18)
39 addi r0, 16
40 BNEZAD (r18, .L_len_larger_16bytes)
41
42.L_len_less_16bytes:
43 zext r18, r2, 3, 2
44 andi r2, 3
45 bez r18, .L_set_by_byte
46.L_len_less_16bytes_loop:
47 stw r3, (r0, 0)
48 PRE_BNEZAD (r18)
49 addi r0, 4
50 BNEZAD (r18, .L_len_less_16bytes_loop)
51
52 /* Test if len less than 4 bytes. */
53.L_set_by_byte:
54 zext r18, r2, 2, 0
55 bez r18, .L_return
56.L_set_by_byte_loop:
57 stb r1, (r0, 0)
58 PRE_BNEZAD (r18)
59 addi r0, 1
60 BNEZAD (r18, .L_set_by_byte_loop)
61
62.L_return:
63 mov r0, r12
64 rts
65
66 /* If dest is not aligned, just set some bytes makes the dest
67 align. */
68
69.L_dest_not_aligned:
70 sub r13, r19, r13
71 sub r2, r13
72.L_dest_not_aligned_loop:
73 /* Makes the dest align. */
74 stb r1, (r0, 0)
75 PRE_BNEZAD (r13)
76 addi r0, 1
77 BNEZAD (r13, .L_dest_not_aligned_loop)
78 cmplti r2, 8
79 bt .L_set_by_byte
80 /* Check whether the src is aligned. */
81 jbr .L_dest_aligned
82ENDPROC(memset)
83ENDPROC(__memset)
84

source code of linux/arch/csky/abiv2/memset.S