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

Vladimir Ivanov vlivanov at openjdk.java.net
Tue Mar 16 18:21:12 UTC 2021


On Wed, 10 Mar 2021 17:56:25 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>
>
> Marcus G K Williams has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Refactor BMI2.java based on review
>   
>   Signed-off-by: Marcus G K Williams <marcus.williams at intel.com>

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

> 3177: %}
> 3178: 
> 3179: // Int Immediate: power of 2, positive

The comment is misleading: it's not a 2^n, but 2^n-1.

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

> 3181: %{
> 3182:   predicate((n->get_int() != 0)
> 3183:             && ((n->get_int() & 0xc0000000) == 0)

Why do you use `& 0xc0000000` and not `& 0x80000000` (or even `n->get_int() > 0`)?

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

> 9176:   format %{ "bzhiq $dst, $src, $mask \t# using $tmp as TEMP, int & immI_bitmask -> long" %}
> 9177:   ins_encode %{
> 9178:     assert(VM_Version::supports_bmi2(), "required");

The assert is redundant here. The predicate already guarantees that invariant.

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

> 3178: 
> 3179: // Int Immediate: power of 2, positive
> 3180: operand immI_bitmask()

`immI_bitmask` doesn't say much. What about `immI_Pow2M1`?

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

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


More information about the hotspot-compiler-dev mailing list