Commit 5365718a authored by Aurelien Jarno's avatar Aurelien Jarno Committed by Richard Henderson
Browse files

tcg/optimize: fold temp copies test in tcg_opt_gen_mov



Each call to tcg_opt_gen_mov is preceeded by a test to check if the
source and destination temps are copies. Fold that into the
tcg_opt_gen_mov function.

Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: default avatarAurelien Jarno <aurelien@aurel32.net>
Message-Id: <1433447607-31184-4-git-send-email-aurelien@aurel32.net>
Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent 8d6a9160
Loading
Loading
Loading
Loading
+9 −18
Original line number Diff line number Diff line
@@ -196,6 +196,11 @@ static bool temps_are_copies(TCGArg arg1, TCGArg arg2)
static void tcg_opt_gen_mov(TCGContext *s, TCGOp *op, TCGArg *args,
                            TCGArg dst, TCGArg src)
{
    if (temps_are_copies(dst, src)) {
        tcg_op_remove(s, op);
        return;
    }

    TCGOpcode new_op = op_to_mov(op->opc);
    tcg_target_ulong mask;

@@ -788,11 +793,7 @@ static void tcg_constant_folding(TCGContext *s)
            }
            break;
        do_mov3:
            if (temps_are_copies(args[0], args[1])) {
                tcg_op_remove(s, op);
            } else {
            tcg_opt_gen_mov(s, op, args, args[0], args[1]);
            }
            continue;
        default:
            break;
@@ -947,9 +948,7 @@ static void tcg_constant_folding(TCGContext *s)
        }
        if (affected == 0) {
            assert(nb_oargs == 1);
            if (temps_are_copies(args[0], args[1])) {
                tcg_op_remove(s, op);
            } else if (temps[args[1]].state != TCG_TEMP_CONST) {
            if (temps[args[1]].state != TCG_TEMP_CONST) {
                tcg_opt_gen_mov(s, op, args, args[0], args[1]);
            } else {
                tcg_opt_gen_movi(s, op, args,
@@ -979,9 +978,7 @@ static void tcg_constant_folding(TCGContext *s)
        CASE_OP_32_64(or):
        CASE_OP_32_64(and):
            if (temps_are_copies(args[1], args[2])) {
                if (temps_are_copies(args[0], args[1])) {
                    tcg_op_remove(s, op);
                } else if (temps[args[1]].state != TCG_TEMP_CONST) {
                if (temps[args[1]].state != TCG_TEMP_CONST) {
                    tcg_opt_gen_mov(s, op, args, args[0], args[1]);
                } else {
                    tcg_opt_gen_movi(s, op, args,
@@ -1013,10 +1010,6 @@ static void tcg_constant_folding(TCGContext *s)
           allocator where needed and possible.  Also detect copies. */
        switch (opc) {
        CASE_OP_32_64(mov):
            if (temps_are_copies(args[0], args[1])) {
                tcg_op_remove(s, op);
                break;
            }
            if (temps[args[1]].state != TCG_TEMP_CONST) {
                tcg_opt_gen_mov(s, op, args, args[0], args[1]);
                break;
@@ -1118,9 +1111,7 @@ static void tcg_constant_folding(TCGContext *s)
        CASE_OP_32_64(movcond):
            tmp = do_constant_folding_cond(opc, args[1], args[2], args[5]);
            if (tmp != 2) {
                if (temps_are_copies(args[0], args[4-tmp])) {
                    tcg_op_remove(s, op);
                } else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) {
                if (temps[args[4-tmp]].state == TCG_TEMP_CONST) {
                    tcg_opt_gen_movi(s, op, args,
                                     args[0], temps[args[4-tmp]].val);
                } else {