On 20 April 2006 17:01, Olivier Galibert wrote: > On Thu, Apr 20, 2006 at 04:52:14PM +0100, Dave Korn wrote: >> Yet it would seem to me at first glance that, since dividing unsigned by >> an exact power-of-2 can be optimised to a right shift, and since we can >> deduce that (1 << bpp) is always going to be a power-of-2 > > Isn't that true only if bpp is small enough? OTOH, on big bpp we're > probably straight into undefined territory so it may not matter.
Indeed, the reason that shifting by amounts > word-size # of bits is undefined is specifically /so/ that these sorts of optimisations can be allowed without having to code range checks around them. > But > still, it changes an expected divide-by-zero on some cpus and > divide-by-one on others by a zero return, which may be surprising. Ah, avoiding the danger of divide-by-zero causing an exception/trap may well turn out to be the reason. Thanks for the thought. > I suspect the divide-by-shift is hidden behind a bazillion macros, > right? Only that would explain that a human could write such code :-) Nope, it's a divide by (2 << function arg). The various constants (32 * 1/2/4) are macros, but the "/ (2 << bpp)" is literal. cheers, DaveK -- Can't think of a witty .sigline today....