#define CAT(v,x) ((u_long)(v)<<8 | (x)) #define VEC(x) CAT(CAT(CAT(CAT(CAT(CAT(CAT(x,x),x),x),x),x),x),x) void byte_avg2 (u_long size, u_char *ca, u_char *cb, u_char *cc) { u_long *a = (u_long*) ca; u_long *b = (u_long*) cb; u_long *c = (u_long*) cc; u_long A0 = a[0], B0 = b[0], A1, B1, CC, i, count = size / sizeof(u_long); for (i = 1; i < count; ) { A1 = a[i]; /* read ahead */ B1 = b[i]; ++i; CC = (A0 & B0) & VEC(0x01); A0 = (A0 >> 1) & VEC(0x7f); B0 = (B0 >> 1) & VEC(0x7f); c[i - 2] = A0 + B0 + CC; /* read ahead */ A0 = a[i]; B0 = b[i]; ++i; CC = (A1 & B1) & VEC(0x01); A1 = (A1 >> 1) & VEC(0x7f); B1 = (B1 >> 1) & VEC(0x7f); c[i - 2] = A1 + B1 + CC; } }