[ros-dev] ping Alex regarding log2() for scheduler
Royce Mitchell III
royce3 at ev1.net
Wed Mar 23 12:23:17 CET 2005
Alex,
I managed to shave off another comparison in favor of a shift:
int highest_bit ( int i )
{
int ret = 0;
if ( i > 0xffff )
i >>= 16, ret = 16;
if ( i > 0xff )
i >>= 8, ret += 8;
if ( i > 0xf )
i >>= 4, ret += 4;
if ( i > 0x3 )
i >>= 2, ret += 2;
return ret + (i>>1);
}
FWIW, rdtsc reports that compile for speed is 2x as fast as compile for
size.
I've thought about ways to possibly optimize pipeline throughput for
this, but too many of the calculations depend on results of immediately
previous calculations to get any real advantage.
Here's updated micro-code for BSR, if you really think AMD & Intel will
actually do it...
IF r/m = 0
THEN
ZF := 1;
register := UNDEFINED;
ELSE
ZF := 0;
register := 0;
temp := r/m;
IF OperandSize = 32 THEN
IF (temp & 0xFFFF0000) != 0 THEN
temp >>= 16;
register |= 16;
FI;
FI;
IF (temp & 0xFF00) != 0 THEN
temp >>= 8;
register |= 8;
FI;
IF (temp & 0xF0) != 0 THEN
temp >>= 4;
register |= 4;
FI;
IF (temp & 0xC) != 0 THEN
temp >>= 2;
register |= 2;
FI;
register |= (temp>>1);
FI;
More information about the Ros-dev
mailing list