qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC 2/3] target/m68k: use tcg_temp_try_free()


From: Laurent Vivier
Subject: [Qemu-devel] [RFC 2/3] target/m68k: use tcg_temp_try_free()
Date: Thu, 15 Mar 2018 20:19:57 +0100

SRC_EA() and gen_extend() can return either a temporary
TCGv or memory allocated one. Try to free the temporary
one with tcg_temp_try_free().

Signed-off-by: Laurent Vivier <address@hidden>
---
 target/m68k/translate.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/target/m68k/translate.c b/target/m68k/translate.c
index cef6f663ad..03aa701dde 100644
--- a/target/m68k/translate.c
+++ b/target/m68k/translate.c
@@ -1550,6 +1550,7 @@ DISAS_INSN(mulw)
         tcg_gen_ext16u_i32(tmp, reg);
     SRC_EA(env, src, OS_WORD, sign, NULL);
     tcg_gen_mul_i32(tmp, tmp, src);
+    tcg_temp_try_free(src);
     tcg_gen_mov_i32(reg, tmp);
     gen_logic_cc(s, tmp, OS_LONG);
     tcg_temp_free(tmp);
@@ -1574,6 +1575,7 @@ DISAS_INSN(divw)
     } else {
         gen_helper_divuw(cpu_env, destr, src);
     }
+    tcg_temp_try_free(src);
     tcg_temp_free(destr);
 
     set_cc_op(s, CC_OP_FLAGS);
@@ -1605,6 +1607,7 @@ DISAS_INSN(divl)
         } else {
             gen_helper_divull(cpu_env, num, reg, den);
         }
+        tcg_temp_try_free(den);
         tcg_temp_free(reg);
         tcg_temp_free(num);
         set_cc_op(s, CC_OP_FLAGS);
@@ -1622,6 +1625,7 @@ DISAS_INSN(divl)
     } else {
         gen_helper_divul(cpu_env, num, reg, den);
     }
+    tcg_temp_try_free(den);
     tcg_temp_free(reg);
     tcg_temp_free(num);
 
@@ -1762,9 +1766,11 @@ DISAS_INSN(abcd_reg)
     src = gen_extend(DREG(insn, 0), OS_BYTE, 0);
     dest = gen_extend(DREG(insn, 9), OS_BYTE, 0);
     bcd_add(dest, src);
+    tcg_temp_try_free(src);
     gen_partset_reg(OS_BYTE, DREG(insn, 9), dest);
 
     bcd_flags(dest);
+    tcg_temp_try_free(dest);
 }
 
 DISAS_INSN(abcd_mem)
@@ -1781,11 +1787,13 @@ DISAS_INSN(abcd_mem)
                        NULL_QREG, &addr, EA_LOADU, IS_USER(s));
 
     bcd_add(dest, src);
+    tcg_temp_try_free(src);
 
     gen_ea_mode(env, s, 4, REG(insn, 9), OS_BYTE, dest, &addr,
                 EA_STORE, IS_USER(s));
 
     bcd_flags(dest);
+    tcg_temp_try_free(dest);
 }
 
 DISAS_INSN(sbcd_reg)
@@ -1798,10 +1806,12 @@ DISAS_INSN(sbcd_reg)
     dest = gen_extend(DREG(insn, 9), OS_BYTE, 0);
 
     bcd_sub(dest, src);
+    tcg_temp_try_free(src);
 
     gen_partset_reg(OS_BYTE, DREG(insn, 9), dest);
 
     bcd_flags(dest);
+    tcg_temp_try_free(dest);
 }
 
 DISAS_INSN(sbcd_mem)
@@ -1818,11 +1828,13 @@ DISAS_INSN(sbcd_mem)
                        NULL_QREG, &addr, EA_LOADU, IS_USER(s));
 
     bcd_sub(dest, src);
+    tcg_temp_try_free(src);
 
     gen_ea_mode(env, s, 4, REG(insn, 9), OS_BYTE, dest, &addr,
                 EA_STORE, IS_USER(s));
 
     bcd_flags(dest);
+    tcg_temp_try_free(dest);
 }
 
 DISAS_INSN(nbcd)
