Re: [PATCH] RISC-V: Fix PR109228

2023-03-22 Thread Kito Cheng via Gcc-patches
committed as 
https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=116a8678840f9f52ec14639ff07e302a8c429f32
with few comment tweak.

On Wed, Mar 22, 2023 at 1:06 PM  wrote:
>
> From: Ju-Zhe Zhong 
>
> This patch fix PR109228
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109228
>
> gcc/ChangeLog:
>
> * config/riscv/riscv-vector-builtins-bases.cc (class vlenb): Add 
> __riscv_vlenb support.
> (BASE): Ditto.
> * config/riscv/riscv-vector-builtins-bases.h: Ditto.
> * config/riscv/riscv-vector-builtins-functions.def (vlenb): Ditto.
> * config/riscv/riscv-vector-builtins-shapes.cc (struct vlenb_def): 
> Ditto.
> (SHAPE): Ditto.
> * config/riscv/riscv-vector-builtins-shapes.h: Ditto.
> * config/riscv/riscv-vector-builtins.cc: Ditto.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.target/riscv/rvv/base/vlenb-1.c: New test.
>
> ---
>  .../riscv/riscv-vector-builtins-bases.cc  | 17 +++
>  .../riscv/riscv-vector-builtins-bases.h   |  1 +
>  .../riscv/riscv-vector-builtins-functions.def |  1 +
>  .../riscv/riscv-vector-builtins-shapes.cc | 25 ++
>  .../riscv/riscv-vector-builtins-shapes.h  |  1 +
>  gcc/config/riscv/riscv-vector-builtins.cc |  7 +++
>  .../gcc.target/riscv/rvv/base/vlenb-1.c   | 46 +++
>  7 files changed, 98 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/vlenb-1.c
>
> diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc 
> b/gcc/config/riscv/riscv-vector-builtins-bases.cc
> index 839eb66efb2..52467bbc961 100644
> --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc
> +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc
> @@ -1658,6 +1658,21 @@ public:
>}
>  };
>
> +/* Implements vlenb.  */
> +class vlenb : public function_base
> +{
> +public:
> +  bool apply_vl_p () const override { return false; }
> +
> +  rtx expand (function_expander &e) const override
> +  {
> +machine_mode mode = GET_MODE (e.target);
> +rtx vlenb = gen_int_mode (BYTES_PER_RISCV_VECTOR, mode);
> +emit_move_insn (e.target, vlenb);
> +return e.target;
> +  }
> +};
> +
>  static CONSTEXPR const vsetvl vsetvl_obj;
>  static CONSTEXPR const vsetvl vsetvlmax_obj;
>  static CONSTEXPR const loadstore vle_obj;
> @@ -1868,6 +1883,7 @@ static CONSTEXPR const vset vset_obj;
>  static CONSTEXPR const vget vget_obj;
>  static CONSTEXPR const read_vl read_vl_obj;
>  static CONSTEXPR const vleff vleff_obj;
> +static CONSTEXPR const vlenb vlenb_obj;
>
>  /* Declare the function base NAME, pointing it to an instance
> of class _obj.  */
> @@ -2084,5 +2100,6 @@ BASE (vset)
>  BASE (vget)
>  BASE (read_vl)
>  BASE (vleff)
> +BASE (vlenb)
>
>  } // end namespace riscv_vector
> diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.h 
> b/gcc/config/riscv/riscv-vector-builtins-bases.h
> index 14e8a55cd97..0196f80b69e 100644
> --- a/gcc/config/riscv/riscv-vector-builtins-bases.h
> +++ b/gcc/config/riscv/riscv-vector-builtins-bases.h
> @@ -240,6 +240,7 @@ extern const function_base *const vset;
>  extern const function_base *const vget;
>  extern const function_base *const read_vl;
>  extern const function_base *const vleff;
> +extern const function_base *const vlenb;
>  }
>
>  } // end namespace riscv_vector
> diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def 
> b/gcc/config/riscv/riscv-vector-builtins-functions.def
> index 198ccfd86b7..3f1513cb9fd 100644
> --- a/gcc/config/riscv/riscv-vector-builtins-functions.def
> +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def
> @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
>
>  /* Internal helper functions for gimple fold use.  */
>  DEF_RVV_FUNCTION (read_vl, read_vl, none_preds, p_none_void_ops)
> +DEF_RVV_FUNCTION (vlenb, vlenb, none_preds, ul_none_void_ops)
>
>  /* 6. Configuration-Setting Instructions.  */
>
> diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc 
> b/gcc/config/riscv/riscv-vector-builtins-shapes.cc
> index edb0d34b81c..0682f81400a 100644
> --- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc
> +++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc
> @@ -553,6 +553,30 @@ struct fault_load_def : public build_base
>}
>  };
>
> +/* vlenb_def class.  */
> +struct vlenb_def : public function_shape
> +{
> +  void build (function_builder &b,
> + const function_group_info &group) const override
> +  {
> +auto_vec argument_types;
> +function_instance function_instance (group.base_name, *group.base,
> +*group.shape, 
> group.ops_infos.types[0],
> +group.preds[0], &group.ops_infos);
> +b.add_unique_function (function_instance, (*group.shape),
> +  long_unsigned_type_node, argument_types);
> +  }
> +
> +  char *get_name (function_builder &b, const function_instance &instance,
> + bool overloaded_p) const override
> +  {
> +if

[PATCH] RISC-V: Fix PR109228

2023-03-21 Thread juzhe . zhong
From: Ju-Zhe Zhong 

This patch fix PR109228
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109228

gcc/ChangeLog:

* config/riscv/riscv-vector-builtins-bases.cc (class vlenb): Add 
__riscv_vlenb support.
(BASE): Ditto.
* config/riscv/riscv-vector-builtins-bases.h: Ditto.
* config/riscv/riscv-vector-builtins-functions.def (vlenb): Ditto.
* config/riscv/riscv-vector-builtins-shapes.cc (struct vlenb_def): 
Ditto.
(SHAPE): Ditto.
* config/riscv/riscv-vector-builtins-shapes.h: Ditto.
* config/riscv/riscv-vector-builtins.cc: Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/base/vlenb-1.c: New test.

---
 .../riscv/riscv-vector-builtins-bases.cc  | 17 +++
 .../riscv/riscv-vector-builtins-bases.h   |  1 +
 .../riscv/riscv-vector-builtins-functions.def |  1 +
 .../riscv/riscv-vector-builtins-shapes.cc | 25 ++
 .../riscv/riscv-vector-builtins-shapes.h  |  1 +
 gcc/config/riscv/riscv-vector-builtins.cc |  7 +++
 .../gcc.target/riscv/rvv/base/vlenb-1.c   | 46 +++
 7 files changed, 98 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/vlenb-1.c

diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc 
b/gcc/config/riscv/riscv-vector-builtins-bases.cc
index 839eb66efb2..52467bbc961 100644
--- a/gcc/config/riscv/riscv-vector-builtins-bases.cc
+++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc
@@ -1658,6 +1658,21 @@ public:
   }
 };
 
