Herbert Xu <[EMAIL PROTECTED]> writes:
> But your code differs significantly from Stephen's version.
> However, if it is correct it does look like a good improvement.
>
> So please write a simple test program. It can't that bad since
> there are only 65536 values to test :)
I think the code is simple enough to see immediately that it should
calculate the same checksum. But I have written a short test program
to show this and tested it on i686 (gcc-4.2.2) and powerpc (gcc-3.4.5)
without optimization and with -O6.
BTW, shouldn't unsigned long be replaced by unsigned int to avoid
64-bit operations one some platforms?
urs
#include <stdio.h>
unsigned long f1(unsigned long sum)
{
sum <<= 1;
if (sum & 0x10000) {
sum++;
sum &= 0xffff;
}
return sum;
}
unsigned long f2(unsigned long sum)
{
sum = ((sum & 0x8000)>>15) | ((sum & 0x7fff)<<1);
return sum;
}
int main()
{
unsigned long s;
for (s = 0; s < 65536; s++) {
if (f1(s) != f2(s) || f1(s) > 65535)
printf("%ld\n", s);
}
return 0;
}
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html