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