@@ -1836,6 +1848,7 @@ DISAS_INSN(nbcd)
 
     dest = tcg_const_i32(0);
     bcd_sub(dest, src);
+    tcg_temp_try_free(src);
 
     DEST_EA(env, insn, OS_BYTE, dest, &addr);
 
@@ -1877,9 +1890,12 @@ DISAS_INSN(addsub)
     gen_update_cc_add(dest, src, opsize);
     if (insn & 0x100) {
         DEST_EA(env, insn, opsize, dest, &addr);
+        tcg_temp_try_free(tmp);
     } else {
         gen_partset_reg(opsize, DREG(insn, 9), dest);
+        tcg_temp_try_free(src);
     }
+    tcg_temp_try_free(reg);
     tcg_temp_free(dest);
 }
 
@@ -1935,6 +1951,7 @@ DISAS_INSN(bitop_reg)
     default: /* btst */
         break;
     }
+    tcg_temp_try_free(src1);
     tcg_temp_free(tmp);
     if (op) {
         DEST_EA(env, insn, opsize, dest, &addr);
@@ -2183,6 +2200,7 @@ DISAS_INSN(bitop_im)
         DEST_EA(env, insn, opsize, tmp, &addr);
         tcg_temp_free(tmp);
     }
+    tcg_temp_try_free(src1);
 }
 
 static TCGv gen_get_ccr(DisasContext *s)
@@ -2244,6 +2262,7 @@ static void gen_move_to_sr(CPUM68KState *env, 
DisasContext *s, uint16_t insn,
         TCGv src;
         SRC_EA(env, src, OS_WORD, 0, NULL);
         gen_set_sr(s, src, ccr_only);
+        tcg_temp_try_free(src);
     }
 }
 
@@ -2306,6 +2325,7 @@ DISAS_INSN(arith_im)
         } else {
             DEST_EA(env, insn, opsize, dest, &addr);
             gen_logic_cc(s, dest, opsize);
+            tcg_temp_try_free(src1);
         }
         break;
     case 1: /* andi */
@@ -2315,6 +2335,7 @@ DISAS_INSN(arith_im)
         } else {
             DEST_EA(env, insn, opsize, dest, &addr);
             gen_logic_cc(s, dest, opsize);
+            tcg_temp_try_free(src1);
         }
         break;
     case 2: /* subi */
@@ -2323,6 +2344,7 @@ DISAS_INSN(arith_im)
         gen_update_cc_add(dest, im, opsize);
         set_cc_op(s, CC_OP_SUBB + opsize);
         DEST_EA(env, insn, opsize, dest, &addr);
+        tcg_temp_try_free(src1);
         break;
     case 3: /* addi */
         tcg_gen_add_i32(dest, src1, im);
@@ -2330,6 +2352,7 @@ DISAS_INSN(arith_im)
         tcg_gen_setcond_i32(TCG_COND_LTU, QREG_CC_X, dest, im);
         set_cc_op(s, CC_OP_ADDB + opsize);
         DEST_EA(env, insn, opsize, dest, &addr);
+        tcg_temp_try_free(src1);
         break;
     case 5: /* eori */
         tcg_gen_xor_i32(dest, src1, im);
@@ -2338,10 +2361,12 @@ DISAS_INSN(arith_im)
         } else {
             DEST_EA(env, insn, opsize, dest, &addr);
             gen_logic_cc(s, dest, opsize);
+            tcg_temp_try_free(src1);
         }
         break;
     case 6: /* cmpi */
         gen_update_cc_cmp(s, src1, im, opsize);
+        tcg_temp_try_free(src1);
         break;
     default:
         abort();
@@ -2400,6 +2425,7 @@ DISAS_INSN(cas)
                                IS_USER(s), opc);
     /* update flags before setting cmp to load */
     gen_update_cc_cmp(s, load, cmp, opsize);
+    tcg_temp_try_free(cmp);
     gen_partset_reg(opsize, DREG(ext, 0), load);
 
     tcg_temp_free(load);
@@ -2558,6 +2584,7 @@ DISAS_INSN(move)
         /* This will be correct because loads sign extend.  */
         gen_logic_cc(s, src, opsize);
     }
