From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=40580 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Pi5WA-0005Io-0G for qemu-devel@nongnu.org; Wed, 26 Jan 2011 08:34:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Pi5W8-0007Ff-VG for qemu-devel@nongnu.org; Wed, 26 Jan 2011 08:34:37 -0500 Received: from hall.aurel32.net ([88.191.126.93]:49292) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Pi5W8-0007FY-QM for qemu-devel@nongnu.org; Wed, 26 Jan 2011 08:34:36 -0500 Date: Wed, 26 Jan 2011 14:34:35 +0100 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH] target-arm: Fix garbage collection of temporaries in Neon emulation. Message-ID: <20110126133435.GD21635@hall.aurel32.net> References: <4D35A4FB.3030403@st.com> <4D35C6BE.5060502@st.com> <4D36F746.30307@st.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <4D36F746.30307@st.com> Sender: Aurelien Jarno List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Christophe Lyon Cc: Peter Maydell , "qemu-devel@nongnu.org" On Wed, Jan 19, 2011 at 03:37:58PM +0100, Christophe Lyon wrote: > Here is an updated patch which will hopefully not be mangled by my mailer. > > Fix garbage collection of temporaries in Neon emulation. > > > Signed-off-by: Christophe Lyon > --- > target-arm/translate.c | 18 +++++++++++++----- > 1 files changed, 13 insertions(+), 5 deletions(-) Thanks, applied. > diff --git a/target-arm/translate.c b/target-arm/translate.c > index 57664bc..b3e3d70 100644 > --- a/target-arm/translate.c > +++ b/target-arm/translate.c > @@ -4176,6 +4176,13 @@ static inline void gen_neon_mull(TCGv_i64 dest, TCGv a, TCGv b, int size, int u) > break; > default: abort(); > } > + > + /* gen_helper_neon_mull_[su]{8|16} do not free their parameters. > + Don't forget to clean them now. */ > + if (size < 2) { > + dead_tmp(a); > + dead_tmp(b); > + } > } > > /* Translate a NEON data processing instruction. Return nonzero if the > @@ -4840,7 +4847,7 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) > if (size == 3) { > tcg_temp_free_i64(tmp64); > } else { > - dead_tmp(tmp2); > + tcg_temp_free_i32(tmp2); > } > } else if (op == 10) { > /* VSHLL */ > @@ -5076,8 +5083,6 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) > case 8: case 9: case 10: case 11: case 12: case 13: > /* VMLAL, VQDMLAL, VMLSL, VQDMLSL, VMULL, VQDMULL */ > gen_neon_mull(cpu_V0, tmp, tmp2, size, u); > - dead_tmp(tmp2); > - dead_tmp(tmp); > break; > case 14: /* Polynomial VMULL */ > cpu_abort(env, "Polynomial VMULL not implemented"); > @@ -5228,6 +5233,10 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) > return 1; > > tmp2 = neon_get_scalar(size, rm); > + /* We need a copy of tmp2 because gen_neon_mull > + * deletes it during pass 0. */ > + tmp4 = new_tmp(); > + tcg_gen_mov_i32(tmp4, tmp2); > tmp3 = neon_load_reg(rn, 1); > > for (pass = 0; pass < 2; pass++) { > @@ -5235,9 +5244,9 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) > tmp = neon_load_reg(rn, 0); > } else { > tmp = tmp3; > + tmp2 = tmp4; > } > gen_neon_mull(cpu_V0, tmp, tmp2, size, u); > - dead_tmp(tmp); > if (op == 6 || op == 7) { > gen_neon_negl(cpu_V0, size); > } > @@ -5264,7 +5273,6 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) > neon_store_reg64(cpu_V0, rd + pass); > } > > - dead_tmp(tmp2); > > break; > default: /* 14 and 15 are RESERVED */ > -- > 1.7.2.3 > > > -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net