Thanks Kito for comments. How about leverage inherit instead of template? AFAIK, the bool argument isn't recommended up to a point. For example, as below to reuse the expand part.
class vfcvt_x : public function_base { public: + virtual bool has_rounding_mode_operand_p () const { return false; } + rtx expand (function_expander &e) const override { return e.use_exact_insn (code_for_pred_fcvt_x_f (UNSPEC, e.arg_mode (0))); } }; +/* Implements below instructions for frm + - vfcvt_x +*/ +template<int UNSPEC> +class vfcvt_x_frm : public vfcvt_x<UNSPEC> +{ +public: + bool has_rounding_mode_operand_p () const override { return true; } +}; Pan -----Original Message----- From: Kito Cheng <kito.ch...@gmail.com> Sent: Tuesday, August 15, 2023 11:34 PM To: juzhe.zh...@rivai.ai Cc: Li, Pan2 <pan2...@intel.com>; gcc-patches <gcc-patches@gcc.gnu.org>; Wang, Yanzhang <yanzhang.w...@intel.com> Subject: Re: [PATCH v1] RISC-V: Support RVV VFCVT.X.F.V rounding mode intrinsic API Just a random idea came to my mind, maybe we could introduce one more template argument to reduce those codes for rounding mode intrinsic stuff? example: diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index 2074dac0f16..9cc60842a5b 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -1648,10 +1648,11 @@ public: }; /* Implements vfcvt.x. */ -template<int UNSPEC> +template<int UNSPEC, bool HAS_FRM = false> class vfcvt_x : public function_base { public: + bool has_rounding_mode_operand_p () const override { return HAS_FRM; } rtx expand (function_expander &e) const override { return e.use_exact_insn (code_for_pred_fcvt_x_f (UNSPEC, e.arg_mode (0))); @@ -2451,6 +2452,7 @@ static CONSTEXPR const vmerge vfmerge_obj; static CONSTEXPR const vmv_v vfmv_v_obj; static CONSTEXPR const vfcvt_x<UNSPEC_VFCVT> vfcvt_x_obj; static CONSTEXPR const vfcvt_x<UNSPEC_UNSIGNED_VFCVT> vfcvt_xu_obj; +static CONSTEXPR const vfcvt_x<UNSPEC_VFCVT, /*HAS_FRM*/true> vfcvt_x_frm_obj; static CONSTEXPR const vfcvt_rtz_x<FIX> vfcvt_rtz_x_obj; static CONSTEXPR const vfcvt_rtz_x<UNSIGNED_FIX> vfcvt_rtz_xu_obj; static CONSTEXPR const vfcvt_f vfcvt_f_obj;