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>
This commit is contained in:
Richard Henderson 2024-12-08 20:47:59 -06:00
parent f9e3934903
commit 95eb229363

View File

@ -2155,7 +2155,8 @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
return finish_folding(ctx, 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; uint64_t a_zmask, b_val;
TCGCond cond; TCGCond cond;
@ -2250,11 +2251,10 @@ static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
op->opc = xor_opc; op->opc = xor_opc;
op->args[2] = arg_new_constant(ctx, 1); op->args[2] = arg_new_constant(ctx, 1);
} }
return false; return -1;
} }
} }
return 0;
return false;
} }
static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg) 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); 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; return true;
} }
if (i == 0) {
fold_setcond_tst_pow2(ctx, op, false); fold_setcond_tst_pow2(ctx, op, false);
}
ctx->z_mask = 1; ctx->z_mask = 1;
return false; 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); 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; return true;
} }
if (i == 0) {
fold_setcond_tst_pow2(ctx, op, true); fold_setcond_tst_pow2(ctx, op, true);
}
/* Value is {0,-1} so all bits are repetitions of the sign. */ /* Value is {0,-1} so all bits are repetitions of the sign. */
ctx->s_mask = -1; ctx->s_mask = -1;