committed, thanks :)

On Fri, Dec 13, 2024 at 8:39 PM Jiawei <jia...@iscas.ac.cn> wrote:
>
> Update implementation of Xsfvfnrclip, using return type as iterator.
>
> gcc/ChangeLog:
>
>         * config/riscv/genrvv-type-indexer.cc (expand_floattype): New func.
>         (main): New type.
>         * config/riscv/riscv-vector-builtins-types.def (DEF_RVV_XFQF_OPS): 
> New def.
>         (vint8mf8_t): Ditto.
>         (vint8mf4_t): Ditto.
>         (vint8mf2_t): Ditto.
>         (vint8m1_t): Ditto.
>         (vint8m2_t): Ditto.
>         * config/riscv/riscv-vector-builtins.cc (DEF_RVV_XFQF_OPS): Ditto.
>         (rvv_arg_type_info::get_xfqf_float_type): Ditto.
>         * config/riscv/riscv-vector-builtins.def (xfqf_vector): Ditto.
>         (xfqf_float): Ditto.
>         * config/riscv/riscv-vector-builtins.h
>         *(struct rvv_arg_type_info): New function prototype.
>         * config/riscv/sifive-vector.md: Update iterator.
>         * config/riscv/vector-iterators.md: Ditto.
>
> ---
>  gcc/config/riscv/genrvv-type-indexer.cc       | 17 ++++++++++
>  .../riscv/riscv-vector-builtins-types.def     | 13 ++++++++
>  gcc/config/riscv/riscv-vector-builtins.cc     | 33 +++++++++++++++----
>  gcc/config/riscv/riscv-vector-builtins.def    |  4 ++-
>  gcc/config/riscv/riscv-vector-builtins.h      |  1 +
>  gcc/config/riscv/sifive-vector.md             | 10 +++---
>  gcc/config/riscv/vector-iterators.md          | 25 +++++++-------
>  7 files changed, 78 insertions(+), 25 deletions(-)
>
> diff --git a/gcc/config/riscv/genrvv-type-indexer.cc 
> b/gcc/config/riscv/genrvv-type-indexer.cc
> index e1eee34237a..a2974269adc 100644
> --- a/gcc/config/riscv/genrvv-type-indexer.cc
> +++ b/gcc/config/riscv/genrvv-type-indexer.cc
> @@ -164,6 +164,18 @@ floattype (unsigned sew, int lmul_log2)
>    return mode.str ();
>  }
>
> +std::string
> +expand_floattype (unsigned sew, int lmul_log2, unsigned nf)
> +{
> +  if (sew != 8 || nf!= 1
> +      || (!valid_type (sew * 4, lmul_log2 + 2, /*float_t*/ true)))
> +    return "INVALID";
> +
> +  std::stringstream mode;
> +  mode << "vfloat" << sew * 4 << to_lmul (lmul_log2 + 2) << "_t";
> +  return mode.str ();
> +}
> +
>  std::string
>  floattype (unsigned sew, int lmul_log2, unsigned nf)
>  {
> @@ -276,6 +288,7 @@ main (int argc, const char **argv)
>        fprintf (fp, "  /*QLMUL1*/ INVALID,\n");
>        fprintf (fp, "  /*QLMUL1_SIGNED*/ INVALID,\n");
>        fprintf (fp, "  /*QLMUL1_UNSIGNED*/ INVALID,\n");
> +      fprintf (fp, "  /*XFQF*/ INVALID,\n");
>        for (unsigned eew : {8, 16, 32, 64})
>         fprintf (fp, "  /*EEW%d_INTERPRET*/ INVALID,\n", eew);
>
> @@ -384,6 +397,8 @@ main (int argc, const char **argv)
>                      inttype (8, /*lmul_log2*/ 0, false).c_str ());
>             fprintf (fp, "  /*QLMUL1_UNSIGNED*/ %s,\n",
>                      inttype (8, /*lmul_log2*/ 0, true).c_str ());
> +           fprintf (fp, "  /*XFQF*/ %s,\n",
> +                    expand_floattype (sew, lmul_log2, nf).c_str ());
>             for (unsigned eew : {8, 16, 32, 64})
>               {
>                 if (eew == sew)
> @@ -473,6 +488,7 @@ main (int argc, const char **argv)
>                  bfloat16_wide_type (/*lmul_log2*/ 0).c_str ());
>         fprintf (fp, "  /*QLMUL1_SIGNED*/ INVALID,\n");
>         fprintf (fp, "  /*QLMUL1_UNSIGNED*/ INVALID,\n");
> +       fprintf (fp, "  /*XFQF*/ INVALID,\n");
>         for (unsigned eew : {8, 16, 32, 64})
>           fprintf (fp, "  /*EEW%d_INTERPRET*/ INVALID,\n", eew);
>
> @@ -558,6 +574,7 @@ main (int argc, const char **argv)
>                    floattype (sew / 4, /*lmul_log2*/ 0).c_str ());
>           fprintf (fp, "  /*QLMUL1_SIGNED*/ INVALID,\n");
>           fprintf (fp, "  /*QLMUL1_UNSIGNED*/ INVALID,\n");
> +         fprintf (fp, "  /*XFQF*/ INVALID,\n");
>           for (unsigned eew : {8, 16, 32, 64})
>             fprintf (fp, "  /*EEW%d_INTERPRET*/ INVALID,\n", eew);
>
> diff --git a/gcc/config/riscv/riscv-vector-builtins-types.def 
> b/gcc/config/riscv/riscv-vector-builtins-types.def
> index 96412bfd1a5..df55b6a8823 100644
> --- a/gcc/config/riscv/riscv-vector-builtins-types.def
> +++ b/gcc/config/riscv/riscv-vector-builtins-types.def
> @@ -363,6 +363,12 @@ along with GCC; see the file COPYING3. If not see
>  #define DEF_RVV_QMACC_OPS(TYPE, REQUIRE)
>  #endif
>
> +/* Use "DEF_RVV_XFQF_OPS" macro include signed integer which will
> +   be iterated and registered as intrinsic functions.  */
> +#ifndef DEF_RVV_XFQF_OPS
> +#define DEF_RVV_XFQF_OPS(TYPE, REQUIRE)
> +#endif
> +
>  DEF_RVV_I_OPS (vint8mf8_t, RVV_REQUIRE_MIN_VLEN_64)
>  DEF_RVV_I_OPS (vint8mf4_t, 0)
>  DEF_RVV_I_OPS (vint8mf2_t, 0)
> @@ -1451,6 +1457,12 @@ DEF_RVV_QMACC_OPS (vint32m2_t, 0)
>  DEF_RVV_QMACC_OPS (vint32m4_t, 0)
>  DEF_RVV_QMACC_OPS (vint32m8_t, 0)
>
> +DEF_RVV_XFQF_OPS (vint8mf8_t, 0)
> +DEF_RVV_XFQF_OPS (vint8mf4_t, 0)
> +DEF_RVV_XFQF_OPS (vint8mf2_t, 0)
> +DEF_RVV_XFQF_OPS (vint8m1_t, 0)
> +DEF_RVV_XFQF_OPS (vint8m2_t, 0)
> +
>  #undef DEF_RVV_I_OPS
>  #undef DEF_RVV_U_OPS
>  #undef DEF_RVV_F_OPS
> @@ -1506,3 +1518,4 @@ DEF_RVV_QMACC_OPS (vint32m8_t, 0)
>  #undef DEF_RVV_CRYPTO_SEW64_OPS
>  #undef DEF_RVV_F32_OPS
>  #undef DEF_RVV_QMACC_OPS
> +#undef DEF_RVV_XFQF_OPS
> diff --git a/gcc/config/riscv/riscv-vector-builtins.cc 
> b/gcc/config/riscv/riscv-vector-builtins.cc
> index b9b9d33adab..37c9f71fa85 100644
> --- a/gcc/config/riscv/riscv-vector-builtins.cc
> +++ b/gcc/config/riscv/riscv-vector-builtins.cc
> @@ -551,6 +551,12 @@ static const rvv_type_info qmacc_ops[] = {
>  #include "riscv-vector-builtins-types.def"
>    {NUM_VECTOR_TYPES, 0}};
>
> +/* A list of signed integer will be registered for intrinsic functions. */
> +static const rvv_type_info xfqf_ops[] = {
> +#define DEF_RVV_XFQF_OPS(TYPE, REQUIRE) {VECTOR_TYPE_##TYPE, REQUIRE},
> +#include "riscv-vector-builtins-types.def"
> +  {NUM_VECTOR_TYPES, 0}};
> +
>  static CONSTEXPR const rvv_arg_type_info rvv_arg_type_info_end
>    = rvv_arg_type_info (NUM_BASE_TYPES);
>
> @@ -720,7 +726,8 @@ static CONSTEXPR const rvv_arg_type_info shift_wv_args[]
>       rvv_arg_type_info_end};
>
>  static CONSTEXPR const rvv_arg_type_info clip_args[]
> -  = {rvv_arg_type_info (RVV_BASE_vector), rvv_arg_type_info 
> (RVV_BASE_scalar),
> +  = {rvv_arg_type_info (RVV_BASE_xfqf_vector),
> +     rvv_arg_type_info (RVV_BASE_xfqf_float),
>       rvv_arg_type_info_end};
>
>  /* A list of args for vector_type func (vector_type) function.  */
> @@ -2549,17 +2556,17 @@ static CONSTEXPR const rvv_op_info 
> i_narrow_shift_vwx_ops
>  /* A static operand information for double demote type func (vector_type,
>   * shift_type) function registration. */
>  static CONSTEXPR const rvv_op_info u_clip_qf_ops
> -  = {f32_ops,                                /* Types */
> +  = {xfqf_ops,                               /* Types */
>       OP_TYPE_none,                           /* Suffix */
> -     rvv_arg_type_info (RVV_BASE_eew8_index), /* Return type */
> +     rvv_arg_type_info (RVV_BASE_unsigned_vector), /* Return type */
>       clip_args /* Args */};
>
>  /* A static operand information for double demote type func (vector_type,
>   * shift_type) function registration. */
>  static CONSTEXPR const rvv_op_info i_clip_qf_ops
> -  = {f32_ops,                                       /* Types */
> +  = {xfqf_ops,                                      /* Types */
>       OP_TYPE_none,                                  /* Suffix */
> -     rvv_arg_type_info (RVV_BASE_signed_eew8_index), /* Return type */
> +     rvv_arg_type_info (RVV_BASE_vector), /* Return type */
>       clip_args /* Args */};
>
>  /* A static operand information for double demote type func (vector_type,
> @@ -3008,7 +3015,7 @@ static CONSTEXPR const function_type_info 
> function_types[] = {
>    QUAD_FIX_UNSIGNED, OCT_TRUNC, DOUBLE_TRUNC_SCALAR, DOUBLE_TRUNC_SIGNED,    
>   \
>    DOUBLE_TRUNC_UNSIGNED, DOUBLE_TRUNC_UNSIGNED_SCALAR,                       
>   \
>    DOUBLE_TRUNC_BFLOAT_SCALAR, DOUBLE_TRUNC_BFLOAT, DOUBLE_TRUNC_FLOAT, 
> FLOAT,  \
> -  LMUL1, WLMUL1, QLMUL1, QLMUL1_SIGNED, QLMUL1_UNSIGNED, EEW8_INTERPRET,     
>   \
> +  LMUL1, WLMUL1, QLMUL1, QLMUL1_SIGNED, QLMUL1_UNSIGNED, XFQF, 
> EEW8_INTERPRET, \
>    EEW16_INTERPRET, EEW32_INTERPRET, EEW64_INTERPRET, BOOL1_INTERPRET,        
>   \
>    BOOL2_INTERPRET, BOOL4_INTERPRET, BOOL8_INTERPRET, BOOL16_INTERPRET,       
>   \
>    BOOL32_INTERPRET, BOOL64_INTERPRET, SIGNED_EEW8_LMUL1_INTERPRET,           
>   \
> @@ -3060,6 +3067,7 @@ static CONSTEXPR const function_type_info 
> function_types[] = {
>      VECTOR_TYPE_##QLMUL1,                                                    
>   \
>      VECTOR_TYPE_##QLMUL1_SIGNED,                                             
>   \
>      VECTOR_TYPE_##QLMUL1_UNSIGNED,                                           
>   \
> +    VECTOR_TYPE_##XFQF,                                                      
>   \
>      VECTOR_TYPE_##EEW8_INTERPRET,                                            
>   \
>      VECTOR_TYPE_##EEW16_INTERPRET,                                           
>   \
>      VECTOR_TYPE_##EEW32_INTERPRET,                                           
>   \
> @@ -3579,6 +3587,19 @@ rvv_arg_type_info::get_scalar_const_ptr_type 
> (vector_type_index type_idx) const
>      return builtin_types[type_idx].scalar_const_ptr;
>  }
>
> +tree
> +rvv_arg_type_info::get_xfqf_float_type (vector_type_index type_idx) const
> +{
> +  /* Convert vint8 types into float types.
> +     Note:
> +     - According to riscv-vector-builtins-types.def, the index of an unsigned
> +       type is always one greater than its corresponding signed type.  */
> +  if (type_idx >= VECTOR_TYPE_vint8mf8_t && type_idx <= 
> VECTOR_TYPE_vuint8m2_t)
> +    return builtin_types[VECTOR_TYPE_vfloat32m1_t].scalar;
> +  else
> +    return NULL_TREE;
> +}
> +
>  vector_type_index
>  rvv_arg_type_info::get_function_type_index (vector_type_index type_idx) const
>  {
> diff --git a/gcc/config/riscv/riscv-vector-builtins.def 
> b/gcc/config/riscv/riscv-vector-builtins.def
> index 5359490d464..bfb42cef59c 100644
> --- a/gcc/config/riscv/riscv-vector-builtins.def
> +++ b/gcc/config/riscv/riscv-vector-builtins.def
> @@ -75,7 +75,7 @@ along with GCC; see the file COPYING3.  If not see
>    QUAD_FIX_UNSIGNED, OCT_TRUNC, DOUBLE_TRUNC_SCALAR, DOUBLE_TRUNC_SIGNED,    
>   \
>    DOUBLE_TRUNC_UNSIGNED, DOUBLE_TRUNC_UNSIGNED_SCALAR,                       
>   \
>    DOUBLE_TRUNC_BFLOAT_SCALAR, DOUBLE_TRUNC_BFLOAT, DOUBLE_TRUNC_FLOAT, 
> FLOAT,  \
> -  LMUL1, WLMUL1, QLMUL1, QLMUL1_SIGNED, QLMUL1_UNSIGNED, EEW8_INTERPRET,     
>   \
> +  LMUL1, WLMUL1, QLMUL1, QLMUL1_SIGNED, QLMUL1_UNSIGNED, XFQF, 
> EEW8_INTERPRET, \
>    EEW16_INTERPRET, EEW32_INTERPRET, EEW64_INTERPRET, BOOL1_INTERPRET,        
>   \
>    BOOL2_INTERPRET, BOOL4_INTERPRET, BOOL8_INTERPRET, BOOL16_INTERPRET,       
>   \
>    BOOL32_INTERPRET, BOOL64_INTERPRET, SIGNED_EEW8_LMUL1_INTERPRET,           
>   \
> @@ -700,6 +700,7 @@ DEF_RVV_BASE_TYPE (widen_lmul1_vector, get_vector_type 
> (type_idx))
>  DEF_RVV_BASE_TYPE (quad_lmul1_vector, get_vector_type (type_idx))
>  DEF_RVV_BASE_TYPE (quad_lmul1_signed_vector, get_vector_type (type_idx))
>  DEF_RVV_BASE_TYPE (quad_lmul1_unsigned_vector, get_vector_type (type_idx))
> +DEF_RVV_BASE_TYPE (xfqf_vector, get_vector_type (type_idx))
>  DEF_RVV_BASE_TYPE (eew8_interpret, get_vector_type (type_idx))
>  DEF_RVV_BASE_TYPE (eew16_interpret, get_vector_type (type_idx))
>  DEF_RVV_BASE_TYPE (eew32_interpret, get_vector_type (type_idx))
> @@ -727,6 +728,7 @@ DEF_RVV_BASE_TYPE (vlmul_ext_x32, get_vector_type 
> (type_idx))
>  DEF_RVV_BASE_TYPE (vlmul_ext_x64, get_vector_type (type_idx))
>  DEF_RVV_BASE_TYPE (size_ptr, build_pointer_type (size_type_node))
>  DEF_RVV_BASE_TYPE (tuple_subpart, get_tuple_subpart_type (type_idx))
> +DEF_RVV_BASE_TYPE (xfqf_float, get_xfqf_float_type (type_idx))
>
>  DEF_RVV_VXRM_ENUM (RNU, VXRM_RNU)
>  DEF_RVV_VXRM_ENUM (RNE, VXRM_RNE)
> diff --git a/gcc/config/riscv/riscv-vector-builtins.h 
> b/gcc/config/riscv/riscv-vector-builtins.h
> index 2602f6c2aa1..0274687b26a 100644
> --- a/gcc/config/riscv/riscv-vector-builtins.h
> +++ b/gcc/config/riscv/riscv-vector-builtins.h
> @@ -296,6 +296,7 @@ struct rvv_arg_type_info
>    tree get_vector_type (vector_type_index) const;
>    tree get_tree_type (vector_type_index) const;
>    tree get_tuple_subpart_type (vector_type_index) const;
> +  tree get_xfqf_float_type (vector_type_index) const;
>  };
>
>  /* Static information for each operand.  */
> diff --git a/gcc/config/riscv/sifive-vector.md 
> b/gcc/config/riscv/sifive-vector.md
> index e2fba6a27fb..e60173303b9 100644
> --- a/gcc/config/riscv/sifive-vector.md
> +++ b/gcc/config/riscv/sifive-vector.md
> @@ -164,8 +164,8 @@
>     (set_attr "mode" "<MODE>")])
>
>  (define_insn "@pred_sf_vfnrclip<v_su><mode>_x_f_qf"
> -  [(set (match_operand:<SF_XFQF> 0 "register_operand"        "=vd, vd, vr, 
> vr")
> -       (if_then_else:<SF_XFQF>
> +  [(set (match_operand:SF_XF 0 "register_operand"        "=vd, vd, vr, vr")
> +       (if_then_else:SF_XF
>           (unspec:<VM>
>             [(match_operand:<VM> 1 "vector_mask_operand"     " vm, 
> vm,Wc1,Wc1")
>              (match_operand 5 "vector_length_operand"        " rK, rK, rK, 
> rK")
> @@ -174,10 +174,10 @@
>              (match_operand 8 "const_int_operand"            "  i,  i,  i,  
> i")
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> -         (unspec:<SF_XFQF>
> +         (unspec:SF_XF
>             [(match_operand:SF 4 "register_operand"          "  f,  f,  f,  
> f")
> -            (match_operand:SF_VF 3 "register_operand"       " vr, vr, vr, 
> vr")] SF_VFNRCLIP)
> -         (match_operand:<SF_XFQF> 2 "vector_merge_operand"  " vu,  0, vu,  
> 0")))]
> +            (match_operand:<SF_XFQF> 3 "register_operand"       " vr, vr, 
> vr, vr")] SF_VFNRCLIP)
> +         (match_operand:SF_XF 2 "vector_merge_operand"  " vu,  0, vu,  0")))]
>    "TARGET_VECTOR && TARGET_XSFVFNRCLIPXFQF"
>    "sf.vfnrclip.x<v_su>.f.qf\t%0,%3,%4%p1"
>    [(set_attr "type" "sf_vfnrclip")
> diff --git a/gcc/config/riscv/vector-iterators.md 
> b/gcc/config/riscv/vector-iterators.md
> index 8e73022904b..e414b75ecac 100644
> --- a/gcc/config/riscv/vector-iterators.md
> +++ b/gcc/config/riscv/vector-iterators.md
> @@ -4794,24 +4794,23 @@
>    (RVVM1SI "rvvm1qi")
>  ])
>
> -(define_mode_iterator SF_VF [
> -  (RVVM8SF "TARGET_VECTOR_ELEN_FP_32") (RVVM4SF "TARGET_VECTOR_ELEN_FP_32") 
> (RVVM2SF "TARGET_VECTOR_ELEN_FP_32")
> -  (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 
> && TARGET_MIN_VLEN > 32")
> +(define_mode_iterator SF_XF [
> +  RVVM2QI RVVM1QI RVVMF2QI RVVMF4QI (RVVMF8QI "TARGET_MIN_VLEN > 32")
>  ])
>
>
>  (define_mode_attr SF_XFQF [
> -  (RVVMF2SF "RVVMF8QI")
> -  (RVVM1SF "RVVMF4QI")
> -  (RVVM2SF "RVVMF2QI")
> -  (RVVM4SF "RVVM1QI")
> -  (RVVM8SF "RVVM2QI")
> +  (RVVMF8QI "RVVMF2SF")
> +  (RVVMF4QI "RVVM1SF")
> +  (RVVMF2QI "RVVM2SF")
> +  (RVVM1QI  "RVVM4SF")
> +  (RVVM2QI  "RVVM8SF")
>  ])
>
>  (define_mode_attr sf_xfqf [
> -  (RVVMF2SF "rvvmf8qi")
> -  (RVVM1SF "rvvmf4qi")
> -  (RVVM2SF "rvvmf2qi")
> -  (RVVM4SF "rvvm1qi")
> -  (RVVM8SF "rvvm2qi")
> +  (RVVMF8QI "rvvmf2sf")
> +  (RVVMF4QI "rvvm1sf")
> +  (RVVMF2QI "rvvm2sf")
> +  (RVVM1QI  "rvvm4sf")
> +  (RVVM2QI  "rvvm8sf")
>  ])
> --
> 2.43.0
>

Reply via email to