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;