Improve TCG constant use by creating only once for several uses. Signed-off-by: Laurent Vivier <laur...@vivier.eu> --- target-m68k/translate.c | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-)
diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 9e379b3..ae57792 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -1778,40 +1778,48 @@ DISAS_INSN(jump) DISAS_INSN(addsubq) { - TCGv src1; - TCGv src2; + TCGv src; TCGv dest; - int val; + TCGv val; + int imm; TCGv addr; + int opsize; - SRC_EA(env, src1, OS_LONG, 0, &addr); - val = (insn >> 9) & 7; - if (val == 0) - val = 8; + if ((insn & 070) == 010) { + /* Operation on address register is always long. */ + opsize = OS_LONG; + } else { + opsize = insn_opsize(insn, 6); + } + SRC_EA(env, src, opsize, -1, &addr); + imm = (insn >> 9) & 7; + if (imm == 0) { + imm = 8; + } + val = tcg_const_i32(imm); dest = tcg_temp_new(); - tcg_gen_mov_i32(dest, src1); + tcg_gen_mov_i32(dest, src); if ((insn & 0x38) == 0x08) { /* Don't update condition codes if the destination is an address register. */ if (insn & 0x0100) { - tcg_gen_subi_i32(dest, dest, val); + tcg_gen_sub_i32(dest, dest, val); } else { - tcg_gen_addi_i32(dest, dest, val); + tcg_gen_add_i32(dest, dest, val); } } else { - src2 = tcg_const_i32(val); if (insn & 0x0100) { - SET_X_FLAG(OS_LONG, dest, tcg_const_i32(val)); - tcg_gen_subi_i32(dest, dest, val); - set_cc_op(s, CC_OP_SUB); + SET_X_FLAG(opsize, dest, val); + tcg_gen_sub_i32(dest, dest, val); + SET_CC_OP(opsize, SUB); } else { - tcg_gen_addi_i32(dest, dest, val); - SET_X_FLAG(OS_LONG, dest, tcg_const_i32(val)); - SET_CC_OP(OS_LONG, ADD); + tcg_gen_add_i32(dest, dest, val); + SET_X_FLAG(opsize, dest, val); + SET_CC_OP(opsize, ADD); } - gen_update_cc_add(dest, src2); + gen_update_cc_add(dest, val); } - DEST_EA(env, insn, OS_LONG, dest, &addr); + DEST_EA(env, insn, opsize, dest, &addr); } DISAS_INSN(tpf) -- 2.4.3