On 09/21/2012 01:10 PM, malc wrote:
> + if (dest == v2) {
> + label_ptr = s->code_ptr;
> + tcg_out32 (s, tcg_to_bc[tcg_invert_cond (cond)]);
> + tcg_out_mov (s, TCG_TYPE_I32, dest, v1);
> + reloc_pc14 (label_ptr, (tcg_target_long) s->code_ptr);
> + }
> + else {
> + tcg_out_mov (s, TCG_TYPE_I32, dest, v1);
> + label_ptr = s->code_ptr;
> + tcg_out32 (s, tcg_to_bc[cond]);
> + tcg_out_mov (s, TCG_TYPE_I32, dest, v2);
> + reloc_pc14 (label_ptr, (tcg_target_long) s->code_ptr);
> + }
How about
if (dest == v2) {
cond = tcg_invert_cond(cond);
v2 = v1;
} else if (dest != v1) {
tcg_out_mov(s, TCG_TYPE_I32, dest, v1);
}
/* Branch forward over one insn. */
tcg_out32 (s, tcg_to_bc[cond] | 4);
tcg_out_mov(s, TCG_TYPE_I32, dest, v2);
which avoids an extra mov if dest == v1, and also minimizes the code.
r~