On 2018-05-17 22:44, Ivan Gerasimov wrote:
The following variant showed slightly better performance on my machine:
static final int numberOfLeadingZeros(int i) {
if (i <= 0)
return i == 0 ? 32 : 0;
int n = 31;
if (i >= 1 << 16) { n -= 16; i >>>= 16; }
if (i >= 1 << 8) { n -= 8; i >>>= 8; }
if (i >= 1 << 4) { n -= 4; i >>>= 4; }
if (i >= 1 << 2) { n -= 2; i >>>= 2; }
return n - (i >>> 1);
}
Nice, this version also wins on all of -Xint and
-XX:TieredStopAtLevel=1-3 (my version lost out slightly versus
the baseline on -Xint), so is potentially a startup enhancement even on
platforms with C2 intrinsics.
I agree that improving Java implementation of numberOfLeadingZeros()
can be done as a separate RFE.
I filed https://bugs.openjdk.java.net/browse/JDK-8203352 for this.
/Claes