crc32() optimization

Wolfgang Denk wd at denx.de
Sun Nov 10 16:00:03 EST 2002


In message <006901c288f4$79e2ce20$0200a8c0 at telia.com> you wrote:
> 
> What's "Duff's Device"?

It's a tricky way to implement general loop unrolling directly in  C.
Applied  to your problem, code that looks like this (instead of 8 any
other loop count may be used, but  you  need  to  adjust  the  "case"
statements then):

	register int n = (len + (8-1)) / 8;

	switch (len % 8) {
	case 0: do {	val = crc32_table ... ;
	case 7:		val = crc32_table ... ;
	case 6:		val = crc32_table ... ;
	case 5:		val = crc32_table ... ;
	case 4:		val = crc32_table ... ;
	case 3:		val = crc32_table ... ;
	case 2:		val = crc32_table ... ;
	case 1:		val = crc32_table ... ;
		} while (--n > 0);
	}

BTW: this is strictly legal ANSI C!

For an explanation see http://www.lysator.liu.se/c/duffs-device.html

Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-4596-87  Fax: (+49)-8142-4596-88  Email: wd at denx.de
See us @ electronica 2002 in Munich, Nov 12-15, Hall A3, Booth A3.325 




More information about the linux-mtd mailing list