1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/linkage.h>
14
15ENTRY(memset)
16 tst r6,r6
17 bt/s 5f ! if n=0, do nothing
18 add r6,r4
19 mov
20 cmp/gt r6,r0
21 bt/s 4f ! if it's too small, set a byte at once
22 mov r4,r0
23 and
24 cmp/eq
25 bt/s 2f ! It's aligned
26 sub r0,r6
271:
28 dt r0
29 bf/s 1b
30 mov.b r5,@-r4
312: ! make VVVV
32 extu.b r5,r5
33 swap.b r5,r0 ! V0
34 or r0,r5 ! VV
35 swap.w r5,r0 ! VV00
36 or r0,r5 ! VVVV
37 !
38 mov r6,r0
39 shlr2 r0
40 shlr r0 ! r0 = r6 >> 3
413:
42 dt r0
43 mov.l r5,@-r4 ! set 8-byte at once
44 bf/s 3b
45 mov.l r5,@-r4
46 !
47 mov
48 and r0,r6
49 tst r6,r6
50 bt 5f
51 ! fill bytes
524:
53 dt r6
54 bf/s 4b
55 mov.b r5,@-r4
565:
57 rts
58 mov r4,r0
59