LGTM. It's obvious you fixed my previous redundant codes. Thanks.
juzhe.zh...@rivai.ai From: Lehua Ding Date: 2023-09-13 20:31 To: gcc-patches CC: juzhe.zhong; kito.cheng; rdapp.gcc; palmer; jeffreyalaw; lehua.ding Subject: [PATCH 2/2] RISC-V: Refactor vector reduction patterns This patch adjust reduction patterns struct, change it from: (any_reduc:VI (vec_duplicate:VI (vec_select:<VEL> (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") (parallel [(const_int 0)]))) (match_operand:VI 3 "register_operand" " vr, vr")) to: (unspec:<V_LMUL1> [ (match_operand:VI 3 "register_operand" " vr, vr") (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") ] ANY_REDUC) The reason for the change is that the semantics of the previous pattern is incorrect. GCC does not have a standard rtx code to express the reduction calculation process. It makes more sense to use UNSPEC. Further, all reduction icode are geted by the UNSPEC and MODE (code_for_pred (unspec, mode)), so that all reduction patterns can have a uniform icode name. After this adjust, widen_reducop and widen_freducop are redundant. gcc/ChangeLog: * config/riscv/autovec.md: Change rtx code to unspec. * config/riscv/riscv-protos.h (expand_reduction): Change prototype. * config/riscv/riscv-v.cc (expand_reduction): Change prototype. * config/riscv/riscv-vector-builtins-bases.cc (class widen_reducop): Removed. (class widen_freducop): Removed. * config/riscv/vector-iterators.md (minu): Add reduc unspec, iterators, attrs. * config/riscv/vector.md (@pred_reduc_<reduc><mode>): Change name. (@pred_<reduc_op><mode>): New name. (@pred_widen_reduc_plus<v_su><mode>): Change name. (@pred_reduc_plus<order><mode>): Change name. (@pred_widen_reduc_plus<order><mode>): Change name. --- gcc/config/riscv/autovec.md | 27 ++-- gcc/config/riscv/riscv-protos.h | 2 +- gcc/config/riscv/riscv-v.cc | 13 +- .../riscv/riscv-vector-builtins-bases.cc | 82 ++++-------- gcc/config/riscv/vector-iterators.md | 62 +++++++-- gcc/config/riscv/vector.md | 118 +++++++++--------- 6 files changed, 152 insertions(+), 152 deletions(-) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index 4a6b8f8c939..16ac125f53f 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -2091,7 +2091,7 @@ (match_operand:VI 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (PLUS, operands, CONST0_RTX (<VEL>mode)); + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM, operands, CONST0_RTX (<VEL>mode)); DONE; }) @@ -2102,7 +2102,7 @@ { int prec = GET_MODE_PRECISION (<VEL>mode); rtx min = immed_wide_int_const (wi::min_value (prec, SIGNED), <VEL>mode); - riscv_vector::expand_reduction (SMAX, operands, min); + riscv_vector::expand_reduction (UNSPEC_REDUC_MAX, operands, min); DONE; }) @@ -2111,7 +2111,7 @@ (match_operand:VI 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (UMAX, operands, CONST0_RTX (<VEL>mode)); + riscv_vector::expand_reduction (UNSPEC_REDUC_MAXU, operands, CONST0_RTX (<VEL>mode)); DONE; }) @@ -2122,7 +2122,7 @@ { int prec = GET_MODE_PRECISION (<VEL>mode); rtx max = immed_wide_int_const (wi::max_value (prec, SIGNED), <VEL>mode); - riscv_vector::expand_reduction (SMIN, operands, max); + riscv_vector::expand_reduction (UNSPEC_REDUC_MIN, operands, max); DONE; }) @@ -2133,7 +2133,7 @@ { int prec = GET_MODE_PRECISION (<VEL>mode); rtx max = immed_wide_int_const (wi::max_value (prec, UNSIGNED), <VEL>mode); - riscv_vector::expand_reduction (UMIN, operands, max); + riscv_vector::expand_reduction (UNSPEC_REDUC_MINU, operands, max); DONE; }) @@ -2142,7 +2142,7 @@ (match_operand:VI 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (AND, operands, CONSTM1_RTX (<VEL>mode)); + riscv_vector::expand_reduction (UNSPEC_REDUC_AND, operands, CONSTM1_RTX (<VEL>mode)); DONE; }) @@ -2151,7 +2151,7 @@ (match_operand:VI 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (IOR, operands, CONST0_RTX (<VEL>mode)); + riscv_vector::expand_reduction (UNSPEC_REDUC_OR, operands, CONST0_RTX (<VEL>mode)); DONE; }) @@ -2160,7 +2160,7 @@ (match_operand:VI 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (XOR, operands, CONST0_RTX (<VEL>mode)); + riscv_vector::expand_reduction (UNSPEC_REDUC_XOR, operands, CONST0_RTX (<VEL>mode)); DONE; }) @@ -2178,7 +2178,8 @@ (match_operand:VF 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (PLUS, operands, CONST0_RTX (<VEL>mode)); + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_UNORDERED, operands, + CONST0_RTX (<VEL>mode)); DONE; }) @@ -2190,7 +2191,7 @@ REAL_VALUE_TYPE rv; real_inf (&rv, true); rtx f = const_double_from_real_value (rv, <VEL>mode); - riscv_vector::expand_reduction (SMAX, operands, f); + riscv_vector::expand_reduction (UNSPEC_REDUC_MAX, operands, f); DONE; }) @@ -2202,7 +2203,7 @@ REAL_VALUE_TYPE rv; real_inf (&rv, false); rtx f = const_double_from_real_value (rv, <VEL>mode); - riscv_vector::expand_reduction (SMIN, operands, f); + riscv_vector::expand_reduction (UNSPEC_REDUC_MIN, operands, f); DONE; }) @@ -2220,7 +2221,7 @@ (match_operand:VF 2 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_reduction (PLUS, operands, + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_ORDERED, operands, operands[1], riscv_vector::reduction_type::FOLD_LEFT); DONE; @@ -2239,7 +2240,7 @@ if (rtx_equal_p (operands[4], const0_rtx)) emit_move_insn (operands[0], operands[1]); else - riscv_vector::expand_reduction (PLUS, operands, + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_ORDERED, operands, operands[1], riscv_vector::reduction_type::MASK_LEN_FOLD_LEFT); DONE; diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h index d08d5dfeef4..44fa36c32ab 100644 --- a/gcc/config/riscv/riscv-protos.h +++ b/gcc/config/riscv/riscv-protos.h @@ -433,7 +433,7 @@ void expand_vec_cmp (rtx, rtx_code, rtx, rtx); bool expand_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool); void expand_cond_len_unop (unsigned, rtx *); void expand_cond_len_binop (unsigned, rtx *); -void expand_reduction (rtx_code, rtx *, rtx, +void expand_reduction (unsigned, rtx *, rtx, reduction_type = reduction_type::UNORDERED); #endif bool sew64_scalar_helper (rtx *, rtx *, rtx, machine_mode, diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc index 68b36d9dc4f..1bf5471beaf 100644 --- a/gcc/config/riscv/riscv-v.cc +++ b/gcc/config/riscv/riscv-v.cc @@ -3208,7 +3208,7 @@ expand_cond_len_ternop (unsigned icode, rtx *ops) /* Expand reduction operations. */ void -expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type) +expand_reduction (unsigned unspec, rtx *ops, rtx init, reduction_type type) { rtx vector = type == reduction_type::UNORDERED ? ops[1] : ops[2]; machine_mode vmode = GET_MODE (vector); @@ -3224,13 +3224,10 @@ expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type) rtx m1_tmp2 = gen_reg_rtx (m1_mode); rtx reduc_ops[] = {m1_tmp2, vector, m1_tmp}; - if (FLOAT_MODE_P (vmode) && code == PLUS) + if (unspec == UNSPEC_REDUC_SUM_ORDERED + || unspec == UNSPEC_REDUC_SUM_UNORDERED) { - insn_code icode - = code_for_pred_reduc_plus (type == reduction_type::UNORDERED - ? UNSPEC_UNORDERED - : UNSPEC_ORDERED, - vmode); + insn_code icode = code_for_pred (unspec, vmode); if (type == reduction_type::MASK_LEN_FOLD_LEFT) { rtx mask = ops[3]; @@ -3243,7 +3240,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type) } else { - insn_code icode = code_for_pred_reduc (code, vmode); + insn_code icode = code_for_pred (unspec, vmode); emit_vlmax_insn (icode, REDUCE_OP, reduc_ops); } diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index c54ea6f0560..ab12e130907 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -1533,7 +1533,7 @@ public: }; /* Implements reduction instructions. */ -template<rtx_code CODE> +template<unsigned UNSPEC> class reducop : public function_base { public: @@ -1541,26 +1541,12 @@ public: rtx expand (function_expander &e) const override { - return e.use_exact_insn (code_for_pred_reduc (CODE, e.vector_mode ())); - } -}; - -/* Implements widen reduction instructions. */ -template<int UNSPEC> -class widen_reducop : public function_base -{ -public: - bool apply_mask_policy_p () const override { return false; } - - rtx expand (function_expander &e) const override - { - return e.use_exact_insn ( - code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ())); + return e.use_exact_insn (code_for_pred (UNSPEC, e.vector_mode ())); } }; /* Implements floating-point reduction instructions. */ -template<int UNSPEC, enum frm_op_type FRM_OP = NO_FRM > +template<unsigned UNSPEC, enum frm_op_type FRM_OP = NO_FRM> class freducop : public function_base { public: @@ -1573,27 +1559,7 @@ public: rtx expand (function_expander &e) const override { - return e.use_exact_insn ( - code_for_pred_reduc_plus (UNSPEC, e.vector_mode ())); - } -}; - -/* Implements widening floating-point reduction instructions. */ -template<int UNSPEC, enum frm_op_type FRM_OP = NO_FRM> -class widen_freducop : public function_base -{ -public: - bool has_rounding_mode_operand_p () const override - { - return FRM_OP == HAS_FRM; - } - - bool apply_mask_policy_p () const override { return false; } - - rtx expand (function_expander &e) const override - { - return e.use_exact_insn ( - code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ())); + return e.use_exact_insn (code_for_pred (UNSPEC, e.vector_mode ())); } }; @@ -2281,26 +2247,26 @@ static CONSTEXPR const vfncvt_rtz_x<UNSIGNED_FIX> vfncvt_rtz_xu_obj; static CONSTEXPR const vfncvt_f<NO_FRM> vfncvt_f_obj; static CONSTEXPR const vfncvt_f<HAS_FRM> vfncvt_f_frm_obj; static CONSTEXPR const vfncvt_rod_f vfncvt_rod_f_obj; -static CONSTEXPR const reducop<PLUS> vredsum_obj; -static CONSTEXPR const reducop<UMAX> vredmaxu_obj; -static CONSTEXPR const reducop<SMAX> vredmax_obj; -static CONSTEXPR const reducop<UMIN> vredminu_obj; -static CONSTEXPR const reducop<SMIN> vredmin_obj; -static CONSTEXPR const reducop<AND> vredand_obj; -static CONSTEXPR const reducop<IOR> vredor_obj; -static CONSTEXPR const reducop<XOR> vredxor_obj; -static CONSTEXPR const widen_reducop<UNSPEC_WREDUC_SUM> vwredsum_obj; -static CONSTEXPR const widen_reducop<UNSPEC_WREDUC_USUM> vwredsumu_obj; -static CONSTEXPR const freducop<UNSPEC_UNORDERED> vfredusum_obj; -static CONSTEXPR const freducop<UNSPEC_UNORDERED, HAS_FRM> vfredusum_frm_obj; -static CONSTEXPR const freducop<UNSPEC_ORDERED> vfredosum_obj; -static CONSTEXPR const freducop<UNSPEC_ORDERED, HAS_FRM> vfredosum_frm_obj; -static CONSTEXPR const reducop<SMAX> vfredmax_obj; -static CONSTEXPR const reducop<SMIN> vfredmin_obj; -static CONSTEXPR const widen_freducop<UNSPEC_UNORDERED> vfwredusum_obj; -static CONSTEXPR const widen_freducop<UNSPEC_UNORDERED, HAS_FRM> vfwredusum_frm_obj; -static CONSTEXPR const widen_freducop<UNSPEC_ORDERED> vfwredosum_obj; -static CONSTEXPR const widen_freducop<UNSPEC_ORDERED, HAS_FRM> vfwredosum_frm_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_SUM> vredsum_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_MAXU> vredmaxu_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_MAX> vredmax_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_MINU> vredminu_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_MIN> vredmin_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_AND> vredand_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_OR> vredor_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_XOR> vredxor_obj; +static CONSTEXPR const reducop<UNSPEC_WREDUC_SUM> vwredsum_obj; +static CONSTEXPR const reducop<UNSPEC_WREDUC_SUMU> vwredsumu_obj; +static CONSTEXPR const freducop<UNSPEC_REDUC_SUM_UNORDERED> vfredusum_obj; +static CONSTEXPR const freducop<UNSPEC_REDUC_SUM_UNORDERED, HAS_FRM> vfredusum_frm_obj; +static CONSTEXPR const freducop<UNSPEC_REDUC_SUM_ORDERED> vfredosum_obj; +static CONSTEXPR const freducop<UNSPEC_REDUC_SUM_ORDERED, HAS_FRM> vfredosum_frm_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_MAX> vfredmax_obj; +static CONSTEXPR const reducop<UNSPEC_REDUC_MIN> vfredmin_obj; +static CONSTEXPR const freducop<UNSPEC_WREDUC_SUM_UNORDERED> vfwredusum_obj; +static CONSTEXPR const freducop<UNSPEC_WREDUC_SUM_UNORDERED, HAS_FRM> vfwredusum_frm_obj; +static CONSTEXPR const freducop<UNSPEC_WREDUC_SUM_ORDERED> vfwredosum_obj; +static CONSTEXPR const freducop<UNSPEC_WREDUC_SUM_ORDERED, HAS_FRM> vfwredosum_frm_obj; static CONSTEXPR const vmv vmv_x_obj; static CONSTEXPR const vmv_s vmv_s_obj; static CONSTEXPR const vmv vfmv_f_obj; diff --git a/gcc/config/riscv/vector-iterators.md b/gcc/config/riscv/vector-iterators.md index deb89cbcedc..c9d0a501910 100644 --- a/gcc/config/riscv/vector-iterators.md +++ b/gcc/config/riscv/vector-iterators.md @@ -67,9 +67,6 @@ UNSPEC_UNSIGNED_VFCVT UNSPEC_ROD - UNSPEC_REDUC - UNSPEC_WREDUC_SUM - UNSPEC_WREDUC_USUM UNSPEC_VSLIDEUP UNSPEC_VSLIDEDOWN UNSPEC_VSLIDE1UP @@ -83,6 +80,24 @@ UNSPEC_MODIFY_VL UNSPEC_VFFMA + + ;; Integer and Float Reduction + UNSPEC_REDUC + UNSPEC_REDUC_SUM + UNSPEC_REDUC_SUM_ORDERED + UNSPEC_REDUC_SUM_UNORDERED + UNSPEC_REDUC_MAXU + UNSPEC_REDUC_MAX + UNSPEC_REDUC_MINU + UNSPEC_REDUC_MIN + UNSPEC_REDUC_AND + UNSPEC_REDUC_OR + UNSPEC_REDUC_XOR + + UNSPEC_WREDUC_SUM + UNSPEC_WREDUC_SUMU + UNSPEC_WREDUC_SUM_ORDERED + UNSPEC_WREDUC_SUM_UNORDERED ]) (define_c_enum "unspecv" [ @@ -1274,6 +1289,36 @@ (RVVM8SF "RVVM1DF") (RVVM4SF "RVVM1DF") (RVVM2SF "RVVM1DF") (RVVM1SF "RVVM1DF") (RVVMF2SF "RVVM1DF") ]) +(define_int_iterator ANY_REDUC [ + UNSPEC_REDUC_SUM UNSPEC_REDUC_MAXU UNSPEC_REDUC_MAX UNSPEC_REDUC_MINU + UNSPEC_REDUC_MIN UNSPEC_REDUC_AND UNSPEC_REDUC_OR UNSPEC_REDUC_XOR +]) + +(define_int_iterator ANY_WREDUC [ + UNSPEC_WREDUC_SUM UNSPEC_WREDUC_SUMU +]) + +(define_int_iterator ANY_FREDUC [ + UNSPEC_REDUC_MAX UNSPEC_REDUC_MIN +]) + +(define_int_iterator ANY_FREDUC_SUM [ + UNSPEC_REDUC_SUM_ORDERED UNSPEC_REDUC_SUM_UNORDERED +]) + +(define_int_iterator ANY_FWREDUC_SUM [ + UNSPEC_WREDUC_SUM_ORDERED UNSPEC_WREDUC_SUM_UNORDERED +]) + +(define_int_attr reduc_op [ + (UNSPEC_REDUC_SUM "redsum") + (UNSPEC_REDUC_SUM_ORDERED "redosum") (UNSPEC_REDUC_SUM_UNORDERED "redusum") + (UNSPEC_REDUC_MAXU "redmaxu") (UNSPEC_REDUC_MAX "redmax") (UNSPEC_REDUC_MINU "redminu") (UNSPEC_REDUC_MIN "redmin") + (UNSPEC_REDUC_AND "redand") (UNSPEC_REDUC_OR "redor") (UNSPEC_REDUC_XOR "redxor") + (UNSPEC_WREDUC_SUM "wredsum") (UNSPEC_WREDUC_SUMU "wredsumu") + (UNSPEC_WREDUC_SUM_ORDERED "wredosum") (UNSPEC_WREDUC_SUM_UNORDERED "wredusum") +]) + (define_mode_attr VINDEX [ (RVVM8QI "RVVM8QI") (RVVM4QI "RVVM4QI") (RVVM2QI "RVVM2QI") (RVVM1QI "RVVM1QI") (RVVMF2QI "RVVMF2QI") (RVVMF4QI "RVVMF4QI") (RVVMF8QI "RVVMF8QI") @@ -2271,8 +2316,6 @@ (RVVM2DF "vector_gs_scale_operand_64") (RVVM1DF "vector_gs_scale_operand_64") ]) -(define_int_iterator WREDUC [UNSPEC_WREDUC_SUM UNSPEC_WREDUC_USUM]) - (define_int_iterator ORDER [UNSPEC_ORDERED UNSPEC_UNORDERED]) (define_int_iterator VMULH [UNSPEC_VMULHS UNSPEC_VMULHU UNSPEC_VMULHSU]) @@ -2301,12 +2344,13 @@ (define_int_attr order [ (UNSPEC_ORDERED "o") (UNSPEC_UNORDERED "u") + (UNSPEC_REDUC_SUM_ORDERED "o") (UNSPEC_REDUC_SUM_UNORDERED "u") + (UNSPEC_WREDUC_SUM_ORDERED "o") (UNSPEC_WREDUC_SUM_UNORDERED "u") ]) (define_int_attr v_su [(UNSPEC_VMULHS "") (UNSPEC_VMULHU "u") (UNSPEC_VMULHSU "su") (UNSPEC_VNCLIP "") (UNSPEC_VNCLIPU "u") - (UNSPEC_VFCVT "") (UNSPEC_UNSIGNED_VFCVT "u") - (UNSPEC_WREDUC_SUM "") (UNSPEC_WREDUC_USUM "u")]) + (UNSPEC_VFCVT "") (UNSPEC_UNSIGNED_VFCVT "u")]) (define_int_attr sat_op [(UNSPEC_VAADDU "aaddu") (UNSPEC_VAADD "aadd") (UNSPEC_VASUBU "asubu") (UNSPEC_VASUB "asub") (UNSPEC_VSMUL "smul") (UNSPEC_VSSRL "ssrl") @@ -2392,10 +2436,6 @@ (define_code_iterator any_fix [fix unsigned_fix]) (define_code_iterator any_float [float unsigned_float]) -(define_code_iterator any_reduc [plus umax smax umin smin and ior xor]) -(define_code_iterator any_freduc [smax smin]) -(define_code_attr reduc [(plus "sum") (umax "maxu") (smax "max") (umin "minu") - (smin "min") (and "and") (ior "or") (xor "xor")]) (define_code_attr fix_cvt [(fix "fix_trunc") (unsigned_fix "fixuns_trunc")]) (define_code_attr float_cvt [(float "float") (unsigned_float "floatuns")]) diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md index b6c8e63b0b2..3dd54509315 100644 --- a/gcc/config/riscv/vector.md +++ b/gcc/config/riscv/vector.md @@ -7726,7 +7726,7 @@ ;; ------------------------------------------------------------------------------- ;; Integer Reduction (vred(sum|maxu|max|minu|min|and|or|xor).vs) -(define_insn "@pred_reduc_<reduc><mode>" +(define_insn "@pred_<reduc_op><mode>" [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr, vr") (unspec:<V_LMUL1> [(unspec:<VM> @@ -7736,39 +7736,39 @@ (match_operand 7 "const_int_operand" " i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (any_reduc:VI - (vec_duplicate:VI - (vec_select:<VEL> - (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") - (parallel [(const_int 0)]))) - (match_operand:VI 3 "register_operand" " vr, vr")) + (unspec:<V_LMUL1> [ + (match_operand:VI 3 "register_operand" " vr, vr") + (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") + ] ANY_REDUC) (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))] "TARGET_VECTOR" - "vred<reduc>.vs\t%0,%3,%4%p1" + "v<reduc_op>.vs\t%0,%3,%4%p1" [(set_attr "type" "vired") (set_attr "mode" "<MODE>")]) -;; Integer Reduction Sum Widen (vwredsum[u].vs) -(define_insn "@pred_widen_reduc_plus<v_su><mode>" - [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr,&vr") +;; Integer Widen Reduction Sum (vwredsum[u].vs) +(define_insn "@pred_<reduc_op><mode>" + [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr,&vr") (unspec:<V_EXT_LMUL1> [(unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1") - (match_operand 5 "vector_length_operand" " rK, rK") - (match_operand 6 "const_int_operand" " i, i") - (match_operand 7 "const_int_operand" " i, i") + [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1") + (match_operand 5 "vector_length_operand" " rK, rK") + (match_operand 6 "const_int_operand" " i, i") + (match_operand 7 "const_int_operand" " i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (match_operand:VI_QHS 3 "register_operand" " vr, vr") - (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr") - (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] WREDUC))] + (unspec:<V_EXT_LMUL1> [ + (match_operand:VI_QHS 3 "register_operand" " vr, vr") + (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr") + ] ANY_WREDUC) + (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))] "TARGET_VECTOR" - "vwredsum<v_su>.vs\t%0,%3,%4%p1" + "v<reduc_op>.vs\t%0,%3,%4%p1" [(set_attr "type" "viwred") (set_attr "mode" "<MODE>")]) ;; Float Reduction (vfred(max|min).vs) -(define_insn "@pred_reduc_<reduc><mode>" +(define_insn "@pred_<reduc_op><mode>" [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr, vr") (unspec:<V_LMUL1> [(unspec:<VM> @@ -7778,65 +7778,61 @@ (match_operand 7 "const_int_operand" " i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (any_freduc:VF - (vec_duplicate:VF - (vec_select:<VEL> - (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") - (parallel [(const_int 0)]))) - (match_operand:VF 3 "register_operand" " vr, vr")) + (unspec:<V_LMUL1> [ + (match_operand:VF 3 "register_operand" " vr, vr") + (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") + ] ANY_FREDUC) (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))] "TARGET_VECTOR" - "vfred<reduc>.vs\t%0,%3,%4%p1" + "vf<reduc_op>.vs\t%0,%3,%4%p1" [(set_attr "type" "vfredu") (set_attr "mode" "<MODE>")]) -;; Float Ordered Reduction Sum (vfred[ou]sum.vs) -(define_insn "@pred_reduc_plus<order><mode>" +;; Float Reduction Sum (vfred[ou]sum.vs) +(define_insn "@pred_<reduc_op><mode>" [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr,vr") (unspec:<V_LMUL1> - [(unspec:<V_LMUL1> - [(unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1") - (match_operand 5 "vector_length_operand" " rK, rK") - (match_operand 6 "const_int_operand" " i, i") - (match_operand 7 "const_int_operand" " i, i") - (match_operand 8 "const_int_operand" " i, i") - (reg:SI VL_REGNUM) - (reg:SI VTYPE_REGNUM) - (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE) - (plus:VF - (vec_duplicate:VF - (vec_select:<VEL> - (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") - (parallel [(const_int 0)]))) - (match_operand:VF 3 "register_operand" " vr, vr")) - (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))] + [(unspec:<VM> + [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1") + (match_operand 5 "vector_length_operand" " rK, rK") + (match_operand 6 "const_int_operand" " i, i") + (match_operand 7 "const_int_operand" " i, i") + (match_operand 8 "const_int_operand" " i, i") + (reg:SI VL_REGNUM) + (reg:SI VTYPE_REGNUM) + (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE) + (unspec:<V_LMUL1> [ + (match_operand:VF 3 "register_operand" " vr, vr") + (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr") + ] ANY_FREDUC_SUM) + (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))] "TARGET_VECTOR" - "vfred<order>sum.vs\t%0,%3,%4%p1" + "vf<reduc_op>.vs\t%0,%3,%4%p1" [(set_attr "type" "vfred<order>") (set_attr "mode" "<MODE>") (set (attr "frm_mode") (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))]) ;; Float Widen Reduction Sum (vfwred[ou]sum.vs) -(define_insn "@pred_widen_reduc_plus<order><mode>" - [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr, &vr") +(define_insn "@pred_<reduc_op><mode>" + [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr, &vr") (unspec:<V_EXT_LMUL1> - [(unspec:<V_EXT_LMUL1> - [(unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1") - (match_operand 5 "vector_length_operand" " rK, rK") - (match_operand 6 "const_int_operand" " i, i") - (match_operand 7 "const_int_operand" " i, i") - (match_operand 8 "const_int_operand" " i, i") - (reg:SI VL_REGNUM) - (reg:SI VTYPE_REGNUM) - (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE) + [(unspec:<VM> + [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1") + (match_operand 5 "vector_length_operand" " rK, rK") + (match_operand 6 "const_int_operand" " i, i") + (match_operand 7 "const_int_operand" " i, i") + (match_operand 8 "const_int_operand" " i, i") + (reg:SI VL_REGNUM) + (reg:SI VTYPE_REGNUM) + (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE) + (unspec:<V_EXT_LMUL1> [ (match_operand:VF_HS 3 "register_operand" " vr, vr") (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr") - (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))] + ] ANY_FWREDUC_SUM) + (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))] "TARGET_VECTOR" - "vfwred<order>sum.vs\t%0,%3,%4%p1" + "vf<reduc_op>.vs\t%0,%3,%4%p1" [(set_attr "type" "vfwred<order>") (set_attr "mode" "<MODE>") (set (attr "frm_mode") -- 2.36.3