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