1
2
3
4
5
6
7
8
9
10
11
12#include <linux/linkage.h>
13#include <asm/assembler.h>
14#include <asm/unwind.h>
15
16 .text
17 .align 5
18
19ENTRY(mmioset)
20ENTRY(memset)
21UNWIND( .fnstart )
22 ands r3, r0,
23 mov ip, r0 @ preserve r0 as return value
24 bne 6f @ 1
25
26
27
281: orr r1, r1, r1, lsl
29 orr r1, r1, r1, lsl
30 mov r3, r1
31 cmp r2,
32 blt 4f
33
34
35
36
37
38
39 stmfd sp!, {r8, lr}
40UNWIND( .fnend )
41UNWIND( .fnstart )
42UNWIND( .save {r8, lr} )
43 mov r8, r1
44 mov lr, r1
45
462: subs r2, r2,
47 stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
48 stmgeia ip!, {r1, r3, r8, lr}
49 stmgeia ip!, {r1, r3, r8, lr}
50 stmgeia ip!, {r1, r3, r8, lr}
51 bgt 2b
52 ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go.
53
54
55
56 tst r2,
57 stmneia ip!, {r1, r3, r8, lr}
58 stmneia ip!, {r1, r3, r8, lr}
59 tst r2,
60 stmneia ip!, {r1, r3, r8, lr}
61 ldmfd sp!, {r8, lr}
62UNWIND( .fnend )
63
64#else
65
66
67
68
69
70
71 stmfd sp!, {r4-r8, lr}
72UNWIND( .fnend )
73UNWIND( .fnstart )
74UNWIND( .save {r4-r8, lr} )
75 mov r4, r1
76 mov r5, r1
77 mov r6, r1
78 mov r7, r1
79 mov r8, r1
80 mov lr, r1
81
82 cmp r2,
83 tstgt ip,
84 ble 3f
85
86 and r8, ip,
87 rsb r8, r8,
88 sub r2, r2, r8
89 movs r8, r8, lsl
90 stmcsia ip!, {r4, r5, r6, r7}
91 stmmiia ip!, {r4, r5}
92 tst r8,
93 mov r8, r1
94 strne r1, [ip],
95
963: subs r2, r2,
97 stmgeia ip!, {r1, r3-r8, lr}
98 stmgeia ip!, {r1, r3-r8, lr}
99 bgt 3b
100 ldmeqfd sp!, {r4-r8, pc}
101
102 tst r2,
103 stmneia ip!, {r1, r3-r8, lr}
104 tst r2,
105 stmneia ip!, {r4-r7}
106 ldmfd sp!, {r4-r8, lr}
107UNWIND( .fnend )
108
109#endif
110
111UNWIND( .fnstart )
1124: tst r2,
113 stmneia ip!, {r1, r3}
114 tst r2,
115 strne r1, [ip],
116
117
118
119
1205: tst r2,
121 strneb r1, [ip],
122 strneb r1, [ip],
123 tst r2,
124 strneb r1, [ip],
125 ret lr
126
1276: subs r2, r2,
128 blt 5b @ 1 bytes to align with?
129 cmp r3,
130 strltb r1, [ip],
131 strleb r1, [ip],
132 strb r1, [ip],
133 add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
134 b 1b
135UNWIND( .fnend )
136ENDPROC(memset)
137ENDPROC(mmioset)
138