Re: Re: [PATCH] RISC-V: Support vcreate intrinsics for non-tuple types
Committed, thanks juzhe. xu...@eswincomputing.com From: juzhe.zh...@rivai.ai Date: 2023-11-02 09:00 To: Li Xu; gcc-patches CC: kito.cheng; palmer; Li Xu Subject: Re: [PATCH] RISC-V: Support vcreate intrinsics for non-tuple types LGTM. Thanks. juzhe.zh...@rivai.ai From: Li Xu Date: 2023-11-02 08:54 To: gcc-patches CC: kito.cheng; palmer; juzhe.zhong; xuli Subject: [PATCH] RISC-V: Support vcreate intrinsics for non-tuple types From: xuli https://github.com/riscv-non-isa/rvv-intrinsic-doc/pull/288 gcc/ChangeLog: * config/riscv/riscv-vector-builtins-bases.cc: Expand non-tuple intrinsics. * config/riscv/riscv-vector-builtins-functions.def (vcreate): Define non-tuple intrinsics. * config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): Ditto. * config/riscv/riscv-vector-builtins.cc: Add arg types. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/base/tuple_create.c: Rename to vcreate.c. * gcc.target/riscv/rvv/base/vcreate.c: New test. --- .../riscv/riscv-vector-builtins-bases.cc | 21 +- .../riscv/riscv-vector-builtins-functions.def | 6 + .../riscv/riscv-vector-builtins-shapes.cc | 25 +- gcc/config/riscv/riscv-vector-builtins.cc | 53 .../gcc.target/riscv/rvv/base/tuple_create.c | 123 - .../gcc.target/riscv/rvv/base/vcreate.c | 260 ++ 6 files changed, 357 insertions(+), 131 deletions(-) delete mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/tuple_create.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/vcreate.c diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index 0b1409a52e0..25ba31e2659 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -1798,6 +1798,10 @@ public: { unsigned int nargs = gimple_call_num_args (f.call); tree lhs_type = TREE_TYPE (f.lhs); +/* LMUL > 1 non-tuple vector types are not structure, + we can't use __val[index] to set the subpart. */ +if (!riscv_v_ext_tuple_mode_p (TYPE_MODE (lhs_type))) + return NULL; /* Replace the call with a clobber of the result (to prevent it from becoming upwards exposed) followed by stores into each individual @@ -1823,9 +1827,22 @@ public: return clobber; } - rtx expand (function_expander &) const override + rtx expand (function_expander ) const override { -gcc_unreachable (); +if (!e.target) + return NULL_RTX; +gcc_assert (riscv_v_ext_vector_mode_p (GET_MODE (e.target))); +unsigned int nargs = call_expr_nargs (e.exp); +for (unsigned int i = 0; i < nargs; i++) + { + rtx src = expand_normal (CALL_EXPR_ARG (e.exp, i)); + poly_int64 offset = i * GET_MODE_SIZE (GET_MODE (src)); + rtx subreg = simplify_gen_subreg (GET_MODE (src), e.target, + GET_MODE (e.target), offset); + emit_move_insn (subreg, src); + } + +return e.target; } }; diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def b/gcc/config/riscv/riscv-vector-builtins-functions.def index 911fd520195..1c37fd5fffe 100644 --- a/gcc/config/riscv/riscv-vector-builtins-functions.def +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def @@ -617,6 +617,12 @@ DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul1_x8_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul2_x2_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul2_x4_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul4_x2_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul1_x2_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul1_x4_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul1_x8_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul2_x2_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul2_x4_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul4_x2_ops) // Tuple types DEF_RVV_FUNCTION (vset, vset, none_preds, all_v_vset_tuple_ops) diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc b/gcc/config/riscv/riscv-vector-builtins-shapes.cc index 0bda934ae16..72b0d6a96a3 100644 --- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc @@ -728,13 +728,17 @@ struct vcreate_def : public build_base if (!return_type) continue; - machine_mode mode = TYPE_MODE (return_type); - unsigned int nf = get_nf (mode); + tree arg_type = function_instance.op_info->args[0].get_tree_type ( + function_instance.type.index); - for (unsigned int i = 0; i < nf; i++) - argument_types.quick_push ( - function_instance.op_info->args[0].get_tree_type ( - function_instance.type.index)); + machine_mode outer_mode = TYPE_MODE (return_type); + machine_mode inner_mode = TYPE_MODE (arg_type); + unsigned int nargs + = exact_div (GET_MODE_SIZE (outer_mode), GET_MO
Re: [PATCH] RISC-V: Support vcreate intrinsics for non-tuple types
LGTM. Thanks. juzhe.zh...@rivai.ai From: Li Xu Date: 2023-11-02 08:54 To: gcc-patches CC: kito.cheng; palmer; juzhe.zhong; xuli Subject: [PATCH] RISC-V: Support vcreate intrinsics for non-tuple types From: xuli https://github.com/riscv-non-isa/rvv-intrinsic-doc/pull/288 gcc/ChangeLog: * config/riscv/riscv-vector-builtins-bases.cc: Expand non-tuple intrinsics. * config/riscv/riscv-vector-builtins-functions.def (vcreate): Define non-tuple intrinsics. * config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): Ditto. * config/riscv/riscv-vector-builtins.cc: Add arg types. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/base/tuple_create.c: Rename to vcreate.c. * gcc.target/riscv/rvv/base/vcreate.c: New test. --- .../riscv/riscv-vector-builtins-bases.cc | 21 +- .../riscv/riscv-vector-builtins-functions.def | 6 + .../riscv/riscv-vector-builtins-shapes.cc | 25 +- gcc/config/riscv/riscv-vector-builtins.cc | 53 .../gcc.target/riscv/rvv/base/tuple_create.c | 123 - .../gcc.target/riscv/rvv/base/vcreate.c | 260 ++ 6 files changed, 357 insertions(+), 131 deletions(-) delete mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/tuple_create.c create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/vcreate.c diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index 0b1409a52e0..25ba31e2659 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -1798,6 +1798,10 @@ public: { unsigned int nargs = gimple_call_num_args (f.call); tree lhs_type = TREE_TYPE (f.lhs); +/* LMUL > 1 non-tuple vector types are not structure, + we can't use __val[index] to set the subpart. */ +if (!riscv_v_ext_tuple_mode_p (TYPE_MODE (lhs_type))) + return NULL; /* Replace the call with a clobber of the result (to prevent it from becoming upwards exposed) followed by stores into each individual @@ -1823,9 +1827,22 @@ public: return clobber; } - rtx expand (function_expander &) const override + rtx expand (function_expander ) const override { -gcc_unreachable (); +if (!e.target) + return NULL_RTX; +gcc_assert (riscv_v_ext_vector_mode_p (GET_MODE (e.target))); +unsigned int nargs = call_expr_nargs (e.exp); +for (unsigned int i = 0; i < nargs; i++) + { + rtx src = expand_normal (CALL_EXPR_ARG (e.exp, i)); + poly_int64 offset = i * GET_MODE_SIZE (GET_MODE (src)); + rtx subreg = simplify_gen_subreg (GET_MODE (src), e.target, + GET_MODE (e.target), offset); + emit_move_insn (subreg, src); + } + +return e.target; } }; diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def b/gcc/config/riscv/riscv-vector-builtins-functions.def index 911fd520195..1c37fd5fffe 100644 --- a/gcc/config/riscv/riscv-vector-builtins-functions.def +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def @@ -617,6 +617,12 @@ DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul1_x8_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul2_x2_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul2_x4_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul4_x2_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul1_x2_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul1_x4_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul1_x8_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul2_x2_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul2_x4_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_lmul4_x2_ops) // Tuple types DEF_RVV_FUNCTION (vset, vset, none_preds, all_v_vset_tuple_ops) diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc b/gcc/config/riscv/riscv-vector-builtins-shapes.cc index 0bda934ae16..72b0d6a96a3 100644 --- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc @@ -728,13 +728,17 @@ struct vcreate_def : public build_base if (!return_type) continue; - machine_mode mode = TYPE_MODE (return_type); - unsigned int nf = get_nf (mode); + tree arg_type = function_instance.op_info->args[0].get_tree_type ( + function_instance.type.index); - for (unsigned int i = 0; i < nf; i++) - argument_types.quick_push ( - function_instance.op_info->args[0].get_tree_type ( - function_instance.type.index)); + machine_mode outer_mode = TYPE_MODE (return_type); + machine_mode inner_mode = TYPE_MODE (arg_type); + unsigned int nargs + = exact_div (GET_MODE_SIZE (outer_mode), GET_MODE_SIZE (inner_mode)) + .to_constant (); + + for (unsigned int i = 0; i < nargs; i++) + argument_types.quick_push (arg_type); b.add_unique_function (function_instance, (*group.shape), return_type, argument_types); @@ -748,6 +752,15 @@ struct