From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=50891 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PfCeU-0003Aa-CM for qemu-devel@nongnu.org; Tue, 18 Jan 2011 09:35:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PfCeS-0002LM-Q3 for qemu-devel@nongnu.org; Tue, 18 Jan 2011 09:35:18 -0500 Received: from eu1sys200aog113.obsmtp.com ([207.126.144.135]:53316) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PfCeS-0002Kl-H3 for qemu-devel@nongnu.org; Tue, 18 Jan 2011 09:35:16 -0500 Received: from zeta.dmz-us.st.com (ns4.st.com [167.4.16.71]) by beta.dmz-us.st.com (STMicroelectronics) with ESMTP id A0312D2 for ; Tue, 18 Jan 2011 14:35:00 +0000 (GMT) Received: from Webmail-eu.st.com (safex1hubcas5.st.com [10.75.90.71]) by zeta.dmz-us.st.com (STMicroelectronics) with ESMTP id 06BA81A5 for ; Tue, 18 Jan 2011 14:35:00 +0000 (GMT) Message-ID: <4D35A4FB.3030403@st.com> Date: Tue, 18 Jan 2011 15:34:35 +0100 From: Christophe Lyon MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] target-arm: Fix garbage collection of temporaries in Neon emulation. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "qemu-devel@nongnu.org" Fix garbage collection of temporaries in Neon emulation. Signed-off-by: Christophe Lyon --- target-arm/translate.c | 22 +++++++++++++++++----- 1 files changed, 17 insertions(+), 5 deletions(-) diff --git a/target-arm/translate.c b/target-arm/translate.c index 57664bc..363351e 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -4176,6 +4176,18 @@ 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. */ + switch ((size << 1) | u) { + case 0: + case 1: + case 2: + case 3: + dead_tmp(a); + dead_tmp(b); + break; + } } /* Translate a NEON data processing instruction. Return nonzero if the @@ -4840,7 +4852,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 +5088,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"); @@ -5235,9 +5245,12 @@ static int disas_neon_data_insn(CPUState * env, DisasContext *s, uint32_t insn) tmp = neon_load_reg(rn, 0); } else { tmp = tmp3; + /* tmp2 has been discarded in + gen_neon_mull during pass 0, we need to + recreate it. */ + tmp2 = neon_get_scalar(size, rm); } 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 +5277,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