public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/riscv/heads/gcc-13-with-riscv-opts)] RISC-V: Refactor vector reduction patterns
@ 2023-09-18 18:26 Jeff Law
0 siblings, 0 replies; only message in thread
From: Jeff Law @ 2023-09-18 18:26 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:d99766a42d0a29bf12704cb55ff320d684032a6d
commit d99766a42d0a29bf12704cb55ff320d684032a6d
Author: Lehua Ding <lehua.ding@rivai.ai>
Date: Wed Sep 13 14:59:40 2023 +0800
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.
(cherry picked from commit 6223ea766daf7c9155106b9784302442e2ff98d3)
Diff:
---
gcc/config/riscv/autovec.md | 27 +++---
gcc/config/riscv/riscv-protos.h | 2 +-
gcc/config/riscv/riscv-v.cc | 13 +--
gcc/config/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 9489d51a802..9e05afddd29 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 5b1ec36816a..fb0c8abd995 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")
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-09-18 18:26 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-18 18:26 [gcc(refs/vendors/riscv/heads/gcc-13-with-riscv-opts)] RISC-V: Refactor vector reduction patterns Jeff Law
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).