+/* Implements vlenb.  */
+class vlenb : public function_base
+{
+public:
+  bool apply_vl_p () const override { return false; }
+
+  rtx expand (function_expander &e) const override
+  {
+machine_mode mode = GET_MODE (e.target);
+rtx vlenb = gen_int_mode (BYTES_PER_RISCV_VECTOR, mode);
+emit_move_insn (e.target, vlenb);
+return e.target;
+  }
+};
+
 static CONSTEXPR const vsetvl vsetvl_obj;
 static CONSTEXPR const vsetvl vsetvlmax_obj;
 static CONSTEXPR const loadstore vle_obj;
@@ -1868,6 +1883,7 @@ static CONSTEXPR const vset vset_obj;
 static CONSTEXPR const vget vget_obj;
 static CONSTEXPR const read_vl read_vl_obj;
 static CONSTEXPR const vleff vleff_obj;
+static CONSTEXPR const vlenb vlenb_obj;
 
 /* Declare the function base NAME, pointing it to an instance
of class _obj.  */
@@ -2084,5 +2100,6 @@ BASE (vset)
 BASE (vget)
 BASE (read_vl)
 BASE (vleff)
+BASE (vlenb)
 
 } // end namespace riscv_vector
diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.h 
b/gcc/config/riscv/riscv-vector-builtins-bases.h
index 14e8a55cd97..0196f80b69e 100644
--- a/gcc/config/riscv/riscv-vector-builtins-bases.h
+++ b/gcc/config/riscv/riscv-vector-builtins-bases.h
@@ -240,6 +240,7 @@ extern const function_base *const vset;
 extern const function_base *const vget;
 extern const function_base *const read_vl;
 extern const function_base *const vleff;
+extern const function_base *const vlenb;
 }
 
 } // end namespace riscv_vector
diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def 
b/gcc/config/riscv/riscv-vector-builtins-functions.def
index 198ccfd86b7..3f1513cb9fd 100644
--- a/gcc/config/riscv/riscv-vector-builtins-functions.def
+++ b/gcc/config/riscv/riscv-vector-builtins-functions.def
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
 
 /* Internal helper functions for gimple fold use.  */
 DEF_RVV_FUNCTION (read_vl, read_vl, none_preds, p_none_void_ops)
+DEF_RVV_FUNCTION (vlenb, vlenb, none_preds, ul_none_void_ops)
 
 /* 6. Configuration-Setting Instructions.  */
 
diff --git a/gcc/config/riscv/riscv-vector-builtins-shapes.cc 
b/gcc/config/riscv/riscv-vector-builtins-shapes.cc
index edb0d34b81c..0682f81400a 100644
--- a/gcc/config/riscv/riscv-vector-builtins-shapes.cc
+++ b/gcc/config/riscv/riscv-vector-builtins-shapes.cc
@@ -553,6 +553,30 @@ struct fault_load_def : public build_base
   }
 };
 
+/* vlenb_def class.  */
+struct vlenb_def : public function_shape
+{
+  void build (function_builder &b,
+ const function_group_info &group) const override
+  {
+auto_vec argument_types;
+function_instance function_instance (group.base_name, *group.base,
+*group.shape, group.ops_infos.types[0],
+group.preds[0], &group.ops_infos);
+b.add_unique_function (function_instance, (*group.shape),
+  long_unsigned_type_node, 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);
+return b.finish_name ();
+  }
+};
+
 SHAPE(vsetvl, vsetvl)
 SHAPE(vsetvl, vsetvlmax)
 SHAPE(loadstore, loadstore)
@@ -572,5 +596,6 @@ SHAPE(vset, vset)
 SHAPE(vget, vget)
 SHAPE(read_vl, read_vl)
 SHAPE(fault_load, fault_load)
+SHAPE(vlenb, vlenb)
 
 } // end namespace riscv_vector
diff --git a/gcc/config/riscv/ri