1
2
3
4 #include <linux/linkage.h>
5 #include "sysdep.h"
6
7 .weak memset
8 ENTRY(__memset)
9 ENTRY(memset)
10
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
18 bnez r13, .L_dest_not_aligned
19
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
28 zext r18, r2, 31, 4
29
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
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
67
68
69 .L_dest_not_aligned:
70 sub r13, r19, r13
71 sub r2, r13
72 .L_dest_not_aligned_loop:
73
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
81 jbr .L_dest_aligned
82 ENDPROC(memset)
83 ENDPROC(__memset)