LGTM 於 2023年8月10日 週四 11:12 寫道: > From: Pan Li > > The frm_mode attr has some assumptions for each define insn as below. > > 1. The define insn has at least 9 operands. > 2. The operands[9] must be frm reg. > 3. The operands[9] must be const int. > > Actually, the frm operand can be operands[8], operands[9] or > operands[10], and not all the define insn has frm operands. > > This patch would like to refactor frm and eliminate the above > assumptions, as well as unblock the underlying rounding mode intrinsic > API support. > > After refactor, the default frm will be none, and the selected insn type > will be dyn. For the floating point which honors the frm, we will > set the frm_mode attr explicitly in define_insn. > > Signed-off-by: Pan Li > Co-Authored-by: Kito Cheng > > gcc/ChangeLog: > > * config/riscv/riscv-protos.h (get_frm_mode): Remove operand > assumptions. > * config/riscv/riscv-v.cc (get_frm_mode): New function. > * config/riscv/riscv-vector-builtins.cc > (function_expander::use_ternop_insn): > * config/riscv/vector.md: Set frm_mode attr explicitly. > > gcc/ChangeLog: > > * config/riscv/riscv-protos.h > (enum floating_point_rounding_mode): Add NONE, DYN_EXIT and > DYN_CALL. > (get_frm_mode): New declaration. > * config/riscv/riscv-v.cc (get_frm_mode): New function to get frm > mode. > * config/riscv/riscv-vector-builtins.cc > (function_expander::use_ternop_insn): Take care of frm reg. > * config/riscv/riscv.cc (riscv_static_frm_mode_p): Migrate to > FRM_XXX. > (riscv_emit_frm_mode_set): Ditto. > (riscv_emit_mode_set): Ditto. > (riscv_frm_adjust_mode_after_call): Ditto. > (riscv_frm_mode_needed): Ditto. > (riscv_frm_mode_after): Ditto. > (riscv_mode_entry): Ditto. > (riscv_mode_exit): Ditto. > * config/riscv/riscv.h (NUM_MODES_FOR_MODE_SWITCHING): Ditto. > * config/riscv/vector.md > (rne,rtz,rdn,rup,rmm,dyn,dyn_exit,dyn_call,none): Removed > (symbol_ref): * config/riscv/vector.md: Set frm_mode attr > explicitly. > --- > gcc/config/riscv/riscv-protos.h | 4 + > gcc/config/riscv/riscv-v.cc | 29 ++++ > gcc/config/riscv/riscv-vector-builtins.cc | 22 ++- > gcc/config/riscv/riscv.cc | 46 +++--- > gcc/config/riscv/riscv.h | 2 +- > gcc/config/riscv/vector.md | 172 ++++++++++++++-------- > 6 files changed, 186 insertions(+), 89 deletions(-) > > diff --git a/gcc/config/riscv/riscv-protos.h > b/gcc/config/riscv/riscv-protos.h > index ac9c4b02f17..2fbed04ff84 100644 > --- a/gcc/config/riscv/riscv-protos.h > +++ b/gcc/config/riscv/riscv-protos.h > @@ -349,8 +349,12 @@ enum floating_point_rounding_mode > FRM_DYN = 7, /* Aka 0b111. */ > FRM_STATIC_MIN = FRM_RNE, > FRM_STATIC_MAX = FRM_RMM, > + FRM_DYN_EXIT = 8, > + FRM_DYN_CALL = 9, > + FRM_NONE = 10, > }; > > +enum floating_point_rounding_mode get_frm_mode (rtx); > opt_machine_mode vectorize_related_mode (machine_mode, scalar_mode, > poly_uint64); > unsigned int autovectorize_vector_modes (vec *, bool); > diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc > index 0bea04c1967..c9f0a4a9e7b 100644 > --- a/gcc/config/riscv/riscv-v.cc > +++ b/gcc/config/riscv/riscv-v.cc > @@ -112,6 +112,7 @@ public: > { > m_has_fp_rounding_mode_p = true; > m_fp_rounding_mode = mode; > + gcc_assert (mode <= FRM_DYN); > } > > void add_output_operand (rtx x, machine_mode mode) > @@ -1590,6 +1591,34 @@ expand_const_vector (rtx target, rtx src) > gcc_unreachable (); > } > > +/* Get the frm mode with given CONST_INT rtx, the default mode is > + FRM_DYN. */ > +enum floating_point_rounding_mode > +get_frm_mode (rtx operand) > +{ > + gcc_assert (CONST_INT_P (operand)); > + > + switch (INTVAL (operand)) > + { > + case FRM_RNE: > + return FRM_RNE; > + case FRM_RTZ: > + return FRM_RTZ; > + case FRM_RDN: > + return FRM_RDN; > + case FRM_RUP: > + return FRM_RUP; > + case FRM_RMM: > + return FRM_RMM; > + case FRM_DYN: > + return FRM_DYN; > + default: > + gcc_unreachable (); > + } > + > + gcc_unreachable (); > +} > + > /* Expand a pre-RA RVV data move from SRC to DEST. > It expands move for RVV fractional vector modes. */ > bool > diff --git a/gcc/config/riscv/riscv-vector-builtins.cc > b/gcc/config/riscv/riscv-vector-builtins.cc > index 528dca7ae85..abab06c00ed 100644 > --- a/gcc/config/riscv/riscv-vector-builtins.cc > +++ b/gcc/config/riscv/riscv-vector-builtins.cc > @@ -3730,17 +3730,29 @@ function_expander::use_ternop_insn (bool > vd_accum_p, insn_code icode) > } > > for (int argno = arg_offset; argno < call_expr_nargs (exp); argno++) > - add_input_operand (argno); > + { > + if (base->has_rounding_mode_operand_p () > + && argno == call_expr_nargs (exp) - 2) > + { > + /* Since the rounding mode argument position is not consistent > with > + the instruction pattern, we need to skip rounding mode > argument > + here. */ > + continue; > + } > + add_input_operand (argno); > + } > > add_input_operand (Pmode, get_tail_policy_for_pred (pred)); > add_input_operand (Pmode, get_mask_policy_for_pred (pred)); > add_input_operand (Pmode, get_avl_type_rtx (avl_type::NONVLMAX)); > > - /* TODO: Currently, we don't support intrinsic that is modeling > rounding mode. > - We add default rounding mode for the intrinsics that didn't model > rounding > - mode yet. */ > + if (base->has_rounding_mode_operand_p ()) > + add_input_operand (call_expr_nargs (exp) - 2); > + > + /* The RVV floating-point only support dynamic rounding mode in the > + FRM register. */ > if (opno != insn_data[icode].n_generator_args) > - add_input_operand (Pmode, const0_rtx); > + add_input_operand (Pmode, gen_int_mode (riscv_vector::FRM_DYN, > Pmode)); > > return generate_insn (icode); > } > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > index dfb519ab9a8..bb9815a01d7 100644 > --- a/gcc/config/riscv/riscv.cc > +++ b/gcc/config/riscv/riscv.cc > @@ -8054,11 +8054,11 @@ riscv_static_frm_mode_p (int mode) > { > switch (mode) > { > - case FRM_MODE_RDN: > - case FRM_MODE_RUP: > - case FRM_MODE_RTZ: > - case FRM_MODE_RMM: > - case FRM_MODE_RNE: > + case riscv_vector::FRM_RDN: > + case riscv_vector::FRM_RUP: > + case riscv_vector::FRM_RTZ: > + case riscv_vector::FRM_RMM: > + case riscv_vector::FRM_RNE: > return true; > default: > return false; > @@ -8074,28 +8074,24 @@ riscv_emit_frm_mode_set (int mode, int prev_mode) > { > rtx backup_reg = DYNAMIC_FRM_RTL (cfun); > > - if (prev_mode == FRM_MODE_DYN_CALL) > + if (prev_mode == riscv_vector::FRM_DYN_CALL) > emit_insn (gen_frrmsi (backup_reg)); /* Backup frm when DYN_CALL. */ > > if (mode != prev_mode) > { > - /* TODO: By design, FRM_MODE_xxx used by mode switch which is > - different from the FRM value like FRM_RTZ defined in > - riscv-protos.h. When mode switching we actually need a conversion > - function to convert the mode of mode switching to the actual > - FRM value like FRM_RTZ. For now, the value between the mode of > - mode swith and the FRM value in riscv-protos.h take the same > value, > - and then we leverage this assumption when emit. */ > rtx frm = gen_int_mode (mode, SImode); > > - if (mode == FRM_MODE_DYN_CALL && prev_mode != FRM_MODE_DYN) > + if (mode == riscv_vector::FRM_DYN_CALL > + && prev_mode != riscv_vector::FRM_DYN) > /* No need to emit when prev mode is DYN already. */ > emit_insn (gen_fsrmsi_restore_volatile (backup_reg)); > - else if (mode == FRM_MODE_DYN_EXIT && STATIC_FRM_P (cfun) > - && prev_mode != FRM_MODE_DYN && prev_mode != FRM_MODE_DYN_CALL) > + else if (mode == riscv_vector::FRM_DYN_EXIT && STATIC_FRM_P (cfun) > + && prev_mode != riscv_vector::FRM_DYN > + && prev_mode != riscv_vector::FRM_DYN_CALL) > /* No need to emit when prev mode is DYN or DYN_CALL already. */ > emit_insn (gen_fsrmsi_restore_volatile (backup_reg)); > - else if (mode == FRM_MODE_DYN && prev_mode != FRM_MODE_DYN_CALL) > + else if (mode == riscv_vector::FRM_DYN > + && prev_mode != riscv_vector::FRM_DYN_CALL) > /* Restore frm value from backup when switch to DYN mode. */ > emit_insn (gen_fsrmsi_restore (backup_reg)); > else if (riscv_static_frm_mode_p (mode)) > @@ -8124,7 +8120,7 @@ riscv_emit_mode_set (int entity, int mode, int > prev_mode, > } > } > > -/* Adjust the FRM_MODE_NONE insn after a call to FRM_MODE_DYN for the > +/* Adjust the FRM_NONE insn after a call to FRM_DYN for the > underlying emit. */ > > static int > @@ -8133,7 +8129,7 @@ riscv_frm_adjust_mode_after_call (rtx_insn > *cur_insn, int mode) > rtx_insn *insn = prev_nonnote_nondebug_insn_bb (cur_insn); > > if (insn && CALL_P (insn)) > - return FRM_MODE_DYN; > + return riscv_vector::FRM_DYN; > > return mode; > } > @@ -8184,12 +8180,12 @@ riscv_frm_mode_needed (rtx_insn *cur_insn, int > code) > if (!insn) > riscv_frm_emit_after_bb_end (cur_insn); > > - return FRM_MODE_DYN_CALL; > + return riscv_vector::FRM_DYN_CALL; > } > > - int mode = code >= 0 ? get_attr_frm_mode (cur_insn) : FRM_MODE_NONE; > + int mode = code >= 0 ? get_attr_frm_mode (cur_insn) : > riscv_vector::FRM_NONE; > > - if (mode == FRM_MODE_NONE) > + if (mode == riscv_vector::FRM_NONE) > /* After meet a call, we need to backup the frm because it may be > updated during the call. Here, for each insn, we will check if > the previous insn is a call or not. When previous insn is call, > @@ -8297,7 +8293,7 @@ riscv_frm_mode_after (rtx_insn *insn, int mode) > return mode; > > if (frm_unknown_dynamic_p (insn)) > - return FRM_MODE_DYN; > + return riscv_vector::FRM_DYN; > > if (recog_memoized (insn) < 0) > return mode; > @@ -8339,7 +8335,7 @@ riscv_mode_entry (int entity) > /* According to RVV 1.0 spec, all vector floating-point > operations use > the dynamic rounding mode in the frm register. Likewise in > other > similar places. */ > - return FRM_MODE_DYN; > + return riscv_vector::FRM_DYN; > } > default: > gcc_unreachable (); > @@ -8357,7 +8353,7 @@ riscv_mode_exit (int entity) > case RISCV_VXRM: > return VXRM_MODE_NONE; > case RISCV_FRM: > - return FRM_MODE_DYN_EXIT; > + return riscv_vector::FRM_DYN_EXIT; > default: > gcc_unreachable (); > } > diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h > index 643e7ea7330..746101ea933 100644 > --- a/gcc/config/riscv/riscv.h > +++ b/gcc/config/riscv/riscv.h > @@ -1120,6 +1120,6 @@ extern void riscv_remove_unneeded_save_restore_calls > (void); > > /* Mode switching (Lazy code motion) for RVV rounding mode instructions. > */ > #define OPTIMIZE_MODE_SWITCHING(ENTITY) (TARGET_VECTOR) > -#define NUM_MODES_FOR_MODE_SWITCHING {VXRM_MODE_NONE, FRM_MODE_NONE} > +#define NUM_MODES_FOR_MODE_SWITCHING {VXRM_MODE_NONE, > riscv_vector::FRM_NONE} > > #endif /* ! GCC_RISCV_H */ > diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md > index 65b5fe456ed..cf37b472930 100644 > --- a/gcc/config/riscv/vector.md > +++ b/gcc/config/riscv/vector.md > @@ -865,28 +865,10 @@ (define_attr "vxrm_mode" "rnu,rne,rdn,rod,none" > (const_string "none"))) > > ;; Defines rounding mode of an floating-point operation. > -(define_attr "frm_mode" "rne,rtz,rdn,rup,rmm,dyn,dyn_exit,dyn_call,none" > +(define_attr "frm_mode" "" > (cond [(eq_attr "type" "vfalu,vfwalu,vfmul,vfdiv,vfwmul") > - (cond > - [(match_test "INTVAL (operands[9]) == riscv_vector::FRM_RNE") > - (const_string "rne") > - > - (match_test "INTVAL (operands[9]) == riscv_vector::FRM_RTZ") > - (const_string "rtz") > - > - (match_test "INTVAL (operands[9]) == riscv_vector::FRM_RDN") > - (const_string "rdn") > - > - (match_test "INTVAL (operands[9]) == riscv_vector::FRM_RUP") > - (const_string "rup") > - > - (match_test "INTVAL (operands[9]) == riscv_vector::FRM_RMM") > - (const_string "rmm") > - > - (match_test "INTVAL (operands[9]) == riscv_vector::FRM_DYN") > - (const_string "dyn")] > - (const_string "none"))] > - (const_string "none"))) > + (symbol_ref "riscv_vector::FRM_DYN")] > + (symbol_ref "riscv_vector::FRM_NONE"))) > > ;; ----------------------------------------------------------------- > ;; ---- Miscellaneous Operations > @@ -6021,7 +6003,9 @@ (define_insn "@pred_" > "TARGET_VECTOR" > "vf.vv\t%0,%3,%4%p1" > [(set_attr "type" "") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_" > [(set (match_operand:VF 0 "register_operand" "=vd, vd, vr, > vr") > @@ -6064,7 +6048,9 @@ (define_insn "@pred__scalar" > "TARGET_VECTOR" > "vf.vf\t%0,%3,%4%p1" > [(set_attr "type" "") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred__scalar" > [(set (match_operand:VF 0 "register_operand" "=vd, vd, vr, > vr") > @@ -6108,7 +6094,9 @@ (define_insn "@pred__scalar" > "TARGET_VECTOR" > "vf.vf\t%0,%3,%4%p1" > [(set_attr "type" "") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred__reverse_scalar" > [(set (match_operand:VF 0 "register_operand" "=vd, vd, vr, > vr") > @@ -6131,7 +6119,9 @@ (define_insn "@pred__reverse_scalar" > "TARGET_VECTOR" > "vfr.vf\t%0,%3,%4%p1" > [(set_attr "type" "") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_" > [(set (match_operand:VF 0 "register_operand" "=vd, vd, vr, > vr") > @@ -6279,7 +6269,9 @@ (define_insn "*pred_" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "*pred_" > [(set (match_operand:VF 0 "register_operand" "=vd, ?&vd, vr, > ?&vr") > @@ -6312,7 +6304,9 @@ (define_insn "*pred_" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn_and_rewrite "*pred_mul_" > [(set (match_operand:VF 0 "register_operand" "=&vr") > @@ -6343,7 +6337,9 @@ (define_insn_and_rewrite "*pred_mul_" > riscv_vector::prepare_ternary_operands (operands, true); > } > [(set_attr "type" "vfmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[10])"))]) > > (define_expand "@pred_mul__scalar" > [(set (match_operand:VF 0 "register_operand") > @@ -6400,7 +6396,9 @@ (define_insn "*pred__scalar" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "*pred__scalar" > [(set (match_operand:VF 0 "register_operand" "=vd, ?&vd, vr, > ?&vr") > @@ -6434,7 +6432,9 @@ (define_insn "*pred__scalar" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn_and_rewrite "*pred_mul__scalar" > [(set (match_operand:VF 0 "register_operand" "=&vr") > @@ -6465,7 +6465,9 @@ (define_insn_and_rewrite > "*pred_mul__scalar" > riscv_vector::prepare_ternary_operands (operands, true); > } > [(set_attr "type" "vfmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[10])"))]) > > (define_expand "@pred_mul_neg_" > [(set (match_operand:VF 0 "register_operand") > @@ -6524,7 +6526,9 @@ (define_insn "*pred_" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "*pred_" > [(set (match_operand:VF 0 "register_operand" "=vd, ?&vd, vr, > ?&vr") > @@ -6558,7 +6562,9 @@ (define_insn "*pred_" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn_and_rewrite "*pred_mul_neg_" > [(set (match_operand:VF 0 "register_operand" "=&vr") > @@ -6590,7 +6596,9 @@ (define_insn_and_rewrite > "*pred_mul_neg_" > riscv_vector::prepare_ternary_operands (operands, true); > } > [(set_attr "type" "vfmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[10])"))]) > > (define_expand "@pred_mul_neg__scalar" > [(set (match_operand:VF 0 "register_operand") > @@ -6649,7 +6657,9 @@ (define_insn "*pred__scalar" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "*pred__scalar" > [(set (match_operand:VF 0 "register_operand" "=vd, ?&vd, > vr, ?&vr") > @@ -6684,7 +6694,9 @@ (define_insn "*pred__scalar" > (set_attr "vl_op_idx" "5") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[6])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[7])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[8])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn_and_rewrite "*pred_mul_neg__scalar" > [(set (match_operand:VF 0 "register_operand" "=&vr") > @@ -6716,7 +6728,9 @@ (define_insn_and_rewrite > "*pred_mul_neg__scalar" > riscv_vector::prepare_ternary_operands (operands, true); > } > [(set_attr "type" "vfmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[10])"))]) > > ;; > ------------------------------------------------------------------------------- > ;; ---- Predicated floating-point unary operations > @@ -6752,7 +6766,9 @@ (define_insn "@pred_" > (set_attr "vl_op_idx" "4") > (set (attr "ta") (symbol_ref "riscv_vector::get_ta(operands[5])")) > (set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[6])")) > - (set (attr "avl_type") (symbol_ref "INTVAL (operands[7])"))]) > + (set (attr "avl_type") (symbol_ref "INTVAL (operands[7])")) > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > (define_insn "@pred_" > [(set (match_operand:VF 0 "register_operand" "=vd, vd, vr, > vr") > @@ -6846,7 +6862,9 @@ (define_insn "@pred_dual_widen_" > "TARGET_VECTOR" > "vfw.vv\t%0,%3,%4%p1" > [(set_attr "type" "vf") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_dual_widen__scalar" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr, &vr") > @@ -6871,7 +6889,9 @@ (define_insn "@pred_dual_widen__scalar" > "TARGET_VECTOR" > "vfw.vf\t%0,%3,%4%p1" > [(set_attr "type" "vf") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_single_widen_add" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr, &vr") > @@ -6894,7 +6914,9 @@ (define_insn "@pred_single_widen_add" > "TARGET_VECTOR" > "vfwadd.wv\t%0,%3,%4%p1" > [(set_attr "type" "vfwalu") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_single_widen_sub" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr, &vr") > @@ -6917,7 +6939,9 @@ (define_insn "@pred_single_widen_sub" > "TARGET_VECTOR" > "vfwsub.wv\t%0,%3,%4%p1" > [(set_attr "type" "vfwalu") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_single_widen__scalar" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr, &vr") > @@ -6941,7 +6965,9 @@ (define_insn > "@pred_single_widen__scalar" > "TARGET_VECTOR" > "vfw.wf\t%0,%3,%4%p1" > [(set_attr "type" "vf") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > ;; > ------------------------------------------------------------------------------- > ;; ---- Predicated widen floating-point ternary operations > @@ -6974,7 +7000,9 @@ (define_insn "@pred_widen_mul_" > "TARGET_VECTOR" > "vfw.vv\t%0,%3,%4%p1" > [(set_attr "type" "vfwmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_widen_mul__scalar" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr") > @@ -7001,7 +7029,9 @@ (define_insn "@pred_widen_mul__scalar" > "TARGET_VECTOR" > "vfw.vf\t%0,%3,%4%p1" > [(set_attr "type" "vfwmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_widen_mul_neg_" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr") > @@ -7028,7 +7058,9 @@ (define_insn "@pred_widen_mul_neg_" > "TARGET_VECTOR" > "vfw.vv\t%0,%3,%4%p1" > [(set_attr "type" "vfwmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > (define_insn "@pred_widen_mul_neg__scalar" > [(set (match_operand:VWEXTF 0 "register_operand" > "=&vr") > @@ -7056,7 +7088,9 @@ (define_insn > "@pred_widen_mul_neg__scalar" > "TARGET_VECTOR" > "vfw.vf\t%0,%3,%4%p1" > [(set_attr "type" "vfwmuladd") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[9])"))]) > > ;; > ------------------------------------------------------------------------------- > ;; ---- Predicated floating-point comparison operations > @@ -7366,7 +7400,9 @@ (define_insn "@pred_fcvt_x_f" > "TARGET_VECTOR" > "vfcvt.x.f.v\t%0,%3%p1" > [(set_attr "type" "vfcvtftoi") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > (define_insn "@pred_" > [(set (match_operand: 0 "register_operand" "=vd, vd, > vr, vr") > @@ -7406,7 +7442,9 @@ (define_insn "@pred_" > "TARGET_VECTOR" > "vfcvt.f.x.v\t%0,%3%p1" > [(set_attr "type" "vfcvtitof") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > ;; > ------------------------------------------------------------------------------- > ;; ---- Predicated floating-point widen conversions > @@ -7434,7 +7472,9 @@ (define_insn "@pred_widen_fcvt_x_f" > "TARGET_VECTOR" > "vfwcvt.x.f.v\t%0,%3%p1" > [(set_attr "type" "vfwcvtftoi") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > (define_insn "@pred_widen_" > [(set (match_operand:VWCONVERTI 0 "register_operand" "=&vr, > &vr") > @@ -7519,7 +7559,9 @@ (define_insn "@pred_narrow_fcvt_x_f" > "TARGET_VECTOR" > "vfncvt.x.f.w\t%0,%3%p1" > [(set_attr "type" "vfncvtftoi") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > (define_insn "@pred_narrow_" > [(set (match_operand: 0 "register_operand" "=vd, vd, > vr, vr, &vr, &vr") > @@ -7559,7 +7601,9 @@ (define_insn "@pred_narrow_" > "TARGET_VECTOR" > "vfncvt.f.x.w\t%0,%3%p1" > [(set_attr "type" "vfncvtitof") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > (define_insn "@pred_trunc" > [(set (match_operand: 0 "register_operand" "=vd, > vd, vr, vr, &vr, &vr") > @@ -7580,7 +7624,9 @@ (define_insn "@pred_trunc" > "TARGET_VECTOR" > "vfncvt.f.f.w\t%0,%3%p1" > [(set_attr "type" "vfncvtftof") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > (define_insn "@pred_rod_trunc" > [(set (match_operand: 0 "register_operand" "=vd, > vd, vr, vr, &vr, &vr") > @@ -7860,7 +7906,9 @@ (define_insn > "@pred_reduc_plus" > "TARGET_VECTOR" > "vfredsum.vs\t%0,%3,%4%p1" > [(set_attr "type" "vfred") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > ;; Float Ordered Reduction Sum for SF > (define_insn "@pred_reduc_plus" > @@ -7886,7 +7934,9 @@ (define_insn > "@pred_reduc_plus" > "TARGET_VECTOR" > "vfredsum.vs\t%0,%3,%4%p1" > [(set_attr "type" "vfred") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > ;; Float Ordered Reduction Sum for DF > (define_insn "@pred_reduc_plus" > @@ -7912,7 +7962,9 @@ (define_insn > "@pred_reduc_plus" > "TARGET_VECTOR" > "vfredsum.vs\t%0,%3,%4%p1" > [(set_attr "type" "vfred") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > ;; Float Widen Reduction for HF, aka SF = HF op SF > (define_insn "@pred_widen_reduc_plus" > @@ -7934,7 +7986,9 @@ (define_insn > "@pred_widen_reduc_plus" > "TARGET_VECTOR" > "vfwredsum.vs\t%0,%3,%4%p1" > [(set_attr "type" "vfwred") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > ;; Float Widen Reduction for SF, aka DF = SF * DF > (define_insn "@pred_widen_reduc_plus" > @@ -7956,7 +8010,9 @@ (define_insn > "@pred_widen_reduc_plus" > "TARGET_VECTOR" > "vfwredsum.vs\t%0,%3,%4%p1" > [(set_attr "type" "vfwred") > - (set_attr "mode" "")]) > + (set_attr "mode" "") > + (set (attr "frm_mode") > + (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) > > ;; > ------------------------------------------------------------------------------- > ;; ---- Predicated permutation operations > -- > 2.34.1 > >