Skip to content

Commit

Permalink
tcg/optimize: Split out do_constant_folding_cond1
Browse files Browse the repository at this point in the history
Handle modifications to the arguments and condition
in a single place.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
rth7680 committed Feb 3, 2024
1 parent 27cdb85 commit 246c4b7
Showing 1 changed file with 27 additions and 30 deletions.
57 changes: 27 additions & 30 deletions tcg/optimize.c
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,23 @@ static bool swap_commutative2(TCGArg *p1, TCGArg *p2)
return false;
}

static int do_constant_folding_cond1(OptContext *ctx, TCGArg dest,
TCGArg *p1, TCGArg *p2, TCGArg *pcond)
{
TCGCond cond;
bool swap;
int r;

swap = swap_commutative(dest, p1, p2);
cond = *pcond;
if (swap) {
*pcond = cond = tcg_swap_cond(cond);
}

r = do_constant_folding_cond(ctx->type, *p1, *p2, cond);
return r;
}

static void init_arguments(OptContext *ctx, TCGOp *op, int nb_args)
{
for (int i = 0; i < nb_args; i++) {
Expand Down Expand Up @@ -1193,14 +1210,8 @@ static bool fold_andc(OptContext *ctx, TCGOp *op)

static bool fold_brcond(OptContext *ctx, TCGOp *op)
{
TCGCond cond = op->args[2];
int i;

if (swap_commutative(NO_DEST, &op->args[0], &op->args[1])) {
op->args[2] = cond = tcg_swap_cond(cond);
}

i = do_constant_folding_cond(ctx->type, op->args[0], op->args[1], cond);
int i = do_constant_folding_cond1(ctx, NO_DEST, &op->args[0],
&op->args[1], &op->args[2]);
if (i == 0) {
tcg_op_remove(ctx->tcg, op);
return true;
Expand Down Expand Up @@ -1695,21 +1706,18 @@ static bool fold_mov(OptContext *ctx, TCGOp *op)

static bool fold_movcond(OptContext *ctx, TCGOp *op)
{
TCGCond cond = op->args[5];
int i;

if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
op->args[5] = cond = tcg_swap_cond(cond);
}
/*
* Canonicalize the "false" input reg to match the destination reg so
* that the tcg backend can implement a "move if true" operation.
*/
if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
op->args[5] = cond = tcg_invert_cond(cond);
op->args[5] = tcg_invert_cond(op->args[5]);
}

i = do_constant_folding_cond(ctx->type, op->args[1], op->args[2], cond);
i = do_constant_folding_cond1(ctx, NO_DEST, &op->args[1],
&op->args[2], &op->args[5]);
if (i >= 0) {
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[4 - i]);
}
Expand All @@ -1723,6 +1731,7 @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
uint64_t tv = arg_info(op->args[3])->val;
uint64_t fv = arg_info(op->args[4])->val;
TCGOpcode opc, negopc = 0;
TCGCond cond = op->args[5];

switch (ctx->type) {
case TCG_TYPE_I32:
Expand Down Expand Up @@ -1950,14 +1959,8 @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)

static bool fold_setcond(OptContext *ctx, TCGOp *op)
{
TCGCond cond = op->args[3];
int i;

if (swap_commutative(op->args[0], &op->args[1], &op->args[2])) {
op->args[3] = cond = tcg_swap_cond(cond);
}

i = do_constant_folding_cond(ctx->type, op->args[1], op->args[2], cond);
int i = do_constant_folding_cond1(ctx, op->args[0], &op->args[1],
&op->args[2], &op->args[3]);
if (i >= 0) {
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
}
Expand All @@ -1969,14 +1972,8 @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)

static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
{
TCGCond cond = op->args[3];
int i;

if (swap_commutative(op->args[0], &op->args[1], &op->args[2])) {
op->args[3] = cond = tcg_swap_cond(cond);
}

i = do_constant_folding_cond(ctx->type, op->args[1], op->args[2], cond);
int i = do_constant_folding_cond1(ctx, op->args[0], &op->args[1],
&op->args[2], &op->args[3]);
if (i >= 0) {
return tcg_opt_gen_movi(ctx, op, op->args[0], -i);
}
Expand Down

0 comments on commit 246c4b7

Please sign in to comment.