1
2
3
4
5
6 #include <linux/linkage.h>
7
8 #define SMALL 7
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)