tcg/optimize: Split out do_constant_folding_cond1

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>
This commit is contained in:
Richard Henderson 2023-10-24 16:36:50 -07:00
parent 27cdb85d06
commit 246c4b72fa

View File

@ -796,6 +796,23 @@ static bool swap_commutative2(TCGArg *p1, TCGArg *p2)
return false; 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) static void init_arguments(OptContext *ctx, TCGOp *op, int nb_args)
{ {
for (int i = 0; i < nb_args; i++) { for (int i = 0; i < nb_args; i++) {
@ -1193,14 +1210,8 @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
static bool fold_brcond(OptContext *ctx, TCGOp *op) static bool fold_brcond(OptContext *ctx, TCGOp *op)
{ {
TCGCond cond = op->args[2]; int i = do_constant_folding_cond1(ctx, NO_DEST, &op->args[0],
int i; &op->args[1], &op->args[2]);
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);
if (i == 0) { if (i == 0) {
tcg_op_remove(ctx->tcg, op); tcg_op_remove(ctx->tcg, op);
return true; return true;
@ -1695,21 +1706,18 @@ static bool fold_mov(OptContext *ctx, TCGOp *op)
static bool fold_movcond(OptContext *ctx, TCGOp *op) static bool fold_movcond(OptContext *ctx, TCGOp *op)
{ {
TCGCond cond = op->args[5];
int i; 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 * Canonicalize the "false" input reg to match the destination reg so
* that the tcg backend can implement a "move if true" operation. * that the tcg backend can implement a "move if true" operation.
*/ */
if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) { 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) { if (i >= 0) {
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[4 - i]); return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[4 - i]);
} }
@ -1723,6 +1731,7 @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
uint64_t tv = arg_info(op->args[3])->val; uint64_t tv = arg_info(op->args[3])->val;
uint64_t fv = arg_info(op->args[4])->val; uint64_t fv = arg_info(op->args[4])->val;
TCGOpcode opc, negopc = 0; TCGOpcode opc, negopc = 0;
TCGCond cond = op->args[5];
switch (ctx->type) { switch (ctx->type) {
case TCG_TYPE_I32: case TCG_TYPE_I32:
@ -1950,14 +1959,8 @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
static bool fold_setcond(OptContext *ctx, TCGOp *op) static bool fold_setcond(OptContext *ctx, TCGOp *op)
{ {
TCGCond cond = op->args[3]; int i = do_constant_folding_cond1(ctx, op->args[0], &op->args[1],
int i; &op->args[2], &op->args[3]);
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);
if (i >= 0) { if (i >= 0) {
return tcg_opt_gen_movi(ctx, op, op->args[0], i); return tcg_opt_gen_movi(ctx, op, op->args[0], i);
} }
@ -1969,14 +1972,8 @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
static bool fold_negsetcond(OptContext *ctx, TCGOp *op) static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
{ {
TCGCond cond = op->args[3]; int i = do_constant_folding_cond1(ctx, op->args[0], &op->args[1],
int i; &op->args[2], &op->args[3]);
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);
if (i >= 0) { if (i >= 0) {
return tcg_opt_gen_movi(ctx, op, op->args[0], -i); return tcg_opt_gen_movi(ctx, op, op->args[0], -i);
} }