On Thu, Sep 27, 2012 at 10:19:53AM -0700, Richard Henderson wrote: > Signed-off-by: Richard Henderson <r...@twiddle.net> > --- > tcg/optimize.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/tcg/optimize.c b/tcg/optimize.c > index 004c336..d39926e 100644 > --- a/tcg/optimize.c > +++ b/tcg/optimize.c > @@ -397,6 +397,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) > @@ -475,6 +491,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; > }
Reviewed-by: Aurelien Jarno <aurel...@aurel32.net> -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurel...@aurel32.net http://www.aurel32.net