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
