pushed to trunk
On Tue, Apr 29, 2025 at 9:14 PM Kito Cheng <kito.ch...@sifive.com> wrote: > > From: yulong <shiyul...@iscas.ac.cn> > > This version is same as v5, but rebase to trunk, send out to trigger CI. > > This commit adds intrinsics support for Xsfvcp extension. > Diff with V4: Delete the sifive_vector.h file. > > Co-Authored by: Jiawei Chen <jia...@iscas.ac.cn> > Co-Authored by: Shihua Liao <shi...@iscas.ac.cn> > Co-Authored by: Yixuan Chen <chenyix...@iscas.ac.cn> > > gcc/ChangeLog: > > * config/riscv/constraints.md (Ou01): New constraint. > (Ou02): Ditto. > * config/riscv/generic-vector-ooo.md (vec_sf_vcp): New reservation. > * config/riscv/genrvv-type-indexer.cc (main): New type. > * config/riscv/riscv-c.cc (riscv_pragma_intrinsic): Add xsfvcp > strings. > * config/riscv/riscv-vector-builtins-shapes.cc (struct > sf_vcix_se_def): New function. > (struct sf_vcix_def): Ditto. > (SHAPE): Ditto. > * config/riscv/riscv-vector-builtins-shapes.h: Ditto. > * config/riscv/riscv-vector-builtins-types.def (DEF_RVV_X2_U_OPS): > New type. > (DEF_RVV_X2_WU_OPS): Ditto. > (vuint8mf8_t): Ditto. > (vuint8mf4_t): Ditto. > (vuint8mf2_t): Ditto. > (vuint8m1_t): Ditto. > (vuint8m2_t): Ditto. > (vuint8m4_t): Ditto. > (vuint16mf4_t): Ditto. > (vuint16mf2_t): Ditto. > (vuint16m1_t): Ditto. > (vuint16m2_t): Ditto. > (vuint16m4_t): Ditto. > (vuint32mf2_t): Ditto. > (vuint32m1_t): Ditto. > (vuint32m2_t): Ditto. > (vuint32m4_t): Ditto. > * config/riscv/riscv-vector-builtins.cc (DEF_RVV_X2_U_OPS): New > builtins def. > (DEF_RVV_X2_WU_OPS): Ditto. > (rvv_arg_type_info::get_scalar_float_type): Ditto. > (function_instance::modifies_global_state_p): Ditto. > * config/riscv/riscv-vector-builtins.def (v_x): New base type. > (i): Ditto. > (v_i): Ditto. > (xv): Ditto. > (iv): Ditto. > (fv): Ditto. > (vvv): Ditto. > (xvv): Ditto. > (ivv): Ditto. > (fvv): Ditto. > (vvw): Ditto. > (xvw): Ditto. > (ivw): Ditto. > (fvw): Ditto. > (v_vv): Ditto. > (v_xv): Ditto. > (v_iv): Ditto. > (v_fv): Ditto. > (v_vvv): Ditto. > (v_xvv): Ditto. > (v_ivv): Ditto. > (v_fvv): Ditto. > (v_vvw): Ditto. > (v_xvw): Ditto. > (v_ivw): Ditto. > (v_fvw): Ditto. > (x2_vector): Ditto. > (scalar_float): Ditto. > * config/riscv/riscv-vector-builtins.h (enum required_ext): New > extension. > (required_ext_to_isa_name): Ditto. > (required_extensions_specified): Ditto. > (struct rvv_arg_type_info): Ditto. > (struct function_group_info): Ditto. > * config/riscv/riscv.md: New attr. > * config/riscv/sifive-vector-builtins-bases.cc (class sf_vc): New > function. > (BASE): New base_name. > * config/riscv/sifive-vector-builtins-bases.h: New function_base. > * config/riscv/sifive-vector-builtins-functions.def > (REQUIRED_EXTENSIONS): New intrinsics def. > (sf_vc): Ditto. > * config/riscv/sifive-vector.md (@sf_vc_x_se<mode>): New RTL mode. > (@sf_vc_v_x_se<mode>): Ditto. > (@sf_vc_v_x<mode>): Ditto. > (@sf_vc_i_se<mode>): Ditto. > (@sf_vc_v_i_se<mode>): Ditto. > (@sf_vc_v_i<mode>): Ditto. > (@sf_vc_vv_se<mode>): Ditto. > (@sf_vc_v_vv_se<mode>): Ditto. > (@sf_vc_v_vv<mode>): Ditto. > (@sf_vc_xv_se<mode>): Ditto. > (@sf_vc_v_xv_se<mode>): Ditto. > (@sf_vc_v_xv<mode>): Ditto. > (@sf_vc_iv_se<mode>): Ditto. > (@sf_vc_v_iv_se<mode>): Ditto. > (@sf_vc_v_iv<mode>): Ditto. > (@sf_vc_fv_se<mode>): Ditto. > (@sf_vc_v_fv_se<mode>): Ditto. > (@sf_vc_v_fv<mode>): Ditto. > (@sf_vc_vvv_se<mode>): Ditto. > (@sf_vc_v_vvv_se<mode>): Ditto. > (@sf_vc_v_vvv<mode>): Ditto. > (@sf_vc_xvv_se<mode>): Ditto. > (@sf_vc_v_xvv_se<mode>): Ditto. > (@sf_vc_v_xvv<mode>): Ditto. > (@sf_vc_ivv_se<mode>): Ditto. > (@sf_vc_v_ivv_se<mode>): Ditto. > (@sf_vc_v_ivv<mode>): Ditto. > (@sf_vc_fvv_se<mode>): Ditto. > (@sf_vc_v_fvv_se<mode>): Ditto. > (@sf_vc_v_fvv<mode>): Ditto. > (@sf_vc_vvw_se<mode>): Ditto. > (@sf_vc_v_vvw_se<mode>): Ditto. > (@sf_vc_v_vvw<mode>): Ditto. > (@sf_vc_xvw_se<mode>): Ditto. > (@sf_vc_v_xvw_se<mode>): Ditto. > (@sf_vc_v_xvw<mode>): Ditto. > (@sf_vc_ivw_se<mode>): Ditto. > (@sf_vc_v_ivw_se<mode>): Ditto. > (@sf_vc_v_ivw<mode>): Ditto. > (@sf_vc_fvw_se<mode>): Ditto. > (@sf_vc_v_fvw_se<mode>): Ditto. > (@sf_vc_v_fvw<mode>): Ditto. > * config/riscv/vector-iterators.md: New iterator. > * config/riscv/vector.md: New vtype. > > --- > gcc/config/riscv/constraints.md | 10 + > gcc/config/riscv/generic-vector-ooo.md | 4 + > gcc/config/riscv/genrvv-type-indexer.cc | 9 + > gcc/config/riscv/riscv-c.cc | 3 +- > .../riscv/riscv-vector-builtins-shapes.cc | 48 + > .../riscv/riscv-vector-builtins-shapes.h | 2 + > .../riscv/riscv-vector-builtins-types.def | 40 + > gcc/config/riscv/riscv-vector-builtins.cc | 362 +++++++- > gcc/config/riscv/riscv-vector-builtins.def | 30 +- > gcc/config/riscv/riscv-vector-builtins.h | 8 + > gcc/config/riscv/riscv.md | 5 +- > .../riscv/sifive-vector-builtins-bases.cc | 78 ++ > .../riscv/sifive-vector-builtins-bases.h | 3 + > .../sifive-vector-builtins-functions.def | 45 + > gcc/config/riscv/sifive-vector.md | 871 ++++++++++++++++++ > gcc/config/riscv/vector-iterators.md | 49 + > gcc/config/riscv/vector.md | 3 +- > 17 files changed, 1562 insertions(+), 8 deletions(-) > > diff --git a/gcc/config/riscv/constraints.md b/gcc/config/riscv/constraints.md > index ba3c6e6a4c4..18556a59141 100644 > --- a/gcc/config/riscv/constraints.md > +++ b/gcc/config/riscv/constraints.md > @@ -311,3 +311,13 @@ (define_constraint "CV_simd_i03" > "Shifting immediate for SIMD shufflei3." > (and (match_code "const_int") > (match_test "IN_RANGE (ival, -64, -1)"))) > + > +(define_constraint "Ou01" > + "A 1-bit unsigned immediate." > + (and (match_code "const_int") > + (match_test "IN_RANGE (ival, 0, 1)"))) > + > +(define_constraint "Ou02" > + "A 2-bit unsigned immediate." > + (and (match_code "const_int") > + (match_test "IN_RANGE (ival, 0, 3)"))) > diff --git a/gcc/config/riscv/generic-vector-ooo.md > b/gcc/config/riscv/generic-vector-ooo.md > index cb719416220..ab9e57f5cbf 100644 > --- a/gcc/config/riscv/generic-vector-ooo.md > +++ b/gcc/config/riscv/generic-vector-ooo.md > @@ -141,3 +141,7 @@ (define_insn_reservation "vec_readlen" 4 > (eq_attr "type" "rdvlenb,rdvl") > "vxu_ooo_issue,vxu_ooo_issue") > > +;; Vector sf_vcp. > +(define_insn_reservation "vec_sf_vcp" 2 > + (eq_attr "type" "sf_vc,sf_vc_se") > + "vxu_ooo_issue") > diff --git a/gcc/config/riscv/genrvv-type-indexer.cc > b/gcc/config/riscv/genrvv-type-indexer.cc > index 6de23cb6e1c..2fd429ad734 100644 > --- a/gcc/config/riscv/genrvv-type-indexer.cc > +++ b/gcc/config/riscv/genrvv-type-indexer.cc > @@ -303,6 +303,8 @@ main (int argc, const char **argv) > fprintf (fp, " /*UNSIGNED_EEW%d_LMUL1_INTERPRET*/ %s,\n", eew, > inttype (eew, LMUL1_LOG2, /* unsigned_p */true).c_str ()); > > + fprintf (fp, " /*X2*/ INVALID,\n"); > + > for (unsigned lmul_log2_offset : {1, 2, 3, 4, 5, 6}) > { > unsigned multiple_of_lmul = 1 << lmul_log2_offset; > @@ -426,6 +428,9 @@ main (int argc, const char **argv) > fprintf (fp, " /*UNSIGNED_EEW%d_LMUL1_INTERPRET*/ INVALID,\n", > eew); > > + fprintf (fp, " /*X2*/ %s,\n", > + inttype (sew * 2, lmul_log2 + 1, /*unsigned_p*/ > true).c_str ()); > + > for (unsigned lmul_log2_offset : {1, 2, 3, 4, 5, 6}) > { > unsigned multiple_of_lmul = 1 << lmul_log2_offset; > @@ -501,6 +506,8 @@ main (int argc, const char **argv) > for (unsigned eew : EEW_SIZE_LIST) > fprintf (fp, " /*UNSIGNED_EEW%d_LMUL1_INTERPRET*/ INVALID,\n", > eew); > > + fprintf (fp, " /*X2*/ INVALID,\n"); > + > for (unsigned lmul_log2_offset : {1, 2, 3, 4, 5, 6}) > { > unsigned multiple_of_lmul = 1 << lmul_log2_offset; > @@ -588,6 +595,8 @@ main (int argc, const char **argv) > fprintf (fp, " /*UNSIGNED_EEW%d_LMUL1_INTERPRET*/ INVALID,\n", > eew); > > + fprintf (fp, " /*X2*/ INVALID,\n"); > + > for (unsigned lmul_log2_offset : {1, 2, 3, 4, 5, 6}) > { > unsigned multiple_of_lmul = 1 << lmul_log2_offset; > diff --git a/gcc/config/riscv/riscv-c.cc b/gcc/config/riscv/riscv-c.cc > index 7912b1069f7..ab6dc838964 100644 > --- a/gcc/config/riscv/riscv-c.cc > +++ b/gcc/config/riscv/riscv-c.cc > @@ -279,7 +279,8 @@ riscv_pragma_intrinsic (cpp_reader *) > const char *name = TREE_STRING_POINTER (x); > > if (strcmp (name, "vector") == 0 > - || strcmp (name, "xtheadvector") == 0) > + || strcmp (name, "xtheadvector") == 0 > + || strcmp (name, "xsfvcp") == 0) > { > struct pragma_intrinsic_flags backup_flags; > > diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc > b/gcc/config/riscv/riscv-vector-builtins-shapes.cc > index fc21b200420..b855d4c5fa5 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc > +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc > @@ -1343,6 +1343,52 @@ struct sf_vfnrclip_def : public build_base > } > }; > > +/* sf_vcix_se_def class. */ > +struct sf_vcix_se_def : public build_base > +{ > + char *get_name (function_builder &b, const function_instance &instance, > + bool overloaded_p) const override > + { > + /* Return nullptr if it is overloaded. */ > + if (overloaded_p) > + return nullptr; > + > + b.append_base_name (instance.base_name); > + > + /* vop --> vop<op>_se_<type>. */ > + if (!overloaded_p) > + { > + b.append_name (operand_suffixes[instance.op_info->op]); > + b.append_name ("_se"); > + b.append_name (type_suffixes[instance.type.index].vector); > + } > + return b.finish_name (); > + } > +}; > + > +/* sf_vcix_def class. */ > +struct sf_vcix_def : public build_base > +{ > + char *get_name (function_builder &b, const function_instance &instance, > + bool overloaded_p) const override > + { > + /* Return nullptr if it is overloaded. */ > + if (overloaded_p) > + return nullptr; > + > + b.append_base_name (instance.base_name); > + > + /* vop --> vop_<type>. */ > + if (!overloaded_p) > + { > + b.append_name (operand_suffixes[instance.op_info->op]); > + b.append_name (type_suffixes[instance.type.index].vector); > + } > + return b.finish_name (); > + } > +}; > + > + > SHAPE(vsetvl, vsetvl) > SHAPE(vsetvl, vsetvlmax) > SHAPE(loadstore, loadstore) > @@ -1379,4 +1425,6 @@ SHAPE(crypto_vi, crypto_vi) > SHAPE(crypto_vv_no_op_type, crypto_vv_no_op_type) > SHAPE (sf_vqmacc, sf_vqmacc) > SHAPE (sf_vfnrclip, sf_vfnrclip) > +SHAPE(sf_vcix_se, sf_vcix_se) > +SHAPE(sf_vcix, sf_vcix) > } // end namespace riscv_vector > diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.h > b/gcc/config/riscv/riscv-vector-builtins-shapes.h > index 858799b0391..2f2636ee386 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-shapes.h > +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.h > @@ -62,6 +62,8 @@ extern const function_shape *const crypto_vv_no_op_type; > /* Sifive vendor extension. */ > extern const function_shape *const sf_vqmacc; > extern const function_shape *const sf_vfnrclip; > +extern const function_shape *const sf_vcix_se; > +extern const function_shape *const sf_vcix; > } > > } // end namespace riscv_vector > diff --git a/gcc/config/riscv/riscv-vector-builtins-types.def > b/gcc/config/riscv/riscv-vector-builtins-types.def > index 857b63758a0..ade6644b56e 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-types.def > +++ b/gcc/config/riscv/riscv-vector-builtins-types.def > @@ -369,6 +369,18 @@ along with GCC; see the file COPYING3. If not see > #define DEF_RVV_XFQF_OPS(TYPE, REQUIRE) > #endif > > +/* Use "DEF_RVV_X2_U_OPS" macro include unsigned integer which will > + be iterated and registered as intrinsic functions. */ > +#ifndef DEF_RVV_X2_U_OPS > +#define DEF_RVV_X2_U_OPS(TYPE, REQUIRE) > +#endif > + > +/* Use "DEF_RVV_X2_WU_OPS" macro include widen unsigned integer which will > + be iterated and registered as intrinsic functions. */ > +#ifndef DEF_RVV_X2_WU_OPS > +#define DEF_RVV_X2_WU_OPS(TYPE, REQUIRE) > +#endif > + > DEF_RVV_I_OPS (vint8mf8_t, RVV_REQUIRE_ELEN_64) > DEF_RVV_I_OPS (vint8mf4_t, 0) > DEF_RVV_I_OPS (vint8mf2_t, 0) > @@ -1463,6 +1475,32 @@ DEF_RVV_XFQF_OPS (vint8mf2_t, 0) > DEF_RVV_XFQF_OPS (vint8m1_t, 0) > DEF_RVV_XFQF_OPS (vint8m2_t, 0) > > +DEF_RVV_X2_U_OPS (vuint8mf8_t, RVV_REQUIRE_ELEN_64) > +DEF_RVV_X2_U_OPS (vuint8mf4_t, 0) > +DEF_RVV_X2_U_OPS (vuint8mf2_t, 0) > +DEF_RVV_X2_U_OPS (vuint8m1_t, 0) > +DEF_RVV_X2_U_OPS (vuint8m2_t, 0) > +DEF_RVV_X2_U_OPS (vuint8m4_t, 0) > +DEF_RVV_X2_U_OPS (vuint16mf4_t, RVV_REQUIRE_ELEN_64) > +DEF_RVV_X2_U_OPS (vuint16mf2_t, 0) > +DEF_RVV_X2_U_OPS (vuint16m1_t, 0) > +DEF_RVV_X2_U_OPS (vuint16m2_t, 0) > +DEF_RVV_X2_U_OPS (vuint16m4_t, 0) > +DEF_RVV_X2_U_OPS (vuint32mf2_t, RVV_REQUIRE_ELEN_64) > +DEF_RVV_X2_U_OPS (vuint32m1_t, 0) > +DEF_RVV_X2_U_OPS (vuint32m2_t, 0) > +DEF_RVV_X2_U_OPS (vuint32m4_t, 0) > + > +DEF_RVV_X2_WU_OPS (vuint16mf4_t, RVV_REQUIRE_ELEN_64) > +DEF_RVV_X2_WU_OPS (vuint16mf2_t, 0) > +DEF_RVV_X2_WU_OPS (vuint16m1_t, 0) > +DEF_RVV_X2_WU_OPS (vuint16m2_t, 0) > +DEF_RVV_X2_WU_OPS (vuint16m4_t, 0) > +DEF_RVV_X2_WU_OPS (vuint32mf2_t, RVV_REQUIRE_ELEN_64) > +DEF_RVV_X2_WU_OPS (vuint32m1_t, 0) > +DEF_RVV_X2_WU_OPS (vuint32m2_t, 0) > +DEF_RVV_X2_WU_OPS (vuint32m4_t, 0) > + > #undef DEF_RVV_I_OPS > #undef DEF_RVV_U_OPS > #undef DEF_RVV_F_OPS > @@ -1519,3 +1557,5 @@ DEF_RVV_XFQF_OPS (vint8m2_t, 0) > #undef DEF_RVV_F32_OPS > #undef DEF_RVV_QMACC_OPS > #undef DEF_RVV_XFQF_OPS > +#undef DEF_RVV_X2_U_OPS > +#undef DEF_RVV_X2_WU_OPS > diff --git a/gcc/config/riscv/riscv-vector-builtins.cc > b/gcc/config/riscv/riscv-vector-builtins.cc > index 61dcdabbb40..f3c706bfba9 100644 > --- a/gcc/config/riscv/riscv-vector-builtins.cc > +++ b/gcc/config/riscv/riscv-vector-builtins.cc > @@ -544,6 +544,20 @@ static const rvv_type_info crypto_sew64_ops[] = { > #include "riscv-vector-builtins-types.def" > {NUM_VECTOR_TYPES, 0}}; > > +/* A list of signed integer will be registered for Sifive Xsfvcp intrinsic*/ > +/* functions. */ > +static const rvv_type_info x2_u_ops[] = { > +#define DEF_RVV_X2_U_OPS(TYPE, REQUIRE) {VECTOR_TYPE_##TYPE, REQUIRE}, > +#include "riscv-vector-builtins-types.def" > + {NUM_VECTOR_TYPES, 0}}; > + > +/* A list of signed integer will be registered for Sifive Xsfvcp intrinsic*/ > +/* functions. */ > +static const rvv_type_info x2_wu_ops[] = { > +#define DEF_RVV_X2_WU_OPS(TYPE, REQUIRE) {VECTOR_TYPE_##TYPE, REQUIRE}, > +#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 qmacc_ops[] = { > @@ -805,7 +819,7 @@ static CONSTEXPR const rvv_arg_type_info bf_wwxv_args[] > static CONSTEXPR const rvv_arg_type_info m_args[] > = {rvv_arg_type_info (RVV_BASE_mask), rvv_arg_type_info_end}; > > -/* A list of args for vector_type func (scalar_type) function. */ > +/* A list of args for vector_type func (scalar_type/sf.vc) function. */ > static CONSTEXPR const rvv_arg_type_info x_args[] > = {rvv_arg_type_info (RVV_BASE_scalar), rvv_arg_type_info_end}; > > @@ -1055,6 +1069,161 @@ static CONSTEXPR const rvv_arg_type_info > scalar_ptr_size_args[] > rvv_arg_type_info (RVV_BASE_size), rvv_arg_type_info (RVV_BASE_vector), > rvv_arg_type_info_end}; > > +/* A list of args for vector_type func (sf.vc.x) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_x_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.v.x) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_v_x_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.i) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_i_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > + > +/* A list of args for vector_type func (sf.vc.i) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_v_i_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.vv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_vv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.v.vv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_v_vv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.xv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_xv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.v.xv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_v_xv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.iv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_iv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.v.iv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_v_iv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.fv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_fv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar_float), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.v.fv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_v_fv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar_float), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.vvv/sf.vc.v.vvv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_vvv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.xvv/sf.vc.v.xvv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_xvv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.ivv/sf.vc.v.ivv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_ivv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_unsigned_vector), > + rvv_arg_type_info (RVV_BASE_unsigned_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.fvv/sf.vc.v.fvv) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_fvv_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar_float), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.vvw/sf.vc.v.vvw) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_vvw_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_x2_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.xvw/sf.vc.v.xvw) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_xvw_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_x2_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.ivw/sf.vc.v.ivw) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_ivw_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_x2_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info_end}; > + > +/* A list of args for vector_type func (sf.vc.fvw/sf.vc.v.fvw) function. */ > +static CONSTEXPR const rvv_arg_type_info sf_vc_fvw_args[] > + = {rvv_arg_type_info (RVV_BASE_scalar), > + rvv_arg_type_info (RVV_BASE_x2_vector), > + rvv_arg_type_info (RVV_BASE_vector), > + rvv_arg_type_info (RVV_BASE_scalar_float), > + rvv_arg_type_info_end}; > + > /* A list of none preds that will be registered for intrinsic functions. */ > static CONSTEXPR const predication_type_index none_preds[] > = {PRED_TYPE_none, NUM_PRED_TYPES}; > @@ -3006,6 +3175,174 @@ static CONSTEXPR const rvv_op_info > u_vvvv_crypto_sew64_ops > rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > vvv_args /* Args */}; > > +static CONSTEXPR const rvv_op_info sf_vc_x_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_x, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_x_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_x_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_x, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_v_x_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_i_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_i, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_i_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_i_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_i, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_v_i_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_vv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_vv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_vv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_vv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_vv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_v_vv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_xv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_xv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_xv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_xv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_xv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_v_xv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_iv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_iv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_iv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_iv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_iv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_v_iv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_fv_ops > + = {wextu_ops, /* Types */ > + OP_TYPE_fv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_fv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_fv_ops > + = {wextu_ops, /* Types */ > + OP_TYPE_v_fv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_v_fv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_vvv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_vvv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_vvv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_vvv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_vvv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_vvv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_xvv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_xvv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_xvv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_xvv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_xvv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_xvv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_ivv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_ivv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_ivv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_ivv_ops > + = {full_v_u_ops, /* Types */ > + OP_TYPE_v_ivv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_ivv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_fvv_ops > + = {wextu_ops, /* Types */ > + OP_TYPE_fvv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_fvv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_fvv_ops > + = {wextu_ops, /* Types */ > + OP_TYPE_v_fvv, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ > + sf_vc_fvv_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_vvw_ops > + = {x2_u_ops, /* Types */ > + OP_TYPE_vvw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_vvw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_vvw_ops > + = {x2_u_ops, /* Types */ > + OP_TYPE_v_vvw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_x2_vector), /* Return type */ > + sf_vc_vvw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_xvw_ops > + = {x2_u_ops, /* Types */ > + OP_TYPE_xvw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_xvw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_xvw_ops > + = {x2_u_ops, /* Types */ > + OP_TYPE_v_xvw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_x2_vector), /* Return type */ > + sf_vc_xvw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_ivw_ops > + = {x2_u_ops, /* Types */ > + OP_TYPE_ivw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_ivw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_ivw_ops > + = {x2_u_ops, /* Types */ > + OP_TYPE_v_ivw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_x2_vector), /* Return type */ > + sf_vc_ivw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_fvw_ops > + = {x2_wu_ops, /* Types */ > + OP_TYPE_fvw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_void), /* Return type */ > + sf_vc_fvw_args /* Args */}; > + > +static CONSTEXPR const rvv_op_info sf_vc_v_fvw_ops > + = {x2_wu_ops, /* Types */ > + OP_TYPE_v_fvw, /* Suffix */ > + rvv_arg_type_info (RVV_BASE_x2_vector), /* Return type */ > + sf_vc_fvw_args /* Args */}; > + > /* A list of all RVV base function types. */ > static CONSTEXPR const function_type_info function_types[] = { > #define DEF_RVV_TYPE_INDEX( > \ > @@ -3022,7 +3359,7 @@ static CONSTEXPR const function_type_info > function_types[] = { > SIGNED_EEW16_LMUL1_INTERPRET, SIGNED_EEW32_LMUL1_INTERPRET, > \ > SIGNED_EEW64_LMUL1_INTERPRET, UNSIGNED_EEW8_LMUL1_INTERPRET, > \ > UNSIGNED_EEW16_LMUL1_INTERPRET, UNSIGNED_EEW32_LMUL1_INTERPRET, > \ > - UNSIGNED_EEW64_LMUL1_INTERPRET, X2_VLMUL_EXT, X4_VLMUL_EXT, X8_VLMUL_EXT, > \ > + UNSIGNED_EEW64_LMUL1_INTERPRET, X2, X2_VLMUL_EXT, X4_VLMUL_EXT, > X8_VLMUL_EXT,\ > X16_VLMUL_EXT, X32_VLMUL_EXT, X64_VLMUL_EXT, TUPLE_SUBPART) > \ > { > \ > VECTOR_TYPE_##VECTOR, > \ > @@ -3087,6 +3424,7 @@ static CONSTEXPR const function_type_info > function_types[] = { > VECTOR_TYPE_##UNSIGNED_EEW16_LMUL1_INTERPRET, > \ > VECTOR_TYPE_##UNSIGNED_EEW32_LMUL1_INTERPRET, > \ > VECTOR_TYPE_##UNSIGNED_EEW64_LMUL1_INTERPRET, > \ > + VECTOR_TYPE_##X2, > \ > VECTOR_TYPE_##X2_VLMUL_EXT, > \ > VECTOR_TYPE_##X4_VLMUL_EXT, > \ > VECTOR_TYPE_##X8_VLMUL_EXT, > \ > @@ -3600,6 +3938,24 @@ rvv_arg_type_info::get_xfqf_float_type > (vector_type_index type_idx) const > return NULL_TREE; > } > > +tree > +rvv_arg_type_info::get_scalar_float_type (vector_type_index type_idx) const > +{ > + /* Convert vint types to their corresponding scalar 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. > + - Conversion for vint8 types is not required. */ > + if (type_idx >= VECTOR_TYPE_vint16mf4_t && type_idx <= > VECTOR_TYPE_vuint16m8_t) > + return builtin_types[VECTOR_TYPE_vfloat16m1_t].scalar; > + else if (type_idx >= VECTOR_TYPE_vint32mf2_t && type_idx <= > VECTOR_TYPE_vuint32m8_t) > + return builtin_types[VECTOR_TYPE_vfloat32m1_t].scalar; > + else if (type_idx >= VECTOR_TYPE_vint64m1_t && type_idx <= > VECTOR_TYPE_vuint64m8_t) > + return builtin_types[VECTOR_TYPE_vfloat64m1_t].scalar; > + else > + return NULL_TREE; > +} > + > vector_type_index > rvv_arg_type_info::get_function_type_index (vector_type_index type_idx) const > { > @@ -3758,7 +4114,7 @@ function_instance::modifies_global_state_p () const > return true; > > /* Handle direct modifications of global state. */ > - return flags & (CP_WRITE_MEMORY | CP_WRITE_CSR); > + return flags & (CP_WRITE_MEMORY | CP_WRITE_CSR | CP_USE_COPROCESSORS); > } > > /* Return true if calls to the function could raise a signal. */ > diff --git a/gcc/config/riscv/riscv-vector-builtins.def > b/gcc/config/riscv/riscv-vector-builtins.def > index 3a62869a2b7..be3fb1af816 100644 > --- a/gcc/config/riscv/riscv-vector-builtins.def > +++ b/gcc/config/riscv/riscv-vector-builtins.def > @@ -82,7 +82,7 @@ along with GCC; see the file COPYING3. If not see > SIGNED_EEW16_LMUL1_INTERPRET, SIGNED_EEW32_LMUL1_INTERPRET, > \ > SIGNED_EEW64_LMUL1_INTERPRET, UNSIGNED_EEW8_LMUL1_INTERPRET, > \ > UNSIGNED_EEW16_LMUL1_INTERPRET, UNSIGNED_EEW32_LMUL1_INTERPRET, > \ > - UNSIGNED_EEW64_LMUL1_INTERPRET, X2_VLMUL_EXT, X4_VLMUL_EXT, X8_VLMUL_EXT, > \ > + UNSIGNED_EEW64_LMUL1_INTERPRET, X2, X2_VLMUL_EXT, X4_VLMUL_EXT, > X8_VLMUL_EXT,\ > X16_VLMUL_EXT, X32_VLMUL_EXT, X64_VLMUL_EXT, TUPLE_SUBPART) > #endif > > @@ -637,6 +637,32 @@ DEF_RVV_OP_TYPE (xu_w) > DEF_RVV_OP_TYPE (s) > DEF_RVV_OP_TYPE (4x8x4) > DEF_RVV_OP_TYPE (2x8x2) > +DEF_RVV_OP_TYPE (v_x) > +DEF_RVV_OP_TYPE (i) > +DEF_RVV_OP_TYPE (v_i) > +DEF_RVV_OP_TYPE (xv) > +DEF_RVV_OP_TYPE (iv) > +DEF_RVV_OP_TYPE (fv) > +DEF_RVV_OP_TYPE (vvv) > +DEF_RVV_OP_TYPE (xvv) > +DEF_RVV_OP_TYPE (ivv) > +DEF_RVV_OP_TYPE (fvv) > +DEF_RVV_OP_TYPE (vvw) > +DEF_RVV_OP_TYPE (xvw) > +DEF_RVV_OP_TYPE (ivw) > +DEF_RVV_OP_TYPE (fvw) > +DEF_RVV_OP_TYPE (v_vv) > +DEF_RVV_OP_TYPE (v_xv) > +DEF_RVV_OP_TYPE (v_iv) > +DEF_RVV_OP_TYPE (v_fv) > +DEF_RVV_OP_TYPE (v_vvv) > +DEF_RVV_OP_TYPE (v_xvv) > +DEF_RVV_OP_TYPE (v_ivv) > +DEF_RVV_OP_TYPE (v_fvv) > +DEF_RVV_OP_TYPE (v_vvw) > +DEF_RVV_OP_TYPE (v_xvw) > +DEF_RVV_OP_TYPE (v_ivw) > +DEF_RVV_OP_TYPE (v_fvw) > > DEF_RVV_PRED_TYPE (ta) > DEF_RVV_PRED_TYPE (tu) > @@ -720,6 +746,7 @@ DEF_RVV_BASE_TYPE (unsigned_eew8_lmul1_interpret, > get_vector_type (type_idx)) > DEF_RVV_BASE_TYPE (unsigned_eew16_lmul1_interpret, get_vector_type > (type_idx)) > DEF_RVV_BASE_TYPE (unsigned_eew32_lmul1_interpret, get_vector_type > (type_idx)) > DEF_RVV_BASE_TYPE (unsigned_eew64_lmul1_interpret, get_vector_type > (type_idx)) > +DEF_RVV_BASE_TYPE (x2_vector, get_vector_type (type_idx)) > DEF_RVV_BASE_TYPE (vlmul_ext_x2, get_vector_type (type_idx)) > DEF_RVV_BASE_TYPE (vlmul_ext_x4, get_vector_type (type_idx)) > DEF_RVV_BASE_TYPE (vlmul_ext_x8, get_vector_type (type_idx)) > @@ -729,6 +756,7 @@ 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_BASE_TYPE (scalar_float, get_scalar_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 42ba9057707..ffc289364b0 100644 > --- a/gcc/config/riscv/riscv-vector-builtins.h > +++ b/gcc/config/riscv/riscv-vector-builtins.h > @@ -130,6 +130,7 @@ enum required_ext > XSFVQMACCQOQ_EXT, /* XSFVQMACCQOQ extension */ > XSFVQMACCDOD_EXT, /* XSFVQMACCDOD extension */ > XSFVFNRCLIPXFQF_EXT, /* XSFVFNRCLIPXFQF extension */ > + XSFVCP_EXT, /* XSFVCP extension*/ > /* Please update below to isa_name func when add or remove enum type(s). > */ > }; > > @@ -169,6 +170,8 @@ static inline const char * required_ext_to_isa_name (enum > required_ext required) > return "xsfvqmaccdod"; > case XSFVFNRCLIPXFQF_EXT: > return "xsfvfnrclipxfqf"; > + case XSFVCP_EXT: > + return "xsfvcp"; > default: > gcc_unreachable (); > } > @@ -212,6 +215,8 @@ static inline bool required_extensions_specified (enum > required_ext required) > return TARGET_XSFVQMACCDOD; > case XSFVFNRCLIPXFQF_EXT: > return TARGET_XSFVFNRCLIPXFQF; > + case XSFVCP_EXT: > + return TARGET_XSFVCP; > default: > gcc_unreachable (); > } > @@ -297,6 +302,7 @@ struct rvv_arg_type_info > 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; > + tree get_scalar_float_type (vector_type_index) const; > }; > > /* Static information for each operand. */ > @@ -359,6 +365,8 @@ struct function_group_info > return TARGET_XSFVQMACCDOD; > case XSFVFNRCLIPXFQF_EXT: > return TARGET_XSFVFNRCLIPXFQF; > + case XSFVCP_EXT: > + return TARGET_XSFVCP; > default: > gcc_unreachable (); > } > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > index eec96875f96..c34eadb01c9 100644 > --- a/gcc/config/riscv/riscv.md > +++ b/gcc/config/riscv/riscv.md > @@ -495,6 +495,8 @@ (define_attr "ext_enabled" "no,yes" > ;; SiFive custom extension instrctions > ;; sf_vqmacc vector matrix integer multiply-add instructions > ;; sf_vfnrclip vector fp32 to int8 ranged clip instructions > +;; sf_vc vector coprocessor interface without side effect > +;; sf_vc_se vector coprocessor interface with side effect > (define_attr "type" > "unknown,branch,jump,jalr,ret,call,load,fpload,store,fpstore, > mtc,mfc,const,arith,logical,shift,slt,imul,idiv,move,fmove,fadd,fmul, > @@ -516,7 +518,8 @@ (define_attr "type" > vslideup,vslidedown,vislide1up,vislide1down,vfslide1up,vfslide1down, > > vgather,vcompress,vmov,vector,vandn,vbrev,vbrev8,vrev8,vclz,vctz,vcpop,vrol,vror,vwsll, > > vclmul,vclmulh,vghsh,vgmul,vaesef,vaesem,vaesdf,vaesdm,vaeskf1,vaeskf2,vaesz, > - > vsha2ms,vsha2ch,vsha2cl,vsm4k,vsm4r,vsm3me,vsm3c,vfncvtbf16,vfwcvtbf16,vfwmaccbf16" > + > vsha2ms,vsha2ch,vsha2cl,vsm4k,vsm4r,vsm3me,vsm3c,vfncvtbf16,vfwcvtbf16,vfwmaccbf16, > + sf_vc,sf_vc_se" > (cond [(eq_attr "got" "load") (const_string "load") > > ;; If a doubleword move uses these expensive instructions, > diff --git a/gcc/config/riscv/sifive-vector-builtins-bases.cc > b/gcc/config/riscv/sifive-vector-builtins-bases.cc > index 85e1b6faebc..be530ca449a 100644 > --- a/gcc/config/riscv/sifive-vector-builtins-bases.cc > +++ b/gcc/config/riscv/sifive-vector-builtins-bases.cc > @@ -195,12 +195,89 @@ public: > } > }; > > +/* Implements SiFive sf.vc. */ > +class sf_vc : public function_base > +{ > +public: > + > + unsigned int call_properties (const function_instance &) const override > + { > + return CP_USE_COPROCESSORS; > + } > + > + rtx expand (function_expander &e) const override > + { > + switch (e.op_info->op) > + { > + case OP_TYPE_x: > + return e.use_exact_insn (code_for_sf_vc_x_se (e.vector_mode ())); > + case OP_TYPE_i: > + return e.use_exact_insn (code_for_sf_vc_i_se (e.vector_mode ())); > + case OP_TYPE_vv: > + return e.use_exact_insn (code_for_sf_vc_vv_se (e.vector_mode ())); > + case OP_TYPE_xv: > + return e.use_exact_insn (code_for_sf_vc_xv_se (e.vector_mode ())); > + case OP_TYPE_iv: > + return e.use_exact_insn (code_for_sf_vc_iv_se (e.vector_mode ())); > + case OP_TYPE_fv: > + return e.use_exact_insn (code_for_sf_vc_fv_se (e.vector_mode ())); > + case OP_TYPE_v_x: > + return e.use_exact_insn (code_for_sf_vc_v_x_se (e.vector_mode ())); > + case OP_TYPE_v_i: > + return e.use_exact_insn (code_for_sf_vc_v_i_se (e.vector_mode ())); > + case OP_TYPE_v_vv: > + return e.use_exact_insn (code_for_sf_vc_v_vv_se (e.vector_mode ())); > + case OP_TYPE_v_xv: > + return e.use_exact_insn (code_for_sf_vc_v_xv_se (e.vector_mode ())); > + case OP_TYPE_v_iv: > + return e.use_exact_insn (code_for_sf_vc_v_iv_se (e.vector_mode ())); > + case OP_TYPE_v_fv: > + return e.use_exact_insn (code_for_sf_vc_v_fv_se (e.vector_mode ())); > + case OP_TYPE_vvv: > + return e.use_exact_insn (code_for_sf_vc_vvv_se (e.vector_mode ())); > + case OP_TYPE_xvv: > + return e.use_exact_insn (code_for_sf_vc_xvv_se (e.vector_mode ())); > + case OP_TYPE_ivv: > + return e.use_exact_insn (code_for_sf_vc_ivv_se (e.vector_mode ())); > + case OP_TYPE_fvv: > + return e.use_exact_insn (code_for_sf_vc_fvv_se (e.vector_mode ())); > + case OP_TYPE_vvw: > + return e.use_exact_insn (code_for_sf_vc_vvw_se (e.vector_mode ())); > + case OP_TYPE_xvw: > + return e.use_exact_insn (code_for_sf_vc_xvw_se (e.vector_mode ())); > + case OP_TYPE_ivw: > + return e.use_exact_insn (code_for_sf_vc_ivw_se (e.vector_mode ())); > + case OP_TYPE_fvw: > + return e.use_exact_insn (code_for_sf_vc_fvw_se (e.vector_mode ())); > + case OP_TYPE_v_vvv: > + return e.use_exact_insn (code_for_sf_vc_v_vvv_se (e.vector_mode ())); > + case OP_TYPE_v_xvv: > + return e.use_exact_insn (code_for_sf_vc_v_xvv_se (e.vector_mode ())); > + case OP_TYPE_v_ivv: > + return e.use_exact_insn (code_for_sf_vc_v_ivv_se (e.vector_mode ())); > + case OP_TYPE_v_fvv: > + return e.use_exact_insn (code_for_sf_vc_v_fvv_se (e.vector_mode ())); > + case OP_TYPE_v_vvw: > + return e.use_exact_insn (code_for_sf_vc_v_vvw_se (e.vector_mode ())); > + case OP_TYPE_v_xvw: > + return e.use_exact_insn (code_for_sf_vc_v_xvw_se (e.vector_mode ())); > + case OP_TYPE_v_ivw: > + return e.use_exact_insn (code_for_sf_vc_v_ivw_se (e.vector_mode ())); > + case OP_TYPE_v_fvw: > + return e.use_exact_insn (code_for_sf_vc_v_fvw_se (e.vector_mode ())); > + default: > + gcc_unreachable (); > + } > + } > +}; > + > static CONSTEXPR const sf_vqmacc sf_vqmacc_obj; > static CONSTEXPR const sf_vqmaccu sf_vqmaccu_obj; > static CONSTEXPR const sf_vqmaccsu sf_vqmaccsu_obj; > static CONSTEXPR const sf_vqmaccus sf_vqmaccus_obj; > static CONSTEXPR const sf_vfnrclip_x_f_qf<UNSPEC_SF_VFNRCLIP> > sf_vfnrclip_x_f_qf_obj; > static CONSTEXPR const sf_vfnrclip_xu_f_qf<UNSPEC_SF_VFNRCLIPU> > sf_vfnrclip_xu_f_qf_obj; > +static CONSTEXPR const sf_vc sf_vc_obj; > > /* Declare the function base NAME, pointing it to an instance > of class <NAME>_obj. */ > @@ -213,4 +290,5 @@ BASE (sf_vqmaccsu) > BASE (sf_vqmaccus) > BASE (sf_vfnrclip_x_f_qf) > BASE (sf_vfnrclip_xu_f_qf) > +BASE (sf_vc) > } // end namespace riscv_vector > diff --git a/gcc/config/riscv/sifive-vector-builtins-bases.h > b/gcc/config/riscv/sifive-vector-builtins-bases.h > index 69e55409752..4ec1e304986 100644 > --- a/gcc/config/riscv/sifive-vector-builtins-bases.h > +++ b/gcc/config/riscv/sifive-vector-builtins-bases.h > @@ -23,6 +23,8 @@ > > namespace riscv_vector { > > +static const unsigned int CP_USE_COPROCESSORS = 1U << 6; > + > namespace bases { > extern const function_base *const sf_vqmacc; > extern const function_base *const sf_vqmaccu; > @@ -30,6 +32,7 @@ extern const function_base *const sf_vqmaccsu; > extern const function_base *const sf_vqmaccus; > extern const function_base *const sf_vfnrclip_x_f_qf; > extern const function_base *const sf_vfnrclip_xu_f_qf; > +extern const function_base *const sf_vc; > } > > } // end namespace riscv_vector > diff --git a/gcc/config/riscv/sifive-vector-builtins-functions.def > b/gcc/config/riscv/sifive-vector-builtins-functions.def > index e6621c77f53..f6703aee941 100644 > --- a/gcc/config/riscv/sifive-vector-builtins-functions.def > +++ b/gcc/config/riscv/sifive-vector-builtins-functions.def > @@ -55,4 +55,49 @@ DEF_RVV_FUNCTION (sf_vfnrclip_x_f_qf, sf_vfnrclip, > full_preds, i_clip_qf_ops) > DEF_RVV_FUNCTION (sf_vfnrclip_xu_f_qf, sf_vfnrclip, full_preds, > u_clip_qf_ops) > #undef REQUIRED_EXTENSIONS > > +#define REQUIRED_EXTENSIONS XSFVCP_EXT > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_x_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_i_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_vv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_xv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_iv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_fv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_vvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_xvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_ivv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_fvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_vvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_xvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_ivw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_fvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_x_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_i_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_vv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_xv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_iv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_fv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_vvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_xvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_ivv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_fvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_vvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_xvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_ivw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix_se, none_preds, sf_vc_v_fvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_x_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_i_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_vv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_xv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_iv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_fv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_vvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_xvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_ivv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_fvv_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_vvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_xvw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_ivw_ops) > +DEF_RVV_FUNCTION (sf_vc, sf_vcix, none_preds, sf_vc_v_fvw_ops) > +#undef REQUIRED_EXTENSIONS > + > #undef DEF_RVV_FUNCTION > diff --git a/gcc/config/riscv/sifive-vector.md > b/gcc/config/riscv/sifive-vector.md > index 2975b1e7a47..a416634d3b9 100644 > --- a/gcc/config/riscv/sifive-vector.md > +++ b/gcc/config/riscv/sifive-vector.md > @@ -182,3 +182,874 @@ (define_insn "@pred_sf_vfnrclip<v_su><mode>_x_f_qf" > "sf.vfnrclip.x<v_su>.f.qf\t%0,%3,%4%p1" > [(set_attr "type" "sf_vfnrclip") > (set_attr "mode" "<MODE>")]) > + > +;; SF_VCP > +(define_insn "@sf_vc_x_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:SI 2 "const_int_operand" "K") > + (match_operand:SI 3 "const_int_operand" "K") > + (match_operand:<VEL> 4 "register_operand" "r")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.x\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_x_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:SI 4 "const_int_operand" "K,K") > + (match_operand:<VEL> 5 "register_operand" "r,r")] UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.x\t%3,%4,%0,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_x<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:SI 4 "const_int_operand" "K,K") > + (match_operand:<VEL> 5 "register_operand" "r,r")] UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.x\t%3,%4,%0,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_i_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:SI 2 "const_int_operand" "K") > + (match_operand:SI 3 "const_int_operand" "K") > + (match_operand:SI 4 "const_int_operand" "P")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.i\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_i_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:SI 4 "const_int_operand" "K,K") > + (match_operand:SI 5 "const_int_operand" "P,P")] UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.i\t%3,%4,%0,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_i<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:SI 4 "const_int_operand" "K,K") > + (match_operand:SI 5 "const_int_operand" "P,P")] UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.i\t%3,%4,%0,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_vv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:SI 2 "const_int_operand" "K") > + (match_operand:VFULLI 3 "register_operand" "vr") > + (match_operand:VFULLI 4 "register_operand" "vr")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.vv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_vv_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vr,vr") > + (match_operand:VFULLI 5 "register_operand" "vr,vr")] > UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.vv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_vv<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vr,vr") > + (match_operand:VFULLI 5 "register_operand" "vr,vr")] > UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.vv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_xv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:SI 2 "const_int_operand" "K") > + (match_operand:VFULLI 3 "register_operand" "vr") > + (match_operand:<VEL> 4 "register_operand" "r")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.xv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_xv_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vd,vd") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vr,vr") > + (match_operand:<VEL> 5 "register_operand" "r,r")] UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.xv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_xv<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vd,vd") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vr,vr") > + (match_operand:<VEL> 5 "register_operand" "r,r")] UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.xv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_iv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:SI 2 "const_int_operand" "K") > + (match_operand:VFULLI 3 "register_operand" "vr") > + (match_operand:SI 4 "const_int_operand" "P")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.iv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_iv_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vd,vd") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vr,vr") > + (match_operand:SI 5 "const_int_operand" "P,P")] UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.iv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_iv<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vd,vd") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vr,vr") > + (match_operand:SI 5 "const_int_operand" "P,P")] UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.iv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_fv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:SF_FV > + [(match_operand:SI 1 "const_int_operand" "Ou01") > + (match_operand:SI 2 "const_int_operand" "K") > + (match_operand:SF_FV 3 "register_operand" "vr") > + (match_operand:<SF_XF> 4 "register_operand" "f")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.fv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_fv_se<mode>" > + [(set (match_operand:SF_FV 0 "register_operand" "=&vd,vd") > + (if_then_else:SF_FV > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:SF_FV > + [(match_operand:SI 3 "const_int_operand" "Ou01,Ou01") > + (match_operand:SF_FV 4 "register_operand" "vr,vr") > + (match_operand:<SF_XF> 5 "register_operand" "f,f")] > UNSPECV_SF_CV) > + (match_operand:SF_FV 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.fv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_fv<mode>" > + [(set (match_operand:SF_FV 0 "register_operand" "=&vd,vd") > + (if_then_else:SF_FV > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 6 "vector_length_operand" " rK, > rK") > + (match_operand 7 "const_int_operand" " i, > i") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:SF_FV > + [(match_operand:SI 3 "const_int_operand" "Ou01,Ou01") > + (match_operand:SF_FV 4 "register_operand" "vr,vr") > + (match_operand:<SF_XF> 5 "register_operand" "f,f")] UNSPEC_SF_CV) > + (match_operand:SF_FV 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.fv\t%3,%0,%4,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_vvv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" "vmWc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:VFULLI 2 "register_operand" "vd") > + (match_operand:VFULLI 3 "register_operand" "vr") > + (match_operand:VFULLI 4 "register_operand" "vr")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.vvv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_vvv_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vd,vd") > + (match_operand:VFULLI 5 "register_operand" "vr,vr") > + (match_operand:VFULLI 6 "register_operand" "vr,vr")] > UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.vvv\t%3,%4,%6,%5" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_vvv<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vd,vd") > + (match_operand:VFULLI 5 "register_operand" "vr,vr") > + (match_operand:VFULLI 6 "register_operand" "vr,vr")] > UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.vvv\t%3,%4,%6,%5" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_xvv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:VFULLI 2 "register_operand" "vd") > + (match_operand:VFULLI 3 "register_operand" "vr") > + (match_operand:<VEL> 4 "register_operand" "r")] > UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.xvv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_xvv_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vd,vd") > + (match_operand:VFULLI 5 "register_operand" "vr,vr") > + (match_operand:<VEL> 6 "register_operand" "r,r")] UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.xvv\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_xvv<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vd,vd") > + (match_operand:VFULLI 5 "register_operand" "vr,vr") > + (match_operand:<VEL> 6 "register_operand" "r,r")] UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.xvv\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_ivv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:VFULLI 2 "register_operand" "vd") > + (match_operand:VFULLI 3 "register_operand" "vr") > + (match_operand:SI 4 "const_int_operand" "P")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.ivv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_ivv_se<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vd,vd") > + (match_operand:VFULLI 5 "register_operand" "vr,vr") > + (match_operand:SI 6 "const_int_operand" "P,P")] UNSPECV_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.ivv\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_ivv<mode>" > + [(set (match_operand:VFULLI 0 "register_operand" "=&vr,vr") > + (if_then_else:VFULLI > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:VFULLI > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:VFULLI 4 "register_operand" "vd,vd") > + (match_operand:VFULLI 5 "register_operand" "vr,vr") > + (match_operand:SI 6 "const_int_operand" "P,P")] UNSPEC_SF_CV) > + (match_operand:VFULLI 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.ivv\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_fvv_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:SF_FV > + [(match_operand:SI 1 "const_int_operand" "Ou01") > + (match_operand:SF_FV 2 "register_operand" "vd") > + (match_operand:SF_FV 3 "register_operand" "vr") > + (match_operand:<SF_XF> 4 "register_operand" "f")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.fvv\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_fvv_se<mode>" > + [(set (match_operand:SF_FV 0 "register_operand" "=&vr,vr") > + (if_then_else:SF_FV > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:SF_FV > + [(match_operand:SI 3 "const_int_operand" "Ou01,Ou01") > + (match_operand:SF_FV 4 "register_operand" "vd,vd") > + (match_operand:SF_FV 5 "register_operand" "vr,vr") > + (match_operand:<SF_XF> 6 "register_operand" "f,f")] > UNSPECV_SF_CV) > + (match_operand:SF_FV 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.fvv\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_fvv<mode>" > + [(set (match_operand:SF_FV 0 "register_operand" "=&vr,vr") > + (if_then_else:SF_FV > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:SF_FV > + [(match_operand:SI 3 "const_int_operand" "Ou01,Ou01") > + (match_operand:SF_FV 4 "register_operand" "vd,vd") > + (match_operand:SF_FV 5 "register_operand" "vr,vr") > + (match_operand:<SF_XF> 6 "register_operand" "f,f")] UNSPEC_SF_CV) > + (match_operand:SF_FV 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.fvv\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_vvw_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:<SF_VW> 2 "register_operand" "vd") > + (match_operand:SF_VC_W 3 "register_operand" "vr") > + (match_operand:SF_VC_W 4 "register_operand" "vr")] > UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.vvw\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_vvw_se<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_W 5 "register_operand" "vr,vr") > + (match_operand:SF_VC_W 6 "register_operand" "vr,vr")] > UNSPECV_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.vvw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_vvw<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_W 5 "register_operand" "vr,vr") > + (match_operand:SF_VC_W 6 "register_operand" "vr,vr")] > UNSPEC_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.vvw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_xvw_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:<SF_VW> 2 "register_operand" "vd") > + (match_operand:SF_VC_W 3 "register_operand" "vr") > + (match_operand:<VEL> 4 "register_operand" "r")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.xvw\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_xvw_se<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_W 5 "register_operand" "vr,vr") > + (match_operand:<VEL> 6 "register_operand" "r,r")] UNSPECV_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.xvw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_xvw<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_W 5 "register_operand" "vr,vr") > + (match_operand:<VEL> 6 "register_operand" "r,r")] UNSPEC_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.xvw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_ivw_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 1 "const_int_operand" "Ou02") > + (match_operand:<SF_VW> 2 "register_operand" "vd") > + (match_operand:SF_VC_W 3 "register_operand" "vr") > + (match_operand:SI 4 "immediate_operand" "P")] UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.ivw\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_ivw_se<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec_volatile:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_W 5 "register_operand" "vr,vr") > + (match_operand:SI 6 "immediate_operand" "P,P")] UNSPEC_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.ivw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_ivw<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou02,Ou02") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_W 5 "register_operand" "vr,vr") > + (match_operand:SI 6 "immediate_operand" "P,P")] UNSPEC_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.ivw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_fvw_se<mode>" > + [(unspec:<VM> > + [(match_operand:<VM> 0 "vector_mask_operand" " Wc1") > + (match_operand 5 "vector_length_operand" " rK") > + (match_operand 6 "const_int_operand" " i") > + (match_operand 7 "const_int_operand" " i") > + (match_operand 8 "const_int_operand" " i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 1 "const_int_operand" "Ou01") > + (match_operand:<SF_VW> 2 "register_operand" "vd") > + (match_operand:SF_VC_FW 3 "register_operand" "vr") > + (match_operand:<SF_XFW> 4 "register_operand" "f")] > UNSPECV_SF_CV)] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.fvw\t%1,%2,%3,%4" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_fvw_se<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec_volatile:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou01,Ou01") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_FW 5 "register_operand" "vr,vr") > + (match_operand:<SF_XFW> 6 "register_operand" "f,f")] > UNSPECV_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.fvw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc_se") > + (set_attr "mode" "<MODE>")]) > + > +(define_insn "@sf_vc_v_fvw<mode>" > + [(set (match_operand:<SF_VW> 0 "register_operand" "=&vr,vr") > + (if_then_else:<SF_VW> > + (unspec:<VM> > + [(match_operand:<VM> 1 "vector_mask_operand" " > Wc1,Wc1") > + (match_operand 7 "vector_length_operand" " rK, > rK") > + (match_operand 8 "const_int_operand" " i, > i") > + (match_operand 9 "const_int_operand" " i, > i") > + (match_operand 10 "const_int_operand" " i, > i") > + (reg:SI VL_REGNUM) > + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) > + (unspec:<SF_VW> > + [(match_operand:SI 3 "const_int_operand" "Ou01,Ou01") > + (match_operand:<SF_VW> 4 "register_operand" "vd,vd") > + (match_operand:SF_VC_FW 5 "register_operand" "vr,vr") > + (match_operand:<SF_XFW> 6 "register_operand" "f,f")] > UNSPEC_SF_CV) > + (match_operand:<SF_VW> 2 "vector_merge_operand" "vu,vu")))] > + "TARGET_VECTOR && TARGET_XSFVCP" > + "sf.vc.v.fvw\t%3,%4,%5,%6" > + [(set_attr "type" "sf_vc") > + (set_attr "mode" "<MODE>")]) > diff --git a/gcc/config/riscv/vector-iterators.md > b/gcc/config/riscv/vector-iterators.md > index f8da71b1d65..5687e8a613c 100644 > --- a/gcc/config/riscv/vector-iterators.md > +++ b/gcc/config/riscv/vector-iterators.md > @@ -120,10 +120,12 @@ (define_c_enum "unspec" [ > > UNSPEC_SF_VFNRCLIP > UNSPEC_SF_VFNRCLIPU > + UNSPEC_SF_CV > ]) > > (define_c_enum "unspecv" [ > UNSPECV_FRM_RESTORE_EXIT > + UNSPECV_SF_CV > ]) > > ;; Subset of VI with fractional LMUL types > @@ -4873,3 +4875,50 @@ (define_mode_attr sf_xfqf [ > (RVVM1QI "rvvm4sf") > (RVVM2QI "rvvm8sf") > ]) > + > + > +(define_mode_iterator SF_VC_W [ > + RVVM4QI RVVM2QI RVVM1QI RVVMF2QI RVVMF4QI (RVVMF8QI "TARGET_MIN_VLEN > 32") > + RVVM4HI RVVM2HI RVVM1HI RVVMF2HI (RVVMF4HI "TARGET_MIN_VLEN > 32") > + RVVM4SI RVVM2SI RVVM1SI (RVVMF2SI "TARGET_MIN_VLEN > 32") > +]) > + > +(define_mode_attr SF_VW [ > + (RVVM4QI "RVVM8HI") (RVVM2QI "RVVM4HI") (RVVM1QI "RVVM2HI") (RVVMF2QI > "RVVM1HI") > + (RVVMF4QI "RVVMF2HI") (RVVMF8QI "RVVMF4HI") > + (RVVM4HI "RVVM8SI") (RVVM2HI "RVVM4SI") (RVVM1HI "RVVM2SI") (RVVMF2HI > "RVVM1SI") > + (RVVMF4HI "RVVMF2SI") > + (RVVM4SI "RVVM8DI") (RVVM2SI "RVVM4DI") (RVVM1SI "RVVM2DI") (RVVMF2SI > "RVVM1DI") > +]) > + > +(define_mode_attr sf_vw [ > + (RVVM4QI "rvvm8hi") (RVVM2QI "rvvm4hi") (RVVM1QI "rvvm2hi") (RVVMF2QI > "rvvm1hi") > + (RVVMF4QI "rvvmf2hi") (RVVMF8QI "rvvmf4hi") > + (RVVM4HI "rvvm8si") (RVVM2HI "rvvm4si") (RVVM1HI "rvvm2si") (RVVMF2HI > "rvvm1si") > + (RVVMF4HI "rvvmf2si") > + (RVVM4SI "rvvm8di") (RVVM2SI "rvvm4di") (RVVM1SI "rvvm2di") (RVVMF2SI > "rvvm1di") > +]) > + > +(define_mode_iterator SF_FV [ > + RVVM8HI RVVM4HI RVVM2HI RVVM1HI RVVMF2HI (RVVMF4HI "TARGET_MIN_VLEN > 32") > + RVVM8SI RVVM4SI RVVM2SI RVVM1SI (RVVMF2SI "TARGET_MIN_VLEN > 32") > + (RVVM8DI "TARGET_VECTOR_ELEN_64") (RVVM4DI "TARGET_VECTOR_ELEN_64") > + (RVVM2DI "TARGET_VECTOR_ELEN_64") (RVVM1DI "TARGET_VECTOR_ELEN_64") > +]) > + > + > +(define_mode_iterator SF_VC_FW [ > + RVVM4HI RVVM2HI RVVM1HI RVVMF2HI (RVVMF4HI "TARGET_MIN_VLEN > 32") > + RVVM4SI RVVM2SI RVVM1SI (RVVMF2SI "TARGET_MIN_VLEN > 32") > +]) > + > +(define_mode_attr SF_XF [ > + (RVVM8HI "HF") (RVVM4HI "HF") (RVVM2HI "HF") (RVVM1HI "HF") (RVVMF2HI > "HF") (RVVMF4HI "HF") > + (RVVM8SI "SF") (RVVM4SI "SF") (RVVM2SI "SF") (RVVM1SI "SF") (RVVMF2SI "SF") > + (RVVM8DI "DF") (RVVM4DI "DF") (RVVM2DI "DF") (RVVM1DI "DF") > +]) > + > +(define_mode_attr SF_XFW [ > + (RVVM4HI "HF") (RVVM2HI "HF") (RVVM1HI "HF") (RVVMF2HI "HF") (RVVMF4HI > "HF") > + (RVVM4SI "SF") (RVVM2SI "SF") (RVVM1SI "SF") (RVVMF2SI "SF") > +]) > diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md > index 3ab4d76e6c6..5191ae48808 100644 > --- a/gcc/config/riscv/vector.md > +++ b/gcc/config/riscv/vector.md > @@ -56,8 +56,7 @@ (define_attr "has_vtype_op" "false,true" > > vssegtux,vssegtox,vlsegdff,vandn,vbrev,vbrev8,vrev8,vcpop,vclz,vctz,vrol,\ > > vror,vwsll,vclmul,vclmulh,vghsh,vgmul,vaesef,vaesem,vaesdf,vaesdm,\ > > vaeskf1,vaeskf2,vaesz,vsha2ms,vsha2ch,vsha2cl,vsm4k,vsm4r,vsm3me,vsm3c,\ > - vfncvtbf16,vfwcvtbf16,vfwmaccbf16,\ > - sf_vqmacc,sf_vfnrclip") > + > vfncvtbf16,vfwcvtbf16,vfwmaccbf16,sf_vqmacc,sf_vfnrclip,sf_vc,sf_vc_se") > (const_string "true")] > (const_string "false"))) > > -- > 2.34.1 >