aboutsummaryrefslogtreecommitdiff
path: root/tcg
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2024-12-08 20:47:59 -0600
committerRichard Henderson <richard.henderson@linaro.org>2024-12-24 08:32:15 -0800
commit95eb229363f28aaacf506974cdb3047d816345fe (patch)
tree4bc3ac8ffea841d7fe735a4a22df97796e59e50f /tcg
parentf9e3934903a8e388559c373f93544e3f9e6a9fc0 (diff)
downloadqemu-95eb229363f28aaacf506974cdb3047d816345fe.zip
qemu-95eb229363f28aaacf506974cdb3047d816345fe.tar.gz
qemu-95eb229363f28aaacf506974cdb3047d816345fe.tar.bz2
tcg/optimize: Distinguish simplification in fold_setcond_zmask
Change return from bool to int; distinguish between complete folding, simplification, and no change. Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'tcg')
-rw-r--r--tcg/optimize.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c
index e78f5a7..678015a 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -2155,7 +2155,8 @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
return finish_folding(ctx, op);
}
-static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
+/* Return 1 if finished, -1 if simplified, 0 if unchanged. */
+static int fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
{
uint64_t a_zmask, b_val;
TCGCond cond;
@@ -2250,11 +2251,10 @@ static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
op->opc = xor_opc;
op->args[2] = arg_new_constant(ctx, 1);
}
- return false;
+ return -1;
}
}
-
- return false;
+ return 0;
}
static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
@@ -2359,10 +2359,13 @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
}
- if (fold_setcond_zmask(ctx, op, false)) {
+ i = fold_setcond_zmask(ctx, op, false);
+ if (i > 0) {
return true;
}
- fold_setcond_tst_pow2(ctx, op, false);
+ if (i == 0) {
+ fold_setcond_tst_pow2(ctx, op, false);
+ }
ctx->z_mask = 1;
return false;
@@ -2376,10 +2379,13 @@ static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
return tcg_opt_gen_movi(ctx, op, op->args[0], -i);
}
- if (fold_setcond_zmask(ctx, op, true)) {
+ i = fold_setcond_zmask(ctx, op, true);
+ if (i > 0) {
return true;
}
- fold_setcond_tst_pow2(ctx, op, true);
+ if (i == 0) {
+ fold_setcond_tst_pow2(ctx, op, true);
+ }
/* Value is {0,-1} so all bits are repetitions of the sign. */
ctx->s_mask = -1;