aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorxuli <xuli1@eswincomputing.com>2023-09-12 03:11:58 +0000
committerxuli <xuli1@eswincomputing.com>2023-09-12 03:15:23 +0000
commitc1e4efd8ae3488c5a2c11ac42d4670b67e1f7bf4 (patch)
treea292c1fca295568d9b15f832444d64004fcd9562 /gcc/config
parent721021a18e2ac004140ddd93113c11075ea890c6 (diff)
downloadgcc-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.cc40
-rw-r--r--gcc/config/riscv/riscv-vector-builtins-bases.h1
-rw-r--r--gcc/config/riscv/riscv-vector-builtins-functions.def1
-rw-r--r--gcc/config/riscv/riscv-vector-builtins-shapes.cc50
-rw-r--r--gcc/config/riscv/riscv-vector-builtins-shapes.h1
-rw-r--r--gcc/config/riscv/riscv-vector-builtins.cc12
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( \