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

Fei Yang fyang at openjdk.org
Wed Dec 6 13:48:37 UTC 2023


On Wed, 6 Dec 2023 11:33:40 GMT, Hamlin Li <mli at openjdk.org> wrote:

>> src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp line 1687:
>> 
>>> 1685:   mv(t0, fclass_mask::zero | fclass_mask::nan);
>>> 1686:   vand_vx(v0, v0, t0);
>>> 1687:   vmseq_vv(v0, v0, zero);
>> 
>> I don't think that the input `zero` (a vector of floating-point 0.0) is appropriate here for `vmseq_vv` which does vector integer comparison. Why not do `vmseq_vi(v0, v0, 0)` instead? This will also help remove the `zero` parameter of this function.
>
> 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  [[ o749 ]]  @double[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=6; mismatched #vectora[...

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);
 %}

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

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


More information about the hotspot-compiler-dev mailing list