RFR: 8261671: X86 I2L conversion can be skipped for certain masked positive values

Florian Weimer fweimer at openjdk.java.net
Tue Feb 16 17:10:44 UTC 2021


On Tue, 16 Feb 2021 16:13:48 GMT, Marcus G K Williams <github.com+168222+mgkwill at openjdk.org> wrote:

> 8261671: X86 I2L conversion can be skipped for certain masked positive values
> 
> For the following expression:
>  (long)(value & mask)
> Where value is of int type and mask is constant (power of two – 1), we can directly generate bzhi instruction to zero the upper bits instead of doing an andl, followed by movslq
> 
> Before:
> Benchmark Mode Cnt Score Error Units
> SkipIntToLongCast.skipMaskedSmallPositiveCast avgt 15 10.679 ± 1.496 ns/op
> 
> 
> After:
> Benchmark Mode Cnt Score Error Units
> SkipIntToLongCast.skipMaskedSmallPositiveCast avgt 15 7.870 ± 0.067 ns/op
> 
> Signed-off-by: Marcus G K Williams <marcus.williams at intel.com>

src/hotspot/cpu/x86/x86_64.ad line 9172:

> 9170: instruct convI2LAndI_reg_immIbitmask(rRegL dst, rRegI src, immI_bitmask mask, rRegI tmp, rFlagsReg cr)
> 9171: %{
> 9172:   predicate(VM_Version::supports_bmi2());

Agner's optimization guide says that BZHI uses microcode on Zen 2 and earlier, so perhaps the predicate should reflect that?

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

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


More information about the hotspot-compiler-dev mailing list