Re: Re: [PATCH] RISC-V: Support vcreate intrinsics for non-tuple types

2023-11-01 Thread Li Xu
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

2023-11-01 Thread juzhe.zh...@rivai.ai
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