On 5/5/25 1:27 PM, Richard Henderson wrote:
Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
---
tcg/optimize.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/tcg/optimize.c b/tcg/optimize.c
index faee3e8580..08d15e5395 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -1917,7 +1917,7 @@ static bool fold_dup2(OptContext *ctx, TCGOp *op)
static bool fold_eqv(OptContext *ctx, TCGOp *op)
{
- uint64_t s_mask;
+ uint64_t z_mask, o_mask, s_mask;
TempOptInfo *t1, *t2;
if (fold_const2_commutative(ctx, op) ||
@@ -1947,8 +1947,12 @@ static bool fold_eqv(OptContext *ctx, TCGOp *op)
}
t1 = arg_info(op->args[1]);
+
+ z_mask = (t1->z_mask | ~t2->o_mask) & (t2->z_mask | ~t1->o_mask);
+ o_mask = ~(t1->z_mask | t2->z_mask) | (t1->o_mask & t2->o_mask);
s_mask = t1->s_mask & t2->s_mask;
Even after writing the truth table for eqv(t1, t2) = ~(t1 ^ t2), I'm not
sure to understand directly how z_mask and o_mask are derived.
In this case, we have:
t1 | t2 | ~(t1 ^ t2)
0 | 0 | 1
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1
In this commit, and in the series, it's confusing for me to have mask
values set as 0 for 0, and 1 for 1. When mixing that with bitwise
operations, it starts to get hard to follow, always having to remember
if you deal with 0 or 1.
It could really help to have simple helpers for (known) zeroes(v) and
ones(v). I feel as well some comments would be removed because it would
become explicit what we are dealing with.
let:
zeroes(v) = ~v->z_mask
ones(v) = v->o_mask
res_zeroes = zeroes(t1) & ones(t2) | ones(t1) & zeroes(t2);
z_mask = ~res_zeroes;
which gives:
z_mask = ~zeroes
= ~((~t1->z & t2->o) | (t1->o & ~t2->z))
= ~(~t1->z & t2->o) & ~(t1->o & ~t2->z)
= (t1->z | ~t2->o) | (~t1->o | t2->z)
which is the code we have here.
- return fold_masks_s(ctx, op, s_mask);
+
+ return fold_masks_zos(ctx, op, z_mask, o_mask, s_mask);
}
static bool fold_extract(OptContext *ctx, TCGOp *op)
I'm not necessarily forcing a change, but I don't see myself rewriting
truth tables and developing expressions on paper for all operations to
review they are correct.
Reviewed-by: Pierrick Bouvier <pierrick.bouv...@linaro.org>