+    tcg_temp_try_free(src);
 }
 
 DISAS_INSN(negx)
@@ -2590,6 +2617,7 @@ DISAS_INSN(negx)
      */
 
     tcg_gen_and_i32(QREG_CC_V, QREG_CC_N, src);
+    tcg_temp_try_free(src);
 
     /* Copy the rest of the results into place.  */
     tcg_gen_or_i32(QREG_CC_Z, QREG_CC_Z, QREG_CC_N); /* !Z is sticky */
@@ -2650,6 +2678,7 @@ DISAS_INSN(neg)
     tcg_gen_neg_i32(dest, src1);
     set_cc_op(s, CC_OP_SUBB + opsize);
     gen_update_cc_add(dest, src1, opsize);
+    tcg_temp_try_free(src1);
     tcg_gen_setcondi_i32(TCG_COND_NE, QREG_CC_X, dest, 0);
     DEST_EA(env, insn, opsize, dest, &addr);
     tcg_temp_free(dest);
@@ -2671,6 +2700,7 @@ DISAS_INSN(not)
     SRC_EA(env, src1, opsize, 1, &addr);
     dest = tcg_temp_new();
     tcg_gen_not_i32(dest, src1);
+    tcg_temp_try_free(src1);
     DEST_EA(env, insn, opsize, dest, &addr);
     gen_logic_cc(s, dest, opsize);
 }
@@ -2738,6 +2768,7 @@ DISAS_INSN(tst)
     opsize = insn_opsize(insn);
     SRC_EA(env, tmp, opsize, 1, NULL);
     gen_logic_cc(s, tmp, opsize);
+    tcg_temp_try_free(tmp);
 }
 
 DISAS_INSN(pulse)
@@ -2761,6 +2792,7 @@ DISAS_INSN(tas)
     SRC_EA(env, src1, OS_BYTE, 1, &addr);
     gen_logic_cc(s, src1, OS_BYTE);
     tcg_gen_ori_i32(dest, src1, 0x80);
+    tcg_temp_try_free(src1);
     DEST_EA(env, insn, OS_BYTE, dest, &addr);
     tcg_temp_free(dest);
 }
@@ -2788,6 +2820,7 @@ DISAS_INSN(mull)
         } else {
             tcg_gen_mulu2_i32(QREG_CC_Z, QREG_CC_N, src1, DREG(ext, 12));
         }
+        tcg_temp_try_free(src1);
         /* if Dl == Dh, 68040 returns low word */
         tcg_gen_mov_i32(DREG(ext, 0), QREG_CC_N);
         tcg_gen_mov_i32(DREG(ext, 12), QREG_CC_Z);
@@ -2824,6 +2857,7 @@ DISAS_INSN(mull)
         tcg_gen_mul_i32(DREG(ext, 12), src1, DREG(ext, 12));
         gen_logic_cc(s, DREG(ext, 12), OS_LONG);
     }
+    tcg_temp_try_free(src1);
 }
 
 static void gen_link(DisasContext *s, uint16_t insn, int32_t offset)
@@ -2950,6 +2984,7 @@ DISAS_INSN(addsubq)
     val = tcg_const_i32(imm);
     dest = tcg_temp_new();
     tcg_gen_mov_i32(dest, src);
+    tcg_temp_try_free(src);
     if ((insn & 0x38) == 0x08) {
         /* Don't update condition codes if the destination is an
            address register.  */
@@ -3044,6 +3079,7 @@ DISAS_INSN(mvzs)
     reg = DREG(insn, 9);
     tcg_gen_mov_i32(reg, src);
     gen_logic_cc(s, src, opsize);
+    tcg_temp_try_free(src);
 }
 
 DISAS_INSN(or)
@@ -3066,6 +3102,8 @@ DISAS_INSN(or)
         tcg_gen_or_i32(dest, src, reg);
         gen_partset_reg(opsize, DREG(insn, 9), dest);
     }
+    tcg_temp_try_free(reg);
+    tcg_temp_try_free(src);
     gen_logic_cc(s, dest, opsize);
     tcg_temp_free(dest);
 }
