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:
parent
27cdb85d06
commit
246c4b72fa
@ -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++) {
|
||||
@ -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;
|
||||
@ -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]);
|
||||
}
|
||||
@ -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:
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user