Message ID | 1439151229-27747-19-git-send-email-laurent@vivier.eu |
---|---|
State | New |
Headers | show |
On 08/09/2015 01:13 PM, Laurent Vivier wrote: > Improve TCG constant use by creating only once for several uses. > > Signed-off-by: Laurent Vivier <laurent@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); > } You do need to free val here. > - DEST_EA(env, insn, OS_LONG, dest, &addr); > + DEST_EA(env, insn, opsize, dest, &addr); > } > > DISAS_INSN(tpf) >
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)
Improve TCG constant use by creating only once for several uses. Signed-off-by: Laurent Vivier <laurent@vivier.eu> --- target-m68k/translate.c | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-)