diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2024-12-08 18:26:48 -0600 |
---|---|---|
committer | Richard Henderson <richard.henderson@linaro.org> | 2024-12-24 07:32:50 -0800 |
commit | 56e06ecfa5f13816b68b850f4ce46d8756e2c32b (patch) | |
tree | 0f2b5cb3e4773075b8187aefc5f27f278a15a4aa /tcg | |
parent | 045ace35a8587f9552b528595f2d67a76b77f1b5 (diff) | |
download | qemu-56e06ecfa5f13816b68b850f4ce46d8756e2c32b.zip qemu-56e06ecfa5f13816b68b850f4ce46d8756e2c32b.tar.gz qemu-56e06ecfa5f13816b68b850f4ce46d8756e2c32b.tar.bz2 |
tcg/optimize: Copy mask writeback to fold_masks
Use of fold_masks should be restricted to those opcodes that
can reliably make use of it -- those with a single output,
and from higher-level folders that set up the masks.
Prepare for conversion of each folder in turn.
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.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c index 6757fe0..2aa57af 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -1048,6 +1048,12 @@ static bool fold_masks(OptContext *ctx, TCGOp *op) { uint64_t z_mask = ctx->z_mask; uint64_t s_mask = ctx->s_mask; + const TCGOpDef *def = &tcg_op_defs[op->opc]; + TCGTemp *ts; + TempOptInfo *ti; + + /* Only single-output opcodes are supported here. */ + tcg_debug_assert(def->nb_oargs == 1); /* * 32-bit ops generate 32-bit results, which for the purpose of @@ -1059,14 +1065,19 @@ static bool fold_masks(OptContext *ctx, TCGOp *op) if (ctx->type == TCG_TYPE_I32) { z_mask = (int32_t)z_mask; s_mask |= MAKE_64BIT_MASK(32, 32); - ctx->z_mask = z_mask; - ctx->s_mask = s_mask; } if (z_mask == 0) { return tcg_opt_gen_movi(ctx, op, op->args[0], 0); } - return false; + + ts = arg_temp(op->args[0]); + reset_ts(ctx, ts); + + ti = ts_info(ts); + ti->z_mask = z_mask; + ti->s_mask = s_mask; + return true; } /* |