Original Version
Straightforward code to copy items from an array to a memory-mapped output register might look like this:
do { /* count > 0 assumed */ *to = *from++; /* Note that the 'to' pointer is NOT incremented */ } while(--count > 0);Note that this is not a memory-to-memory copy, in which you would see *to++.
While optimizing this, Duff realized that an unrolled version of his loop could be implemented by interlacing the structures of a switch and a loop.
send(to, from, count) register short *to, *from; register count; { register n = (count + 7) / 8; 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); } }Notice that Duff's device can just as easily be applied with any other size for the unrolled loop, not just 8.
Read more about this topic: Duff's Device
Famous quotes containing the words original and/or version:
“The Jew is neither a newcomer nor an alien in this country or on this continent; his Americanism is as original and ancient as that of any race or people with the exception of the American Indian and other aborigines. He came in the caravels of Columbus, and he knocked at the gates of New Amsterdam only thirty-five years after the Pilgrim Fathers stepped ashore on Plymouth Rock.”
—Oscar Solomon Straus (18501926)
“If the only new thing we have to offer is an improved version of the past, then today can only be inferior to yesterday. Hypnotised by images of the past, we risk losing all capacity for creative change.”
—Robert Hewison (b. 1943)