diff options
author | xuli <xuli1@eswincomputing.com> | 2023-09-12 03:11:58 +0000 |
---|---|---|
committer | xuli <xuli1@eswincomputing.com> | 2023-09-12 03:15:23 +0000 |
commit | c1e4efd8ae3488c5a2c11ac42d4670b67e1f7bf4 (patch) | |
tree | a292c1fca295568d9b15f832444d64004fcd9562 /gcc/config | |
parent | 721021a18e2ac004140ddd93113c11075ea890c6 (diff) | |
download | gcc-c1e4efd8ae3488c5a2c11ac42d4670b67e1f7bf4.zip gcc-c1e4efd8ae3488c5a2c11ac42d4670b67e1f7bf4.tar.gz gcc-c1e4efd8ae3488c5a2c11ac42d4670b67e1f7bf4.tar.bz2 |
RISC-V: Add vcreate intrinsics for RVV tuple types
gcc/ChangeLog:
* config/riscv/riscv-vector-builtins-bases.cc (class vcreate): New class.
(BASE): Ditto.
* config/riscv/riscv-vector-builtins-bases.h: Ditto.
* config/riscv/riscv-vector-builtins-functions.def (vcreate): Add vcreate support.
* config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): Ditto.
(SHAPE): Ditto.
* config/riscv/riscv-vector-builtins-shapes.h: Ditto.
* config/riscv/riscv-vector-builtins.cc: Add args type.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/base/tuple_create.c: New test.
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins-bases.cc | 40 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins-bases.h | 1 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins-functions.def | 1 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins-shapes.cc | 50 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins-shapes.h | 1 | ||||
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins.cc | 12 |
6 files changed, 105 insertions, 0 deletions
diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index 8e679f7..be3df2c 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -1824,6 +1824,44 @@ public: } }; +class vcreate : public function_base +{ +public: + gimple *fold (gimple_folder &f) const override + { + unsigned int nargs = gimple_call_num_args (f.call); + tree lhs_type = TREE_TYPE (f.lhs); + + /* Replace the call with a clobber of the result (to prevent it from + becoming upwards exposed) followed by stores into each individual + vector of tuple. + + The fold routines expect the replacement statement to have the + same lhs as the original call, so return the clobber statement + rather than the final vector store. */ + gassign *clobber = gimple_build_assign (f.lhs, build_clobber (lhs_type)); + + for (unsigned int i = nargs; i-- > 0; ) + { + tree rhs_vector = gimple_call_arg (f.call, i); + tree field = tuple_type_field (TREE_TYPE (f.lhs)); + tree lhs_array = build3 (COMPONENT_REF, TREE_TYPE (field), + unshare_expr (f.lhs), field, NULL_TREE); + tree lhs_vector = build4 (ARRAY_REF, TREE_TYPE (rhs_vector), + lhs_array, size_int (i), + NULL_TREE, NULL_TREE); + gassign *assign = gimple_build_assign (lhs_vector, rhs_vector); + gsi_insert_after (f.gsi, assign, GSI_SAME_STMT); + } + return clobber; + } + + rtx expand (function_expander &e) const override + { + return NULL_RTX; + } +}; + class read_vl : public function_base { public: @@ -2285,6 +2323,7 @@ static CONSTEXPR const vlmul_ext vlmul_ext_obj; static CONSTEXPR const vlmul_trunc vlmul_trunc_obj; static CONSTEXPR const vset vset_obj; static CONSTEXPR const vget vget_obj; +static CONSTEXPR const vcreate vcreate_obj; static CONSTEXPR const read_vl read_vl_obj; static CONSTEXPR const vleff vleff_obj; static CONSTEXPR const vlenb vlenb_obj; @@ -2546,6 +2585,7 @@ BASE (vlmul_ext) BASE (vlmul_trunc) BASE (vset) BASE (vget) +BASE (vcreate) BASE (read_vl) BASE (vleff) BASE (vlenb) diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.h b/gcc/config/riscv/riscv-vector-builtins-bases.h index 69d4562..131041e 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.h +++ b/gcc/config/riscv/riscv-vector-builtins-bases.h @@ -267,6 +267,7 @@ extern const function_base *const vlmul_ext; extern const function_base *const vlmul_trunc; extern const function_base *const vset; extern const function_base *const vget; +extern const function_base *const vcreate; extern const function_base *const read_vl; extern const function_base *const vleff; extern const function_base *const vlenb; diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def b/gcc/config/riscv/riscv-vector-builtins-functions.def index 3ce06dc..18ed2c2 100644 --- a/gcc/config/riscv/riscv-vector-builtins-functions.def +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def @@ -621,6 +621,7 @@ DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul4_x2_ops) // Tuple types DEF_RVV_FUNCTION (vset, vset, none_preds, all_v_vset_tuple_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_tuple_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_tuple_ops) DEF_RVV_FUNCTION (vlseg, seg_loadstore, full_preds, tuple_v_scalar_const_ptr_ops) DEF_RVV_FUNCTION (vsseg, seg_loadstore, none_m_preds, tuple_v_scalar_ptr_ops) DEF_RVV_FUNCTION (vlsseg, seg_loadstore, full_preds, tuple_v_scalar_const_ptr_ptrdiff_ops) diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc b/gcc/config/riscv/riscv-vector-builtins-shapes.cc index f8fdec8..0bda934 100644 --- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc @@ -706,6 +706,55 @@ struct vget_def : public misc_def } }; +/* vcreate_def class. */ +struct vcreate_def : public build_base +{ + void build (function_builder &b, + const function_group_info &group) const override + { + for (unsigned int vec_type_idx = 0; + group.ops_infos.types[vec_type_idx].index != NUM_VECTOR_TYPES; + ++vec_type_idx) + { + auto_vec<tree, 8> argument_types; + function_instance function_instance (group.base_name, *group.base, + *group.shape, + group.ops_infos.types[vec_type_idx], + group.preds[0], &group.ops_infos); + + tree return_type = group.ops_infos.ret.get_tree_type ( + group.ops_infos.types[vec_type_idx].index); + + if (!return_type) + continue; + + machine_mode mode = TYPE_MODE (return_type); + unsigned int nf = get_nf (mode); + + 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)); + + b.add_unique_function (function_instance, (*group.shape), return_type, + argument_types); + } + } + + char *get_name (function_builder &b, const function_instance &instance, + bool overloaded_p) const override + { + if (overloaded_p) + return nullptr; + b.append_base_name (instance.base_name); + b.append_name (operand_suffixes[instance.op_info->op]); + vector_type_index ret_type_idx + = instance.op_info->ret.get_function_type_index (instance.type.index); + b.append_name (type_suffixes[ret_type_idx].vector); + return b.finish_name (); + } +}; + /* read_vl_def class. */ struct read_vl_def : public function_shape { @@ -942,6 +991,7 @@ SHAPE(vundefined, vundefined) SHAPE(misc, misc) SHAPE(vset, vset) SHAPE(vget, vget) +SHAPE(vcreate, vcreate) SHAPE(read_vl, read_vl) SHAPE(fault_load, fault_load) SHAPE(vlenb, vlenb) diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.h b/gcc/config/riscv/riscv-vector-builtins-shapes.h index 92eb8bc..df9884b 100644 --- a/gcc/config/riscv/riscv-vector-builtins-shapes.h +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.h @@ -45,6 +45,7 @@ extern const function_shape *const vundefined; extern const function_shape *const misc; extern const function_shape *const vset; extern const function_shape *const vget; +extern const function_shape *const vcreate; extern const function_shape *const read_vl; extern const function_shape *const fault_load; extern const function_shape *const vlenb; diff --git a/gcc/config/riscv/riscv-vector-builtins.cc b/gcc/config/riscv/riscv-vector-builtins.cc index 6d99f97..5318651 100644 --- a/gcc/config/riscv/riscv-vector-builtins.cc +++ b/gcc/config/riscv/riscv-vector-builtins.cc @@ -873,6 +873,10 @@ static CONSTEXPR const rvv_arg_type_info tuple_vset_args[] = {rvv_arg_type_info (RVV_BASE_vector), rvv_arg_type_info (RVV_BASE_size), rvv_arg_type_info (RVV_BASE_tuple_subpart), rvv_arg_type_info_end}; +/* A list of args for vector_type func (vector_type) function. */ +static CONSTEXPR const rvv_arg_type_info tuple_vcreate_args[] + = {rvv_arg_type_info (RVV_BASE_tuple_subpart), 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}; @@ -2497,6 +2501,14 @@ static CONSTEXPR const rvv_op_info tuple_v_scalar_const_ptr_size_ptr_ops rvv_arg_type_info (RVV_BASE_vector), /* Return type */ scalar_const_ptr_size_ptr_args /* Args */}; +/* A static operand information for vector_type func (vector_type) + * function registration. */ +static CONSTEXPR const rvv_op_info all_v_vcreate_tuple_ops + = {tuple_ops, /* Types */ + OP_TYPE_v, /* Suffix */ + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ + tuple_vcreate_args /* Args */}; + /* A list of all RVV base function types. */ static CONSTEXPR const function_type_info function_types[] = { #define DEF_RVV_TYPE_INDEX( \ |