RFR: 8238669: Long.divideUnsigned is extremely slow for certain values (Needs to be Intrinsic)

Éamonn McManus github.com+5246810+eamonnmcmanus at openjdk.java.net
Tue Sep 8 20:33:03 UTC 2020


On Sun, 6 Sep 2020 15:25:10 GMT, rgiulietti <github.com+70726043+rgiulietti at openjdk.org> wrote:

> This is a follow-up of the Mercurial-based workflow initiated on the core-lib-devs mailing list [0]. Not sure if this
> one is strictly necessary or if the patches sent on the list are sufficient. Anyway, I exploit this PR as a test ;-)
> [0] https://mail.openjdk.java.net/pipermail/core-libs-dev/2020-September/068474.html

src/java.base/share/classes/java/lang/Long.java line 1697:

> 1695:             final long q = (dividend >>> 1) / divisor << 1;
> 1696:             final long r = dividend - q * divisor;
> 1697:             return r - (~(r - divisor) >> Long.SIZE - 1 & divisor);

Parentheses would be particularly helpful here. I'd certainly have to think hard about the relative precedences of
`>>`, `-`, and `&`, whereas I wouldn't have to with: return r - ((~(r - divisor) >> (Long.SIZE - 1)) & divisor);

I also think it would be worth adding a comment saying that this is deliberately `>>` not `>>>`, even though we have
`>>>` in the divide method. Here we're propagating the sign bit so that `thing & divisor` is either 0 or `divisor`
according as `thing` is –1 or 0.

-------------

PR: https://git.openjdk.java.net/jdk/pull/31


More information about the core-libs-dev mailing list