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/riscv/riscv-vector-builtins-bases.cc | |
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/riscv/riscv-vector-builtins-bases.cc')
-rw-r--r-- | gcc/config/riscv/riscv-vector-builtins-bases.cc | 40 |
1 files changed, 40 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) |