diff options
author | Richard Henderson <rth@twiddle.net> | 2012-10-02 11:32:23 -0700 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2012-10-17 17:31:57 +0200 |
commit | 0bfcb86538d0bcffa3ef5434810f91aa861431ce (patch) | |
tree | 9caf117e880f1689162d78f561707ad84917dfbb /tcg/optimize.c | |
parent | 1e484e61e2d9387c18a40e9e239b304003f5d183 (diff) | |
download | qemu-0bfcb86538d0bcffa3ef5434810f91aa861431ce.tar.gz qemu-0bfcb86538d0bcffa3ef5434810f91aa861431ce.tar.bz2 qemu-0bfcb86538d0bcffa3ef5434810f91aa861431ce.zip |
tcg: Swap commutative double-word comparisons
Signed-off-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Diffstat (limited to 'tcg/optimize.c')
-rw-r--r-- | tcg/optimize.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c index 8d74186ab3..9ecea7085a 100644 --- a/tcg/optimize.c +++ b/tcg/optimize.c @@ -405,6 +405,22 @@ static bool swap_commutative(TCGArg dest, TCGArg *p1, TCGArg *p2) return false; } +static bool swap_commutative2(TCGArg *p1, TCGArg *p2) +{ + int sum = 0; + sum += temps[p1[0]].state == TCG_TEMP_CONST; + sum += temps[p1[1]].state == TCG_TEMP_CONST; + sum -= temps[p2[0]].state == TCG_TEMP_CONST; + sum -= temps[p2[1]].state == TCG_TEMP_CONST; + if (sum > 0) { + TCGArg t; + t = p1[0], p1[0] = p2[0], p2[0] = t; + t = p1[1], p1[1] = p2[1], p2[1] = t; + return true; + } + return false; +} + /* Propagate constants and copies, fold constant expressions. */ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, TCGArg *args, TCGOpDef *tcg_op_defs) @@ -483,6 +499,16 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, swap_commutative(args[0], &args[2], &args[4]); swap_commutative(args[1], &args[3], &args[5]); break; + case INDEX_op_brcond2_i32: + if (swap_commutative2(&args[0], &args[2])) { + args[4] = tcg_swap_cond(args[4]); + } + break; + case INDEX_op_setcond2_i32: + if (swap_commutative2(&args[1], &args[3])) { + args[5] = tcg_swap_cond(args[5]); + } + break; default: break; } |