rf_nwayxor.c revision 1.3.8.1 1 1.3.8.1 bouyer /* $NetBSD: rf_nwayxor.c,v 1.3.8.1 2000/11/20 11:42:56 bouyer Exp $ */
2 1.1 oster /*
3 1.1 oster * Copyright (c) 1995 Carnegie-Mellon University.
4 1.1 oster * All rights reserved.
5 1.1 oster *
6 1.1 oster * Author: Mark Holland, Daniel Stodolsky
7 1.1 oster *
8 1.1 oster * Permission to use, copy, modify and distribute this software and
9 1.1 oster * its documentation is hereby granted, provided that both the copyright
10 1.1 oster * notice and this permission notice appear in all copies of the
11 1.1 oster * software, derivative works or modified versions, and any portions
12 1.1 oster * thereof, and that both notices appear in supporting documentation.
13 1.1 oster *
14 1.1 oster * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
15 1.1 oster * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
16 1.1 oster * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
17 1.1 oster *
18 1.1 oster * Carnegie Mellon requests users of this software to return to
19 1.1 oster *
20 1.1 oster * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
21 1.1 oster * School of Computer Science
22 1.1 oster * Carnegie Mellon University
23 1.1 oster * Pittsburgh PA 15213-3890
24 1.1 oster *
25 1.1 oster * any improvements or extensions that they make and grant Carnegie the
26 1.1 oster * rights to redistribute these changes.
27 1.1 oster */
28 1.1 oster
29 1.1 oster /************************************************************
30 1.1 oster *
31 1.1 oster * nwayxor.c -- code to do N-way xors for reconstruction
32 1.1 oster *
33 1.1 oster * nWayXorN xors N input buffers into the destination buffer.
34 1.1 oster * adapted from danner's longword_bxor code.
35 1.1 oster *
36 1.1 oster ************************************************************/
37 1.1 oster
38 1.1 oster #include "rf_nwayxor.h"
39 1.1 oster #include "rf_shutdown.h"
40 1.1 oster
41 1.1 oster static int callcount[10];
42 1.1 oster static void rf_ShutdownNWayXor(void *);
43 1.1 oster
44 1.3 oster static void
45 1.3 oster rf_ShutdownNWayXor(ignored)
46 1.3 oster void *ignored;
47 1.3 oster {
48 1.3 oster int i;
49 1.3 oster
50 1.3 oster if (rf_showXorCallCounts == 0)
51 1.3 oster return;
52 1.3 oster printf("Call counts for n-way xor routines: ");
53 1.3 oster for (i = 0; i < 10; i++)
54 1.3 oster printf("%d ", callcount[i]);
55 1.3 oster printf("\n");
56 1.1 oster }
57 1.1 oster
58 1.3 oster int
59 1.3 oster rf_ConfigureNWayXor(listp)
60 1.3 oster RF_ShutdownList_t **listp;
61 1.3 oster {
62 1.3 oster int i, rc;
63 1.3 oster
64 1.3 oster for (i = 0; i < 10; i++)
65 1.3 oster callcount[i] = 0;
66 1.3 oster rc = rf_ShutdownCreate(listp, rf_ShutdownNWayXor, NULL);
67 1.3 oster return (rc);
68 1.1 oster }
69 1.1 oster
70 1.3 oster void
71 1.3 oster rf_nWayXor1(src_rbs, dest_rb, len)
72 1.3 oster RF_ReconBuffer_t **src_rbs;
73 1.3 oster RF_ReconBuffer_t *dest_rb;
74 1.3 oster int len;
75 1.3 oster {
76 1.3.8.1 bouyer unsigned long *src = (unsigned long *) src_rbs[0]->buffer;
77 1.3.8.1 bouyer unsigned long *dest = (unsigned long *) dest_rb->buffer;
78 1.3.8.1 bouyer unsigned long *end = src + len;
79 1.3.8.1 bouyer unsigned long d0, d1, d2, d3, s0, s1, s2, s3;
80 1.3 oster
81 1.3 oster callcount[1]++;
82 1.3 oster while (len >= 4) {
83 1.3 oster d0 = dest[0];
84 1.3 oster d1 = dest[1];
85 1.3 oster d2 = dest[2];
86 1.3 oster d3 = dest[3];
87 1.3 oster s0 = src[0];
88 1.3 oster s1 = src[1];
89 1.3 oster s2 = src[2];
90 1.3 oster s3 = src[3];
91 1.3 oster dest[0] = d0 ^ s0;
92 1.3 oster dest[1] = d1 ^ s1;
93 1.3 oster dest[2] = d2 ^ s2;
94 1.3 oster dest[3] = d3 ^ s3;
95 1.3 oster src += 4;
96 1.3 oster dest += 4;
97 1.3 oster len -= 4;
98 1.3 oster }
99 1.3 oster while (src < end) {
100 1.3 oster *dest++ ^= *src++;
101 1.3 oster }
102 1.1 oster }
103 1.1 oster
104 1.3 oster void
105 1.3 oster rf_nWayXor2(src_rbs, dest_rb, len)
106 1.3 oster RF_ReconBuffer_t **src_rbs;
107 1.3 oster RF_ReconBuffer_t *dest_rb;
108 1.3 oster int len;
109 1.3 oster {
110 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
111 1.3.8.1 bouyer unsigned long *a = dst;
112 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
113 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
114 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
115 1.3 oster
116 1.3 oster callcount[2]++;
117 1.3 oster /* align dest to cache line */
118 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
119 1.3 oster *dst++ = *a++ ^ *b++ ^ *c++;
120 1.3 oster len--;
121 1.3 oster }
122 1.3 oster while (len > 4) {
123 1.3 oster a0 = a[0];
124 1.3 oster len -= 4;
125 1.3 oster
126 1.3 oster a1 = a[1];
127 1.3 oster a2 = a[2];
128 1.3 oster
129 1.3 oster a3 = a[3];
130 1.3 oster a += 4;
131 1.3 oster
132 1.3 oster b0 = b[0];
133 1.3 oster b1 = b[1];
134 1.3 oster
135 1.3 oster b2 = b[2];
136 1.3 oster b3 = b[3];
137 1.3 oster /* start dual issue */
138 1.3 oster a0 ^= b0;
139 1.3 oster b0 = c[0];
140 1.3 oster
141 1.3 oster b += 4;
142 1.3 oster a1 ^= b1;
143 1.3 oster
144 1.3 oster a2 ^= b2;
145 1.3 oster a3 ^= b3;
146 1.3 oster
147 1.3 oster b1 = c[1];
148 1.3 oster a0 ^= b0;
149 1.3 oster
150 1.3 oster b2 = c[2];
151 1.3 oster a1 ^= b1;
152 1.3 oster
153 1.3 oster b3 = c[3];
154 1.3 oster a2 ^= b2;
155 1.3 oster
156 1.3 oster dst[0] = a0;
157 1.3 oster a3 ^= b3;
158 1.3 oster dst[1] = a1;
159 1.3 oster c += 4;
160 1.3 oster dst[2] = a2;
161 1.3 oster dst[3] = a3;
162 1.3 oster dst += 4;
163 1.3 oster }
164 1.3 oster while (len) {
165 1.3 oster *dst++ = *a++ ^ *b++ ^ *c++;
166 1.3 oster len--;
167 1.3 oster }
168 1.1 oster }
169 1.1 oster /* note that first arg is not incremented but 2nd arg is */
170 1.1 oster #define LOAD_FIRST(_dst,_b) \
171 1.1 oster a0 = _dst[0]; len -= 4; \
172 1.1 oster a1 = _dst[1]; \
173 1.1 oster a2 = _dst[2]; \
174 1.1 oster a3 = _dst[3]; \
175 1.1 oster b0 = _b[0]; \
176 1.1 oster b1 = _b[1]; \
177 1.1 oster b2 = _b[2]; \
178 1.1 oster b3 = _b[3]; _b += 4;
179 1.1 oster
180 1.1 oster /* note: arg is incremented */
181 1.1 oster #define XOR_AND_LOAD_NEXT(_n) \
182 1.1 oster a0 ^= b0; b0 = _n[0]; \
183 1.1 oster a1 ^= b1; b1 = _n[1]; \
184 1.1 oster a2 ^= b2; b2 = _n[2]; \
185 1.1 oster a3 ^= b3; b3 = _n[3]; \
186 1.1 oster _n += 4;
187 1.1 oster
188 1.1 oster /* arg is incremented */
189 1.1 oster #define XOR_AND_STORE(_dst) \
190 1.1 oster a0 ^= b0; _dst[0] = a0; \
191 1.1 oster a1 ^= b1; _dst[1] = a1; \
192 1.1 oster a2 ^= b2; _dst[2] = a2; \
193 1.1 oster a3 ^= b3; _dst[3] = a3; \
194 1.1 oster _dst += 4;
195 1.1 oster
196 1.1 oster
197 1.3 oster void
198 1.3 oster rf_nWayXor3(src_rbs, dest_rb, len)
199 1.3 oster RF_ReconBuffer_t **src_rbs;
200 1.3 oster RF_ReconBuffer_t *dest_rb;
201 1.3 oster int len;
202 1.3 oster {
203 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
204 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
205 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
206 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
207 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
208 1.3 oster
209 1.3 oster callcount[3]++;
210 1.3 oster /* align dest to cache line */
211 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
212 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++;
213 1.3 oster len--;
214 1.3 oster }
215 1.3 oster while (len > 4) {
216 1.3 oster LOAD_FIRST(dst, b);
217 1.3 oster XOR_AND_LOAD_NEXT(c);
218 1.3 oster XOR_AND_LOAD_NEXT(d);
219 1.3 oster XOR_AND_STORE(dst);
220 1.3 oster }
221 1.3 oster while (len) {
222 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++;
223 1.3 oster len--;
224 1.3 oster }
225 1.1 oster }
226 1.1 oster
227 1.3 oster void
228 1.3 oster rf_nWayXor4(src_rbs, dest_rb, len)
229 1.3 oster RF_ReconBuffer_t **src_rbs;
230 1.3 oster RF_ReconBuffer_t *dest_rb;
231 1.3 oster int len;
232 1.3 oster {
233 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
234 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
235 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
236 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
237 1.3.8.1 bouyer unsigned long *e = (unsigned long *) src_rbs[3]->buffer;
238 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
239 1.3 oster
240 1.3 oster callcount[4]++;
241 1.3 oster /* align dest to cache line */
242 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
243 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++;
244 1.3 oster len--;
245 1.3 oster }
246 1.3 oster while (len > 4) {
247 1.3 oster LOAD_FIRST(dst, b);
248 1.3 oster XOR_AND_LOAD_NEXT(c);
249 1.3 oster XOR_AND_LOAD_NEXT(d);
250 1.3 oster XOR_AND_LOAD_NEXT(e);
251 1.3 oster XOR_AND_STORE(dst);
252 1.3 oster }
253 1.3 oster while (len) {
254 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++;
255 1.3 oster len--;
256 1.3 oster }
257 1.1 oster }
258 1.1 oster
259 1.3 oster void
260 1.3 oster rf_nWayXor5(src_rbs, dest_rb, len)
261 1.3 oster RF_ReconBuffer_t **src_rbs;
262 1.3 oster RF_ReconBuffer_t *dest_rb;
263 1.3 oster int len;
264 1.3 oster {
265 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
266 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
267 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
268 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
269 1.3.8.1 bouyer unsigned long *e = (unsigned long *) src_rbs[3]->buffer;
270 1.3.8.1 bouyer unsigned long *f = (unsigned long *) src_rbs[4]->buffer;
271 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
272 1.3 oster
273 1.3 oster callcount[5]++;
274 1.3 oster /* align dest to cache line */
275 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
276 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++;
277 1.3 oster len--;
278 1.3 oster }
279 1.3 oster while (len > 4) {
280 1.3 oster LOAD_FIRST(dst, b);
281 1.3 oster XOR_AND_LOAD_NEXT(c);
282 1.3 oster XOR_AND_LOAD_NEXT(d);
283 1.3 oster XOR_AND_LOAD_NEXT(e);
284 1.3 oster XOR_AND_LOAD_NEXT(f);
285 1.3 oster XOR_AND_STORE(dst);
286 1.3 oster }
287 1.3 oster while (len) {
288 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++;
289 1.3 oster len--;
290 1.3 oster }
291 1.1 oster }
292 1.1 oster
293 1.3 oster void
294 1.3 oster rf_nWayXor6(src_rbs, dest_rb, len)
295 1.3 oster RF_ReconBuffer_t **src_rbs;
296 1.3 oster RF_ReconBuffer_t *dest_rb;
297 1.3 oster int len;
298 1.3 oster {
299 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
300 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
301 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
302 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
303 1.3.8.1 bouyer unsigned long *e = (unsigned long *) src_rbs[3]->buffer;
304 1.3.8.1 bouyer unsigned long *f = (unsigned long *) src_rbs[4]->buffer;
305 1.3.8.1 bouyer unsigned long *g = (unsigned long *) src_rbs[5]->buffer;
306 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
307 1.3 oster
308 1.3 oster callcount[6]++;
309 1.3 oster /* align dest to cache line */
310 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
311 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++;
312 1.3 oster len--;
313 1.3 oster }
314 1.3 oster while (len > 4) {
315 1.3 oster LOAD_FIRST(dst, b);
316 1.3 oster XOR_AND_LOAD_NEXT(c);
317 1.3 oster XOR_AND_LOAD_NEXT(d);
318 1.3 oster XOR_AND_LOAD_NEXT(e);
319 1.3 oster XOR_AND_LOAD_NEXT(f);
320 1.3 oster XOR_AND_LOAD_NEXT(g);
321 1.3 oster XOR_AND_STORE(dst);
322 1.3 oster }
323 1.3 oster while (len) {
324 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++;
325 1.3 oster len--;
326 1.3 oster }
327 1.1 oster }
328 1.1 oster
329 1.3 oster void
330 1.3 oster rf_nWayXor7(src_rbs, dest_rb, len)
331 1.3 oster RF_ReconBuffer_t **src_rbs;
332 1.3 oster RF_ReconBuffer_t *dest_rb;
333 1.3 oster int len;
334 1.3 oster {
335 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
336 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
337 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
338 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
339 1.3.8.1 bouyer unsigned long *e = (unsigned long *) src_rbs[3]->buffer;
340 1.3.8.1 bouyer unsigned long *f = (unsigned long *) src_rbs[4]->buffer;
341 1.3.8.1 bouyer unsigned long *g = (unsigned long *) src_rbs[5]->buffer;
342 1.3.8.1 bouyer unsigned long *h = (unsigned long *) src_rbs[6]->buffer;
343 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
344 1.3 oster
345 1.3 oster callcount[7]++;
346 1.3 oster /* align dest to cache line */
347 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
348 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++ ^ *h++;
349 1.3 oster len--;
350 1.3 oster }
351 1.3 oster while (len > 4) {
352 1.3 oster LOAD_FIRST(dst, b);
353 1.3 oster XOR_AND_LOAD_NEXT(c);
354 1.3 oster XOR_AND_LOAD_NEXT(d);
355 1.3 oster XOR_AND_LOAD_NEXT(e);
356 1.3 oster XOR_AND_LOAD_NEXT(f);
357 1.3 oster XOR_AND_LOAD_NEXT(g);
358 1.3 oster XOR_AND_LOAD_NEXT(h);
359 1.3 oster XOR_AND_STORE(dst);
360 1.3 oster }
361 1.3 oster while (len) {
362 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++ ^ *h++;
363 1.3 oster len--;
364 1.3 oster }
365 1.1 oster }
366 1.1 oster
367 1.3 oster void
368 1.3 oster rf_nWayXor8(src_rbs, dest_rb, len)
369 1.3 oster RF_ReconBuffer_t **src_rbs;
370 1.3 oster RF_ReconBuffer_t *dest_rb;
371 1.3 oster int len;
372 1.3 oster {
373 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
374 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
375 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
376 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
377 1.3.8.1 bouyer unsigned long *e = (unsigned long *) src_rbs[3]->buffer;
378 1.3.8.1 bouyer unsigned long *f = (unsigned long *) src_rbs[4]->buffer;
379 1.3.8.1 bouyer unsigned long *g = (unsigned long *) src_rbs[5]->buffer;
380 1.3.8.1 bouyer unsigned long *h = (unsigned long *) src_rbs[6]->buffer;
381 1.3.8.1 bouyer unsigned long *i = (unsigned long *) src_rbs[7]->buffer;
382 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
383 1.3 oster
384 1.3 oster callcount[8]++;
385 1.3 oster /* align dest to cache line */
386 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
387 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++ ^ *h++ ^ *i++;
388 1.3 oster len--;
389 1.3 oster }
390 1.3 oster while (len > 4) {
391 1.3 oster LOAD_FIRST(dst, b);
392 1.3 oster XOR_AND_LOAD_NEXT(c);
393 1.3 oster XOR_AND_LOAD_NEXT(d);
394 1.3 oster XOR_AND_LOAD_NEXT(e);
395 1.3 oster XOR_AND_LOAD_NEXT(f);
396 1.3 oster XOR_AND_LOAD_NEXT(g);
397 1.3 oster XOR_AND_LOAD_NEXT(h);
398 1.3 oster XOR_AND_LOAD_NEXT(i);
399 1.3 oster XOR_AND_STORE(dst);
400 1.3 oster }
401 1.3 oster while (len) {
402 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++ ^ *h++ ^ *i++;
403 1.3 oster len--;
404 1.3 oster }
405 1.1 oster }
406 1.1 oster
407 1.1 oster
408 1.3 oster void
409 1.3 oster rf_nWayXor9(src_rbs, dest_rb, len)
410 1.3 oster RF_ReconBuffer_t **src_rbs;
411 1.3 oster RF_ReconBuffer_t *dest_rb;
412 1.3 oster int len;
413 1.3 oster {
414 1.3.8.1 bouyer unsigned long *dst = (unsigned long *) dest_rb->buffer;
415 1.3.8.1 bouyer unsigned long *b = (unsigned long *) src_rbs[0]->buffer;
416 1.3.8.1 bouyer unsigned long *c = (unsigned long *) src_rbs[1]->buffer;
417 1.3.8.1 bouyer unsigned long *d = (unsigned long *) src_rbs[2]->buffer;
418 1.3.8.1 bouyer unsigned long *e = (unsigned long *) src_rbs[3]->buffer;
419 1.3.8.1 bouyer unsigned long *f = (unsigned long *) src_rbs[4]->buffer;
420 1.3.8.1 bouyer unsigned long *g = (unsigned long *) src_rbs[5]->buffer;
421 1.3.8.1 bouyer unsigned long *h = (unsigned long *) src_rbs[6]->buffer;
422 1.3.8.1 bouyer unsigned long *i = (unsigned long *) src_rbs[7]->buffer;
423 1.3.8.1 bouyer unsigned long *j = (unsigned long *) src_rbs[8]->buffer;
424 1.3 oster unsigned long a0, a1, a2, a3, b0, b1, b2, b3;
425 1.3 oster
426 1.3 oster callcount[9]++;
427 1.3 oster /* align dest to cache line */
428 1.3 oster while ((((unsigned long) dst) & 0x1f)) {
429 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++ ^ *h++ ^ *i++ ^ *j++;
430 1.3 oster len--;
431 1.3 oster }
432 1.3 oster while (len > 4) {
433 1.3 oster LOAD_FIRST(dst, b);
434 1.3 oster XOR_AND_LOAD_NEXT(c);
435 1.3 oster XOR_AND_LOAD_NEXT(d);
436 1.3 oster XOR_AND_LOAD_NEXT(e);
437 1.3 oster XOR_AND_LOAD_NEXT(f);
438 1.3 oster XOR_AND_LOAD_NEXT(g);
439 1.3 oster XOR_AND_LOAD_NEXT(h);
440 1.3 oster XOR_AND_LOAD_NEXT(i);
441 1.3 oster XOR_AND_LOAD_NEXT(j);
442 1.3 oster XOR_AND_STORE(dst);
443 1.3 oster }
444 1.3 oster while (len) {
445 1.3 oster *dst++ ^= *b++ ^ *c++ ^ *d++ ^ *e++ ^ *f++ ^ *g++ ^ *h++ ^ *i++ ^ *j++;
446 1.3 oster len--;
447 1.3 oster }
448 1.1 oster }
449