@@ -3078,6 +3116,7 @@ DISAS_INSN(suba)
     SRC_EA(env, src, (insn & 0x100) ? OS_LONG : OS_WORD, 1, NULL);
     reg = AREG(insn, 9);
     tcg_gen_sub_i32(reg, reg, src);
+    tcg_temp_try_free(src);
 }
 
 static inline void gen_subx(DisasContext *s, TCGv src, TCGv dest, int opsize)
@@ -3124,6 +3163,8 @@ DISAS_INSN(subx_reg)
     dest = gen_extend(DREG(insn, 9), opsize, 1);
 
     gen_subx(s, src, dest, opsize);
+    tcg_temp_try_free(src);
+    tcg_temp_try_free(dest);
 
     gen_partset_reg(opsize, DREG(insn, 9), QREG_CC_N);
 }
@@ -3178,6 +3219,8 @@ DISAS_INSN(cmp)
     SRC_EA(env, src, opsize, 1, NULL);
     reg = gen_extend(DREG(insn, 9), opsize, 1);
     gen_update_cc_cmp(s, reg, src, opsize);
+    tcg_temp_try_free(src);
+    tcg_temp_try_free(reg);
 }
 
 DISAS_INSN(cmpa)
@@ -3194,6 +3237,7 @@ DISAS_INSN(cmpa)
     SRC_EA(env, src, opsize, 1, NULL);
     reg = AREG(insn, 9);
     gen_update_cc_cmp(s, reg, src, OS_LONG);
+    tcg_temp_try_free(src);
 }
 
 DISAS_INSN(cmpm)
@@ -3209,6 +3253,8 @@ DISAS_INSN(cmpm)
                       NULL_QREG, NULL, EA_LOADS, IS_USER(s));
 
     gen_update_cc_cmp(s, dst, src, opsize);
+    tcg_temp_try_free(src);
+    tcg_temp_try_free(dst);
 }
 
 DISAS_INSN(eor)
@@ -3223,6 +3269,7 @@ DISAS_INSN(eor)
     SRC_EA(env, src, opsize, 0, &addr);
     dest = tcg_temp_new();
     tcg_gen_xor_i32(dest, src, DREG(insn, 9));
+    tcg_temp_try_free(src);
     gen_logic_cc(s, dest, opsize);
     DEST_EA(env, insn, opsize, dest, &addr);
     tcg_temp_free(dest);
@@ -3276,6 +3323,7 @@ DISAS_INSN(and)
         tcg_gen_and_i32(dest, src, reg);
         gen_partset_reg(opsize, reg, dest);
     }
+    tcg_temp_try_free(src);
     gen_logic_cc(s, dest, opsize);
     tcg_temp_free(dest);
 }
@@ -3288,6 +3336,7 @@ DISAS_INSN(adda)
     SRC_EA(env, src, (insn & 0x100) ? OS_LONG : OS_WORD, 1, NULL);
     reg = AREG(insn, 9);
     tcg_gen_add_i32(reg, reg, src);
+    tcg_temp_try_free(src);
 }
 
 static inline void gen_addx(DisasContext *s, TCGv src, TCGv dest, int opsize)
@@ -3333,6 +3382,8 @@ DISAS_INSN(addx_reg)
     src = gen_extend(DREG(insn, 0), opsize, 1);
 
     gen_addx(s, src, dest, opsize);
+    tcg_temp_try_free(src);
+    tcg_temp_try_free(dest);
 
     gen_partset_reg(opsize, DREG(insn, 9), QREG_CC_N);
 }
@@ -3404,6 +3455,7 @@ static inline void shift_im(DisasContext *s, uint16_t 
insn, int opsize)
             tcg_gen_sari_i32(QREG_CC_N, reg, count);
         }
     }
+    tcg_temp_try_free(reg);
 
     gen_ext(QREG_CC_N, QREG_CC_N, opsize, 1);
     tcg_gen_andi_i32(QREG_CC_C, QREG_CC_C, 1);
@@ -3497,6 +3549,7 @@ static inline void shift_reg(DisasContext *s, uint16_t 
insn, int opsize)
         tcg_gen_movcond_i32(TCG_COND_NE, QREG_CC_X, s32, QREG_CC_V,
                             QREG_CC_C, QREG_CC_X);
     }
