From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N15sz-0007w5-3F for qemu-devel@nongnu.org; Thu, 22 Oct 2009 18:11:57 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N15sx-0007vr-Ue for qemu-devel@nongnu.org; Thu, 22 Oct 2009 18:11:56 -0400 Received: from [199.232.76.173] (port=48544 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N15sx-0007vo-Nx for qemu-devel@nongnu.org; Thu, 22 Oct 2009 18:11:55 -0400 Received: from fg-out-1718.google.com ([72.14.220.157]:63831) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1N15sw-0002zu-Qs for qemu-devel@nongnu.org; Thu, 22 Oct 2009 18:11:55 -0400 Received: by fg-out-1718.google.com with SMTP id d23so3282493fga.10 for ; Thu, 22 Oct 2009 15:11:46 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1256213856-76026-1-git-send-email-juha.riihimaki@nokia.com> References: <1256213856-76026-1-git-send-email-juha.riihimaki@nokia.com> Date: Fri, 23 Oct 2009 00:11:45 +0200 Message-ID: <761ea48b0910221511y4acbd13q59ac1e17814e65de@mail.gmail.com> Subject: Re: [Qemu-devel] [PATCH v2][RESEND] target-arm: cleanup internal resource leaks From: Laurent Desnogues Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: juha.riihimaki@nokia.com Cc: qemu-devel@nongnu.org On Thu, Oct 22, 2009 at 2:17 PM, wrote: > From: Juha Riihim=E4ki > > Revised patch for getting rid of tcg temporary variable leaks in > target-arm/translate.c. This version also includes the leak patch for > gen_set_cpsr macro, now converted as a static inline function, which I > sent earlier as a separate patch on top of this patch. > > Signed-off-by: Juha Riihim=E4ki Acked-by: Laurent Desnogues > --- > =A0target-arm/translate.c | =A0116 ++++++++++++++++++++++++++++++++++++--= --------- > =A01 files changed, 89 insertions(+), 27 deletions(-) > > diff --git a/target-arm/translate.c b/target-arm/translate.c > index e56082b..813f661 100644 > --- a/target-arm/translate.c > +++ b/target-arm/translate.c > @@ -184,7 +184,12 @@ static void store_reg(DisasContext *s, int reg, TCGv= var) > =A0#define gen_uxtb16(var) gen_helper_uxtb16(var, var) > > > -#define gen_set_cpsr(var, mask) gen_helper_cpsr_write(var, tcg_const_i32= (mask)) > +static inline void gen_set_cpsr(TCGv var, uint32_t mask) > +{ > + =A0 =A0TCGv tmp_mask =3D tcg_const_i32(mask); > + =A0 =A0gen_helper_cpsr_write(var, tmp_mask); > + =A0 =A0tcg_temp_free_i32(tmp_mask); > +} > =A0/* Set NZCV flags from the high 4 bits of var. =A0*/ > =A0#define gen_set_nzcv(var) gen_set_cpsr(var, CPSR_NZCV) > > @@ -287,6 +292,7 @@ static TCGv_i64 gen_mulu_i64_i32(TCGv a, TCGv b) > =A0 =A0 tcg_gen_extu_i32_i64(tmp2, b); > =A0 =A0 dead_tmp(b); > =A0 =A0 tcg_gen_mul_i64(tmp1, tmp1, tmp2); > + =A0 =A0tcg_temp_free_i64(tmp2); > =A0 =A0 return tmp1; > =A0} > > @@ -300,6 +306,7 @@ static TCGv_i64 gen_muls_i64_i32(TCGv a, TCGv b) > =A0 =A0 tcg_gen_ext_i32_i64(tmp2, b); > =A0 =A0 dead_tmp(b); > =A0 =A0 tcg_gen_mul_i64(tmp1, tmp1, tmp2); > + =A0 =A0tcg_temp_free_i64(tmp2); > =A0 =A0 return tmp1; > =A0} > > @@ -312,9 +319,11 @@ static void gen_mull(TCGv a, TCGv b) > =A0 =A0 tcg_gen_extu_i32_i64(tmp1, a); > =A0 =A0 tcg_gen_extu_i32_i64(tmp2, b); > =A0 =A0 tcg_gen_mul_i64(tmp1, tmp1, tmp2); > + =A0 =A0tcg_temp_free_i64(tmp2); > =A0 =A0 tcg_gen_trunc_i64_i32(a, tmp1); > =A0 =A0 tcg_gen_shri_i64(tmp1, tmp1, 32); > =A0 =A0 tcg_gen_trunc_i64_i32(b, tmp1); > + =A0 =A0tcg_temp_free_i64(tmp1); > =A0} > > =A0/* Signed 32x32->64 multiply. =A0*/ > @@ -326,9 +335,11 @@ static void gen_imull(TCGv a, TCGv b) > =A0 =A0 tcg_gen_ext_i32_i64(tmp1, a); > =A0 =A0 tcg_gen_ext_i32_i64(tmp2, b); > =A0 =A0 tcg_gen_mul_i64(tmp1, tmp1, tmp2); > + =A0 =A0tcg_temp_free_i64(tmp2); > =A0 =A0 tcg_gen_trunc_i64_i32(a, tmp1); > =A0 =A0 tcg_gen_shri_i64(tmp1, tmp1, 32); > =A0 =A0 tcg_gen_trunc_i64_i32(b, tmp1); > + =A0 =A0tcg_temp_free_i64(tmp1); > =A0} > > =A0/* Swap low and high halfwords. =A0*/ > @@ -542,11 +553,13 @@ static void gen_arm_parallel_addsub(int op1, int op= 2, TCGv a, TCGv b) > =A0 =A0 =A0 =A0 tmp =3D tcg_temp_new_ptr(); > =A0 =A0 =A0 =A0 tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUState, GE)); > =A0 =A0 =A0 =A0 PAS_OP(s) > + =A0 =A0 =A0 =A0tcg_temp_free_ptr(tmp); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case 5: > =A0 =A0 =A0 =A0 tmp =3D tcg_temp_new_ptr(); > =A0 =A0 =A0 =A0 tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUState, GE)); > =A0 =A0 =A0 =A0 PAS_OP(u) > + =A0 =A0 =A0 =A0tcg_temp_free_ptr(tmp); > =A0 =A0 =A0 =A0 break; > =A0#undef gen_pas_helper > =A0#define gen_pas_helper(name) glue(gen_helper_,name)(a, a, b) > @@ -587,11 +600,13 @@ static void gen_thumb2_parallel_addsub(int op1, int= op2, TCGv a, TCGv b) > =A0 =A0 =A0 =A0 tmp =3D tcg_temp_new_ptr(); > =A0 =A0 =A0 =A0 tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUState, GE)); > =A0 =A0 =A0 =A0 PAS_OP(s) > + =A0 =A0 =A0 =A0tcg_temp_free_ptr(tmp); > =A0 =A0 =A0 =A0 break; > =A0 =A0 case 4: > =A0 =A0 =A0 =A0 tmp =3D tcg_temp_new_ptr(); > =A0 =A0 =A0 =A0 tcg_gen_addi_ptr(tmp, cpu_env, offsetof(CPUState, GE)); > =A0 =A0 =A0 =A0 PAS_OP(u) > + =A0 =A0 =A0 =A0tcg_temp_free_ptr(tmp); > =A0 =A0 =A0 =A0 break; > =A0#undef gen_pas_helper > =A0#define gen_pas_helper(name) glue(gen_helper_,name)(a, a, b) > @@ -995,10 +1010,12 @@ static inline void gen_vfp_tosiz(int dp) > =A0#define VFP_GEN_FIX(name) \ > =A0static inline void gen_vfp_##name(int dp, int shift) \ > =A0{ \ > + =A0 =A0TCGv tmp_shift =3D tcg_const_i32(shift); \ > =A0 =A0 if (dp) \ > - =A0 =A0 =A0 =A0gen_helper_vfp_##name##d(cpu_F0d, cpu_F0d, tcg_const_i32= (shift), cpu_env);\ > + =A0 =A0 =A0 =A0gen_helper_vfp_##name##d(cpu_F0d, cpu_F0d, tmp_shift, cp= u_env);\ > =A0 =A0 else \ > - =A0 =A0 =A0 =A0gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, tcg_const_i32= (shift), cpu_env);\ > + =A0 =A0 =A0 =A0gen_helper_vfp_##name##s(cpu_F0s, cpu_F0s, tmp_shift, cp= u_env);\ > + =A0 =A0tcg_temp_free_i32(tmp_shift); \ > =A0} > =A0VFP_GEN_FIX(tosh) > =A0VFP_GEN_FIX(tosl) > @@ -2399,7 +2416,7 @@ static int disas_dsp_insn(CPUState *env, DisasConte= xt *s, uint32_t insn) > =A0 =A0instruction is not defined. =A0*/ > =A0static int disas_cp_insn(CPUState *env, DisasContext *s, uint32_t insn= ) > =A0{ > - =A0 =A0TCGv tmp; > + =A0 =A0TCGv tmp, tmp2; > =A0 =A0 uint32_t rd =3D (insn >> 12) & 0xf; > =A0 =A0 uint32_t cp =3D (insn >> 8) & 0xf; > =A0 =A0 if (IS_USER(s)) { > @@ -2411,14 +2428,18 @@ static int disas_cp_insn(CPUState *env, DisasCont= ext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 return 1; > =A0 =A0 =A0 =A0 gen_set_pc_im(s->pc); > =A0 =A0 =A0 =A0 tmp =3D new_tmp(); > - =A0 =A0 =A0 =A0gen_helper_get_cp(tmp, cpu_env, tcg_const_i32(insn)); > + =A0 =A0 =A0 =A0tmp2 =3D tcg_const_i32(insn); > + =A0 =A0 =A0 =A0gen_helper_get_cp(tmp, cpu_env, tmp2); > + =A0 =A0 =A0 =A0tcg_temp_free(tmp2); > =A0 =A0 =A0 =A0 store_reg(s, rd, tmp); > =A0 =A0 } else { > =A0 =A0 =A0 =A0 if (!env->cp[cp].cp_write) > =A0 =A0 =A0 =A0 =A0 =A0 return 1; > =A0 =A0 =A0 =A0 gen_set_pc_im(s->pc); > =A0 =A0 =A0 =A0 tmp =3D load_reg(s, rd); > - =A0 =A0 =A0 =A0gen_helper_set_cp(cpu_env, tcg_const_i32(insn), tmp); > + =A0 =A0 =A0 =A0tmp2 =3D tcg_const_i32(insn); > + =A0 =A0 =A0 =A0gen_helper_set_cp(cpu_env, tmp2, tmp); > + =A0 =A0 =A0 =A0tcg_temp_free(tmp2); > =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 } > =A0 =A0 return 0; > @@ -2449,7 +2470,7 @@ static int cp15_user_ok(uint32_t insn) > =A0static int disas_cp15_insn(CPUState *env, DisasContext *s, uint32_t in= sn) > =A0{ > =A0 =A0 uint32_t rd; > - =A0 =A0TCGv tmp; > + =A0 =A0TCGv tmp, tmp2; > > =A0 =A0 /* M profile cores use memory mapped registers instead of cp15. = =A0*/ > =A0 =A0 if (arm_feature(env, ARM_FEATURE_M)) > @@ -2478,9 +2499,10 @@ static int disas_cp15_insn(CPUState *env, DisasCon= text *s, uint32_t insn) > =A0 =A0 =A0 =A0 return 0; > =A0 =A0 } > =A0 =A0 rd =3D (insn >> 12) & 0xf; > + =A0 =A0tmp2 =3D tcg_const_i32(insn); > =A0 =A0 if (insn & ARM_CP_RW_BIT) { > =A0 =A0 =A0 =A0 tmp =3D new_tmp(); > - =A0 =A0 =A0 =A0gen_helper_get_cp15(tmp, cpu_env, tcg_const_i32(insn)); > + =A0 =A0 =A0 =A0gen_helper_get_cp15(tmp, cpu_env, tmp2); > =A0 =A0 =A0 =A0 /* If the destination register is r15 then sets condition= codes. =A0*/ > =A0 =A0 =A0 =A0 if (rd !=3D 15) > =A0 =A0 =A0 =A0 =A0 =A0 store_reg(s, rd, tmp); > @@ -2488,7 +2510,7 @@ static int disas_cp15_insn(CPUState *env, DisasCont= ext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 } else { > =A0 =A0 =A0 =A0 tmp =3D load_reg(s, rd); > - =A0 =A0 =A0 =A0gen_helper_set_cp15(cpu_env, tcg_const_i32(insn), tmp); > + =A0 =A0 =A0 =A0gen_helper_set_cp15(cpu_env, tmp2, tmp); > =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 =A0 =A0 /* Normally we would always end the TB here, but Linux > =A0 =A0 =A0 =A0 =A0* arch/arm/mach-pxa/sleep.S expects two instructions f= ollowing > @@ -2497,6 +2519,7 @@ static int disas_cp15_insn(CPUState *env, DisasCont= ext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (insn & 0x0fff0fff) !=3D 0x0e010f10) > =A0 =A0 =A0 =A0 =A0 =A0 gen_lookup_tb(s); > =A0 =A0 } > + =A0 =A0tcg_temp_free_i32(tmp2); > =A0 =A0 return 0; > =A0} > > @@ -4058,9 +4081,7 @@ static int disas_neon_data_insn(CPUState * env, Dis= asContext *s, uint32_t insn) > =A0 =A0 int u; > =A0 =A0 int n; > =A0 =A0 uint32_t imm; > - =A0 =A0TCGv tmp; > - =A0 =A0TCGv tmp2; > - =A0 =A0TCGv tmp3; > + =A0 =A0TCGv tmp, tmp2, tmp3, tmp4, tmp5; > =A0 =A0 TCGv_i64 tmp64; > > =A0 =A0 if (!vfp_enabled(env)) > @@ -4676,12 +4697,18 @@ static int disas_neon_data_insn(CPUState * env, D= isasContext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_neon_narrow_s= atu(size - 1, tmp, cpu_V0); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (pass =3D=3D 0) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (size !=3D 3) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dead_tmp(tmp2); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp2 =3D tmp; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 neon_store_reg(rd, 0, tmp= 2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 neon_store_reg(rd, 1, tmp= ); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } /* for pass */ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (size =3D=3D 3) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 =A0 =A0 } else if (op =3D=3D 10) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* VSHLL */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (q || size =3D=3D 3) > @@ -5147,6 +5174,7 @@ static int disas_neon_data_insn(CPUState * env, Dis= asContext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_shli_i64(cpu_V1, cpu_V1, = 64 - (imm * 8)); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_shri_i64(tmp64, tmp64, im= m * 8); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_or_i64(cpu_V1, cpu_V1, tm= p64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* BUGFIX */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 neon_load_reg64(cpu_V0, rn); > @@ -5511,8 +5539,9 @@ static int disas_neon_data_insn(CPUState * env, Dis= asContext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_movi_i32(tmp, 0); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp2 =3D neon_load_reg(rm, 0); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_neon_tbl(tmp2, tmp2, tmp, tcg= _const_i32(rn), > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= tcg_const_i32(n)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp4 =3D tcg_const_i32(rn); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp5 =3D tcg_const_i32(n); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_neon_tbl(tmp2, tmp2, tmp, tmp= 4, tmp5); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & (1 << 6)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D neon_load_reg(rd, 1); > @@ -5521,8 +5550,9 @@ static int disas_neon_data_insn(CPUState * env, Dis= asContext *s, uint32_t insn) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_movi_i32(tmp, 0); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp3 =3D neon_load_reg(rm, 1); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_neon_tbl(tmp3, tmp3, tmp, tcg= _const_i32(rn), > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= tcg_const_i32(n)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_neon_tbl(tmp3, tmp3, tmp, tmp= 4, tmp5); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dead_tmp(tmp5); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dead_tmp(tmp4); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 neon_store_reg(rd, 0, tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 neon_store_reg(rd, 1, tmp3); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(tmp); > @@ -5685,6 +5715,7 @@ static void gen_addq_lo(DisasContext *s, TCGv_i64 v= al, int rlow) > =A0 =A0 tcg_gen_extu_i32_i64(tmp, tmp2); > =A0 =A0 dead_tmp(tmp2); > =A0 =A0 tcg_gen_add_i64(val, val, tmp); > + =A0 =A0tcg_temp_free_i64(tmp); > =A0} > > =A0/* load and add a 64-bit value from a register pair. =A0*/ > @@ -5702,6 +5733,7 @@ static void gen_addq(DisasContext *s, TCGv_i64 val,= int rlow, int rhigh) > =A0 =A0 dead_tmp(tmpl); > =A0 =A0 dead_tmp(tmph); > =A0 =A0 tcg_gen_add_i64(val, val, tmp); > + =A0 =A0tcg_temp_free_i64(tmp); > =A0} > > =A0/* Set N and Z flags from a 64-bit value. =A0*/ > @@ -5785,7 +5817,9 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D load_reg(s, 13); > =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D new_tmp(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_get_r13_banked(addr, cpu_env,= tcg_const_i32(op1)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp =3D tcg_const_i32(op1); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_get_r13_banked(addr, cpu_env,= tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 i =3D (insn >> 23) & 3; > =A0 =A0 =A0 =A0 =A0 =A0 switch (i) { > @@ -5816,7 +5850,9 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (op1 =3D=3D (env->uncached_cpsr & CPSR= _M)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 store_reg(s, 13, addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_set_r13_banked(cpu_en= v, tcg_const_i32(op1), addr); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp =3D tcg_const_i32(op1); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_set_r13_banked(cpu_en= v, tmp, addr); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 } else { > @@ -6058,6 +6094,7 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_shri_i64(tmp64, tmp64, 16); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D new_tmp(); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_trunc_i64_i32(tmp, tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((sh & 2) =3D=3D 0) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp2 =3D load_reg(s, rn); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helper_add_setq(tmp, tmp, tmp= 2); > @@ -6076,6 +6113,7 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_addq(s, tmp64, rn, rd); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_storeq_reg(s, rn, rd, tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (op1 =3D=3D 0) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp2 =3D load_reg(s, rn); > @@ -6326,6 +6364,7 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & (1 << 20)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_logicq_cc(tmp= 64); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_storeq_reg(s, rn, rd,= tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64)= ; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > @@ -6545,10 +6584,12 @@ static void disas_arm_insn(CPUState * env, DisasC= ontext *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sh =3D (insn >> 16) & 0x1= f; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sh !=3D 0) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp2 =3D tcg_con= st_i32(sh); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & (1 << = 22)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_usat(tmp, tmp, tcg_const_i32(sh)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_usat(tmp, tmp, tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_ssat(tmp, tmp, tcg_const_i32(sh)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_ssat(tmp, tmp, tmp2); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i3= 2(tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 store_reg(s, rd, tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if ((insn & 0x00300fe0) = =3D=3D 0x00200f20) { > @@ -6556,10 +6597,12 @@ static void disas_arm_insn(CPUState * env, DisasC= ontext *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D load_reg(s, rm); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sh =3D (insn >> 16) & 0x1= f; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (sh !=3D 0) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp2 =3D tcg_con= st_i32(sh); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & (1 << = 22)) > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_usat16(tmp, tmp, tcg_const_i32(sh)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_usat16(tmp, tmp, tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_ssat16(tmp, tmp, tcg_const_i32(sh)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_ssat16(tmp, tmp, tmp2); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i3= 2(tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 store_reg(s, rd, tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if ((insn & 0x00700fe0) = =3D=3D 0x00000fa0) { > @@ -6631,6 +6674,7 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_shri_i64(tmp64, t= mp64, 32); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D new_tmp(); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_trunc_i64_i32(tmp= , tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64)= ; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rd !=3D 15) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp2 =3D load_reg= (s, rd); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & (1 << = 6)) { > @@ -6659,6 +6703,7 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_addq(s, tmp64= , rd, rn); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_storeq_reg(s,= rd, rn, tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i6= 4(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* smuad, smusd, = smlad, smlsd */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rd !=3D 15) > @@ -6831,7 +6876,9 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (i =3D=3D 15) = { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_bx(s,= tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (user) = { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_set_user_reg(tcg_const_i32(i), tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp2 =3D= tcg_const_i32(i); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_set_user_reg(tmp2, tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp= _free_i32(tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(= tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (i =3D= =3D rn) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 loaded_va= r =3D tmp; > @@ -6848,7 +6895,9 @@ static void disas_arm_insn(CPUState * env, DisasCon= text *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_m= ovi_i32(tmp, val); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (user) = { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D n= ew_tmp(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_get_user_reg(tmp, tcg_const_i32(i)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp2 =3D= tcg_const_i32(i); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_help= er_get_user_reg(tmp, tmp2); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp= _free_i32(tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D l= oad_reg(s, i); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > @@ -7264,7 +7313,9 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D load_reg(s, 13); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D new_tmp(); > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_get_r13_banke= d(addr, cpu_env, tcg_const_i32(op)); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp =3D tcg_const_i32(op= ); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_get_r13_banke= d(addr, cpu_env, tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ((insn & (1 << 24)) =3D=3D 0) = { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_addi_i32(addr, ad= dr, -8); > @@ -7284,8 +7335,9 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (op =3D=3D (env->uncac= hed_cpsr & CPSR_M)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 store_reg(s, 13, = addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_set_r= 13_banked(cpu_env, > - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_cons= t_i32(op), addr); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tmp =3D tcg_cons= t_i32(op); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0gen_helper_set_r= 13_banked(cpu_env, tmp, addr); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i3= 2(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(addr); > @@ -7515,6 +7567,7 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_shri_i64(tmp64, tmp64, 16); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D new_tmp(); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tcg_gen_trunc_i64_i32(tmp, tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (rs !=3D 15) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp2 =3D load_reg(s, rs); > @@ -7584,6 +7637,7 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dead_tmp(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_addq(s, tmp64, rs, rd); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_storeq_reg(s, rs, rd, tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (op & 0x20) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Unsigned 64-bit multiply =A0*/ > @@ -7610,6 +7664,7 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_addq(s, tmp64, rs, rd); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_storeq_reg(s, rs, rd, tmp64); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i64(tmp64); > =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 break; > =A0 =A0 =A0 =A0 } > @@ -7673,6 +7728,8 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 tmp =3D load_reg(= s, rn); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D tcg_cons= t_i32(insn & 0xff); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helper_v7m_ms= r(cpu_env, addr, tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i3= 2(addr); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dead_tmp(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_lookup_tb(s); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > @@ -7742,6 +7799,7 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (IS_M(env)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D tcg_cons= t_i32(insn & 0xff); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helper_v7m_mr= s(tmp, cpu_env, addr); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i3= 2(addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helper_cpsr_r= ead(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > @@ -7842,6 +7900,7 @@ static int disas_thumb2_insn(CPUState *env, DisasCo= ntext *s, uint16_t insn_hw1) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 else > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helpe= r_ssat(tmp, tmp, tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(tmp2); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 store_reg(s, rd, tmp); > @@ -8614,12 +8673,15 @@ static void disas_thumb_insn(CPUState *env, Disas= Context *s) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & 1) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D tcg_const_i32(16); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helper_v7m_msr(cpu_env, addr,= tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* FAULTMASK */ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & 2) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 addr =3D tcg_const_i32(17); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_helper_v7m_msr(cpu_env, addr,= tmp); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(addr); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0tcg_temp_free_i32(tmp); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 gen_lookup_tb(s); > =A0 =A0 =A0 =A0 =A0 =A0 } else { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (insn & (1 << 4)) > -- > 1.6.1 > > > >