1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/sys.h>
16#include <asm/processor.h>
17#include <asm/cache.h>
18#include <asm/errno.h>
19#include <asm/ppc_asm.h>
20#include <asm/export.h>
21
22 .text
23
24
25
26
27
28
29
30_GLOBAL(__csum_partial)
31 subi r3,r3,4
32 srawi. r6,r4,2
33 beq 3f
34 andi. r0,r3,2
35 beq+ 1f
36 lhz r0,4(r3)
37 subi r4,r4,2
38 addi r3,r3,2
39 srwi. r6,r4,2
40 adde r5,r5,r0
41 beq 3f
421: andi. r6,r6,3
43 beq 21f
44 mtctr r6
452: lwzu r0,4(r3)
46 adde r5,r5,r0
47 bdnz 2b
4821: srwi. r6,r4,4
49 beq 3f
50 mtctr r6
5122: lwz r0,4(r3)
52 lwz r6,8(r3)
53 lwz r7,12(r3)
54 lwzu r8,16(r3)
55 adde r5,r5,r0
56 adde r5,r5,r6
57 adde r5,r5,r7
58 adde r5,r5,r8
59 bdnz 22b
603: andi. r0,r4,2
61 beq+ 4f
62 lhz r0,4(r3)
63 addi r3,r3,2
64 adde r5,r5,r0
654: andi. r0,r4,1
66 beq+ 5f
67 lbz r0,4(r3)
68 slwi r0,r0,8
69 adde r5,r5,r0
705: addze r3,r5
71 blr
72EXPORT_SYMBOL(__csum_partial)
73
74
75
76
77
78
79
80
81
82
83#define CSUM_COPY_16_BYTES_WITHEX(n) \
848
85 lwz r7,4(r4); \
868
87 lwz r8,8(r4); \
888
89 lwz r9,12(r4); \
908
91 lwzu r10,16(r4); \
928
93 stw r7,4(r6); \
94 adde r12,r12,r7; \
958
96 stw r8,8(r6); \
97 adde r12,r12,r8; \
988
99 stw r9,12(r6); \
100 adde r12,r12,r9; \
1018
102 stwu r10,16(r6); \
103 adde r12,r12,r10
104
105#define CSUM_COPY_16_BYTES_EXCODE(n) \
106 EX_TABLE(8
107 EX_TABLE(8
108 EX_TABLE(8
109 EX_TABLE(8
110 EX_TABLE(8
111 EX_TABLE(8
112 EX_TABLE(8
113 EX_TABLE(8
114
115 .text
116 .stabs "arch/powerpc/lib/",N_SO,0,0,0f
117 .stabs "checksum_32.S",N_SO,0,0,0f
1180:
119
120CACHELINE_BYTES = L1_CACHE_BYTES
121LG_CACHELINE_BYTES = L1_CACHE_SHIFT
122CACHELINE_MASK = (L1_CACHE_BYTES-1)
123
124_GLOBAL(csum_partial_copy_generic)
125 stwu r1,-16(r1)
126 stw r7,12(r1)
127 stw r8,8(r1)
128
129 addic r12,r6,0
130 addi r6,r4,-4
131 neg r0,r4
132 addi r4,r3,-4
133 andi. r0,r0,CACHELINE_MASK
134 crset 4*cr7+eq
135 beq 58f
136
137 cmplw 0,r5,r0
138 blt 63f
139 rlwinm r7,r6,3,0x8
140 rlwnm r12,r12,r7,0,31
141 cmplwi cr7,r7,0
142 andi. r8,r0,3
143 mtctr r8
144 beq+ 61f
145 li r3,0
14670: lbz r9,4(r4)
147 addi r4,r4,1
148 slwi r3,r3,8
149 rlwimi r3,r9,0,24,31
15071: stb r9,4(r6)
151 addi r6,r6,1
152 bdnz 70b
153 adde r12,r12,r3
15461: subf r5,r0,r5
155 srwi. r0,r0,2
156 mtctr r0
157 beq 58f
15872: lwzu r9,4(r4)
159 adde r12,r12,r9
16073: stwu r9,4(r6)
161 bdnz 72b
162
16358: srwi. r0,r5,LG_CACHELINE_BYTES
164 clrlwi r5,r5,32-LG_CACHELINE_BYTES
165 li r11,4
166 beq 63f
167
168
169 li r3,4
170 cmpwi r0,1
171 li r7,0
172 ble 114f
173 li r7,1
174
175
176
177
178 cmpwi r0,MAX_COPY_PREFETCH
179 ble 112f
180 li r7,MAX_COPY_PREFETCH
181112: mtctr r7
182111: dcbt r3,r4
183 addi r3,r3,CACHELINE_BYTES
184 bdnz 111b
185#else
186 dcbt r3,r4
187 addi r3,r3,CACHELINE_BYTES
188#endif
189
190114: subf r8,r7,r0
191 mr r0,r7
192 mtctr r8
193
19453: dcbt r3,r4
19554: dcbz r11,r6
196
197 CSUM_COPY_16_BYTES_WITHEX(0)
198
199 CSUM_COPY_16_BYTES_WITHEX(1)
200
201 CSUM_COPY_16_BYTES_WITHEX(2)
202 CSUM_COPY_16_BYTES_WITHEX(3)
203
204 CSUM_COPY_16_BYTES_WITHEX(4)
205 CSUM_COPY_16_BYTES_WITHEX(5)
206 CSUM_COPY_16_BYTES_WITHEX(6)
207 CSUM_COPY_16_BYTES_WITHEX(7)
208#endif
209#endif
210#endif
211 bdnz 53b
212 cmpwi r0,0
213 li r3,4
214 li r7,0
215 bne 114b
216
21763: srwi. r0,r5,2
218 mtctr r0
219 beq 64f
22030: lwzu r0,4(r4)
221 adde r12,r12,r0
22231: stwu r0,4(r6)
223 bdnz 30b
224
22564: andi. r0,r5,2
226 beq+ 65f
22740: lhz r0,4(r4)
228 addi r4,r4,2
22941: sth r0,4(r6)
230 adde r12,r12,r0
231 addi r6,r6,2
23265: andi. r0,r5,1
233 beq+ 66f
23450: lbz r0,4(r4)
23551: stb r0,4(r6)
236 slwi r0,r0,8
237 adde r12,r12,r0
23866: addze r3,r12
239 addi r1,r1,16
240 beqlr+ cr7
241 rlwinm r3,r3,8,0,31
242 blr
243
244
245src_error:
246 lwz r7,12(r1)
247 addi r1,r1,16
248 cmpwi cr0,r7,0
249 beqlr
250 li r0,-EFAULT
251 stw r0,0(r7)
252 blr
253
254dst_error:
255 lwz r8,8(r1)
256 addi r1,r1,16
257 cmpwi cr0,r8,0
258 beqlr
259 li r0,-EFAULT
260 stw r0,0(r8)
261 blr
262
263 EX_TABLE(70b, src_error);
264 EX_TABLE(71b, dst_error);
265 EX_TABLE(72b, src_error);
266 EX_TABLE(73b, dst_error);
267 EX_TABLE(54b, dst_error);
268
269
270
271
272
273 CSUM_COPY_16_BYTES_EXCODE(0)
274
275 CSUM_COPY_16_BYTES_EXCODE(1)
276
277 CSUM_COPY_16_BYTES_EXCODE(2)
278 CSUM_COPY_16_BYTES_EXCODE(3)
279
280 CSUM_COPY_16_BYTES_EXCODE(4)
281 CSUM_COPY_16_BYTES_EXCODE(5)
282 CSUM_COPY_16_BYTES_EXCODE(6)
283 CSUM_COPY_16_BYTES_EXCODE(7)
284#endif
285#endif
286#endif
287
288 EX_TABLE(30b, src_error);
289 EX_TABLE(31b, dst_error);
290 EX_TABLE(40b, src_error);
291 EX_TABLE(41b, dst_error);
292 EX_TABLE(50b, src_error);
293 EX_TABLE(51b, dst_error);
294
295EXPORT_SYMBOL(csum_partial_copy_generic)
296