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:
“All nationalisms are at heart deeply concerned with names: with the most immaterial and original human invention. Those who dismiss names as a detail have never been displaced; but the peoples on the peripheries are always being displaced. That is why they insist upon their continuitytheir links with their dead and the unborn.”
—John Berger (b. 1926)
“I should think that an ordinary copy of the King James version would have been good enough for those Congressmen.”
—Calvin Coolidge (18721933)