RFR: 8321001: RISC-V: C2 SignumVF [v3]

Hamlin Li mli at openjdk.org
Wed Dec 6 14:43:51 UTC 2023


On Wed, 6 Dec 2023 13:17:11 GMT, Fei Yang <fyang at openjdk.org> wrote:

>> Do you mean some patch like below?
>> 
>> diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
>> index ed421c9e287..aa82447b943 100644
>> --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
>> +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
>> @@ -1676,15 +1676,14 @@ void C2_MacroAssembler::signum_fp(FloatRegister dst, FloatRegister one, bool is_
>>    bind(done);
>>  }
>>  
>> -void C2_MacroAssembler::signum_fp_v(VectorRegister dst, BasicType bt, int vlen,
>> -                                    VectorRegister zero, VectorRegister one) {
>> +void C2_MacroAssembler::signum_fp_v(VectorRegister dst, BasicType bt, int vlen, VectorRegister one) {
>>    vsetvli_helper(bt, vlen);
>>  
>>    // check if input is -0, +0, signaling NaN or quiet NaN
>>    vfclass_v(v0, dst);
>>    mv(t0, fclass_mask::zero | fclass_mask::nan);
>>    vand_vx(v0, v0, t0);
>> -  vmseq_vv(v0, v0, zero);
>> +  vmseq_vi(v0, v0, 0);
>>  
>>    // use floating-point 1.0 with a sign of input
>>    vfsgnj_vv(dst, one, dst, v0_t);
>> diff --git a/src/hotspot/cpu/riscv/riscv_v.ad b/src/hotspot/cpu/riscv/riscv_v.ad
>> index 9b3c9125b3b..2940655f44e 100644
>> --- a/src/hotspot/cpu/riscv/riscv_v.ad
>> +++ b/src/hotspot/cpu/riscv/riscv_v.ad
>> @@ -3664,15 +3664,15 @@ instruct vexpand(vReg dst, vReg src, vRegMask_V0 v0, vReg tmp) %{
>>  
>>  // Vector Math.signum
>>  
>> -instruct vsignum_reg(vReg dst, vReg zero, vReg one, vRegMask_V0 v0) %{
>> -  match(Set dst (SignumVF dst (Binary zero one)));
>> -  match(Set dst (SignumVD dst (Binary zero one)));
>> +instruct vsignum_reg(vReg dst, vReg one, vRegMask_V0 v0) %{
>> +  match(Set dst (SignumVF dst one));
>> +  match(Set dst (SignumVD dst one));
>>    effect(TEMP_DEF dst, TEMP v0);
>>    format %{ "vsignum $dst, $dst\t" %}
>>    ins_encode %{
>>      BasicType bt = Matcher::vector_element_basic_type(this);
>>      __ signum_fp_v(as_VectorRegister($dst$$reg), bt, Matcher::vector_length(this),
>> -                  as_VectorRegister($zero$$reg), as_VectorRegister($one$$reg));
>> +                   as_VectorRegister($one$$reg));
>>    %}
>>    ins_pipe(pipe_slow);
>>  %}
>> 
>> 
>> In fact this is also my initial patch, but at runtime it will report a `mismatch` issue.
>> And in x86 and aarch64, they all have `zero` too.
>> 
>> 
>> o749  SignumVD  === _ o746 o1276  [[ o750 ]]  #vectora[4]:{double}
>> 
>> --N: o749  SignumVD  === _ o746 o1276  [[ o750 ]]  #vectora[4]:{double}
>> 
>>    --N: o746  LoadVector  === o440 o865 o697  |o250  [[...
>
> Hi, sorry for not being clear enough. In fact, I am suggesting following add-on change:
> 
> diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
> index 18b5df3f68c..b732e70ed84 100644
> --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
> +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp
> @@ -1677,15 +1677,15 @@ void C2_MacroAssembler::signum_fp(FloatRegister dst, FloatRegister one, bool is_
>    bind(done);
>  }
> 
> -void C2_MacroAssembler::signum_fp_v(VectorRegister dst, BasicType bt, int vlen,
> -                                    VectorRegister zero, VectorRegister one) {
> +void C2_MacroAssembler::signum_fp_v(VectorRegister dst, VectorRegister one,
> +                                    BasicType bt, int vlen) {
>    vsetvli_helper(bt, vlen);
> 
>    // check if input is -0, +0, signaling NaN or quiet NaN
>    vfclass_v(v0, dst);
>    mv(t0, fclass_mask::zero | fclass_mask::nan);
>    vand_vx(v0, v0, t0);
> -  vmseq_vv(v0, v0, zero);
> +  vmseq_vi(v0, v0, 0);
> 
>    // use floating-point 1.0 with a sign of input
>    vfsgnj_vv(dst, one, dst, v0_t);
> diff --git a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp
> index 0ed7c3686dc..b9a7749631a 100644
> --- a/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp
> +++ b/src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.hpp
> @@ -163,7 +163,7 @@
> 
>    void signum_fp(FloatRegister dst, FloatRegister one, bool is_double);
> 
> -  void signum_fp_v(VectorRegister dst, BasicType bt, int vlen, VectorRegister zero, VectorRegister one);
> +  void signum_fp_v(VectorRegister dst, VectorRegister one, BasicType bt, int vlen);
> 
>    // intrinsic methods implemented by rvv instructions
> 
> diff --git a/src/hotspot/cpu/riscv/riscv_v.ad b/src/hotspot/cpu/riscv/riscv_v.ad
> index 9c2349a6c92..c163325fc81 100644
> --- a/src/hotspot/cpu/riscv/riscv_v.ad
> +++ b/src/hotspot/cpu/riscv/riscv_v.ad
> @@ -3671,8 +3671,8 @@ instruct vsignum_reg(vReg dst, vReg zero, vReg one, vRegMask_V0 v0) %{
>    format %{ "vsignum $dst, $dst\t" %}
>    ins_encode %{
>      BasicType bt = Matcher::vector_element_basic_type(this);
> -    __ signum_fp_v(as_VectorRegister($dst$$reg), bt, Matcher::vector_length(this),
> -                   as_VectorRegister($zero$$reg), as_VectorRegister($one$$reg));
> +    __ signum_fp_v(as_VectorRegister($dst$$reg), as_VectorRegister($one$$reg),
> +                   bt, Matcher::vector_length(this));
>    %}
>    ins_pipe(pipe_slow);
>  %}

Good catch of the bug! Fixed.
I did not realize it before. I think the reason that tests did not catch it is because both int and float zero has the exact same binary content.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/16925#discussion_r1417432947


More information about the hotspot-compiler-dev mailing list