[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 07/12] tcg/optimize: Optimize cmp_vec and cmpsel_vec
From: |
Richard Henderson |
Subject: |
[PATCH 07/12] tcg/optimize: Optimize cmp_vec and cmpsel_vec |
Date: |
Sat, 7 Sep 2024 19:26:27 -0700 |
Place immediate values second in the comparison.
Place destination matches first in the true/false values.
All of this mirrors what we do for integer setcond and movcond.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/optimize.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/tcg/optimize.c b/tcg/optimize.c
index cf311790e0..f11f576fd4 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -2422,6 +2422,36 @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
}
+static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
+{
+ /* Canonicalize the comparison to put immediate second. */
+ if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
+ op->args[3] = tcg_swap_cond(op->args[3]);
+ }
+ return false;
+}
+
+static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
+{
+ /* If true and false values are the same, eliminate the cmp. */
+ if (args_are_copies(op->args[3], op->args[4])) {
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[3]);
+ }
+
+ /* Canonicalize the comparison to put immediate second. */
+ if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
+ op->args[5] = tcg_swap_cond(op->args[5]);
+ }
+ /*
+ * Canonicalize the "false" input reg to match the destination,
+ * so that the tcg backend can implement "move if true".
+ */
+ if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
+ op->args[5] = tcg_invert_cond(op->args[5]);
+ }
+ return false;
+}
+
static bool fold_sextract(OptContext *ctx, TCGOp *op)
{
uint64_t z_mask, s_mask, s_mask_old;
@@ -2928,6 +2958,12 @@ void tcg_optimize(TCGContext *s)
case INDEX_op_setcond2_i32:
done = fold_setcond2(&ctx, op);
break;
+ case INDEX_op_cmp_vec:
+ done = fold_cmp_vec(&ctx, op);
+ break;
+ case INDEX_op_cmpsel_vec:
+ done = fold_cmpsel_vec(&ctx, op);
+ break;
CASE_OP_32_64(sextract):
done = fold_sextract(&ctx, op);
break;
--
2.43.0
- [PATCH 00/12] tcg: Improve support for cmpsel_vec, Richard Henderson, 2024/09/07
- [PATCH 03/12] tcg/i386: Split out tcg_out_vex_modrm_type, Richard Henderson, 2024/09/07
- [PATCH 04/12] tcg/i386: Do not expand cmp_vec early, Richard Henderson, 2024/09/07
- [PATCH 01/12] tcg: Fix iteration step in 32-bit gvec operation, Richard Henderson, 2024/09/07
- [PATCH 02/12] tcg: Export vec_gen_6, Richard Henderson, 2024/09/07
- [PATCH 05/12] tcg/i386: Do not expand cmpsel_vec early, Richard Henderson, 2024/09/07
- [PATCH 07/12] tcg/optimize: Optimize cmp_vec and cmpsel_vec,
Richard Henderson <=
- [PATCH 06/12] tcg/optimize: Fold movcond with true and false values identical, Richard Henderson, 2024/09/07
- [PATCH 08/12] tcg/optimize: Optimize bitsel_vec, Richard Henderson, 2024/09/07
- [PATCH 09/12] tcg/i386: Optimize cmpsel with constant 0 arguments, Richard Henderson, 2024/09/07
- [PATCH 11/12] tcg/i386: Add predicate parameters to tcg_out_evex_opc, Richard Henderson, 2024/09/07
- [PATCH 10/12] tcg/i386: Implement cmp_vec with avx512 insns, Richard Henderson, 2024/09/07
- [PATCH 12/12] tcg/i386: Implement cmpsel_vec with avx512 insns, Richard Henderson, 2024/09/07
- Re: [PATCH 00/12] tcg: Improve support for cmpsel_vec, Richard Henderson, 2024/09/09