### Question 20.35

What is ``Duff's Device''?

It's a devastatingly deviously unrolled byte-copying loop, devised by Tom Duff while he was at Lucasfilm. In its ``classic'' form, it looks like:

    	register n = (count + 7) / 8;	/* count > 0 assumed */
    	switch (count % 8)
    	{
    	case 0:	   do { *to = *from++;
    	case 7:		*to = *from++;
    	case 6:		*to = *from++;
    	case 5:		*to = *from++;
    	case 4:		*to = *from++;
    	case 3:		*to = *from++;
    	case 2:		*to = *from++;
    	case 1:		*to = *from++;
    		      } while (--n > 0);
    	}

where `count` bytes are to be copied from the array pointed to by `from` to the memory location pointed to by `to` (which is a memory-mapped device output register, which is why `to` isn't incremented). It solves the problem of handling the leftover bytes (when `count` isn't a multiple of 8) by interleaving a `switch` statement with the loop which copies bytes 8 at a time. (Believe it or not, it is legal to have `case` labels buried within blocks nested in a `switch` statement like this. In his announcement of the technique to C's developers and the world, Duff noted that C's `switch` syntax, in particular its ``fall through'' behavior, had long been controversial, and that ``This code forms some sort of argument in that debate, but I'm not sure whether it's for or against.'')

Read sequentially: prev next up top

This page by Steve Summit // Copyright 1995 // mail feedback