#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;
}
}
Copyright © 1994 - 2018 Linux Journal. All rights reserved.