+    tcg_temp_try_free(reg);
     gen_ext(QREG_CC_N, QREG_CC_N, opsize, 1);
     tcg_gen_mov_i32(QREG_CC_Z, QREG_CC_N);
 
@@ -3567,6 +3620,7 @@ DISAS_INSN(shift_mem)
             tcg_gen_sari_i32(QREG_CC_N, src, 1);
         }
     }
+    tcg_temp_try_free(src);
 
     gen_ext(QREG_CC_N, QREG_CC_N, OS_WORD, 1);
     tcg_gen_andi_i32(QREG_CC_C, QREG_CC_C, 1);
@@ -3806,6 +3860,7 @@ DISAS_INSN(rotate8_im)
     }
     tcg_temp_free(shift);
     gen_partset_reg(OS_BYTE, DREG(insn, 0), reg);
+    tcg_temp_try_free(reg);
     set_cc_op(s, CC_OP_FLAGS);
 }
 
@@ -3832,6 +3887,7 @@ DISAS_INSN(rotate16_im)
     }
     tcg_temp_free(shift);
     gen_partset_reg(OS_WORD, DREG(insn, 0), reg);
+    tcg_temp_try_free(reg);
     set_cc_op(s, CC_OP_FLAGS);
 }
 
@@ -3901,6 +3957,7 @@ DISAS_INSN(rotate8_reg)
     tcg_temp_free(t1);
     tcg_temp_free(t0);
     gen_partset_reg(OS_BYTE, DREG(insn, 0), reg);
+    tcg_temp_try_free(reg);
     set_cc_op(s, CC_OP_FLAGS);
 }
 
@@ -3936,6 +3993,7 @@ DISAS_INSN(rotate16_reg)
     tcg_temp_free(t1);
     tcg_temp_free(t0);
     gen_partset_reg(OS_WORD, DREG(insn, 0), reg);
+    tcg_temp_try_free(reg);
     set_cc_op(s, CC_OP_FLAGS);
 }
 
@@ -3958,6 +4016,7 @@ DISAS_INSN(rotate_mem)
     }
     tcg_temp_free(shift);
     DEST_EA(env, insn, OS_WORD, src, &addr);
+    tcg_temp_try_free(src);
     set_cc_op(s, CC_OP_FLAGS);
 }
 
@@ -4357,6 +4416,8 @@ DISAS_INSN(chk)
 
     gen_flush_flags(s);
     gen_helper_chk(cpu_env, reg, src);
+    tcg_temp_try_free(reg);
+    tcg_temp_try_free(src);
 }
 
 DISAS_INSN(chk2)
@@ -5409,6 +5470,7 @@ DISAS_INSN(frestore)
     if (m68k_feature(s->env, M68K_FEATURE_M68040)) {
         SRC_EA(env, addr, OS_LONG, 0, NULL);
         /* FIXME: check the state frame */
+        tcg_temp_try_free(addr);
     } else {
         disas_undef(env, s, insn);
     }
@@ -5713,6 +5775,7 @@ DISAS_INSN(to_mac)
     } else {
         tcg_gen_extu_i32_i64(acc, val);
     }
+    tcg_temp_try_free(val);
     tcg_gen_andi_i32(QREG_MACSR, QREG_MACSR, ~(MACSR_PAV0 << accnum));
     gen_mac_clear_flags();
     gen_helper_mac_set_flags(cpu_env, tcg_const_i32(accnum));
@@ -5731,6 +5794,7 @@ DISAS_INSN(to_mask)
     TCGv val;
     SRC_EA(env, val, OS_LONG, 0, NULL);
     tcg_gen_ori_i32(QREG_MAC_MASK, val, 0xffff0000);
+    tcg_temp_try_free(val);
 }
 
 DISAS_INSN(to_mext)
@@ -5745,6 +5809,7 @@ DISAS_INSN(to_mext)
         gen_helper_set_mac_exts(cpu_env, val, acc);
     else
         gen_helper_set_mac_extu(cpu_env, val, acc);
+    tcg_temp_try_free(val);
 }
 
 static disas_proc opcode_table[65536];
-- 
2.14.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]