From nobody Sat Oct 25 21:20:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1521537121918138.24484848769498; Tue, 20 Mar 2018 02:12:01 -0700 (PDT) Received: from localhost ([::1]:46933 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eyDJJ-0005Ay-1L for importer@patchew.org; Tue, 20 Mar 2018 05:12:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46525) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eyDFs-00032v-G4 for qemu-devel@nongnu.org; Tue, 20 Mar 2018 05:08:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eyDFn-0002OW-DB for qemu-devel@nongnu.org; Tue, 20 Mar 2018 05:08:28 -0400 Received: from mout.kundenserver.de ([212.227.126.134]:40511) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eyDFn-0002N9-25 for qemu-devel@nongnu.org; Tue, 20 Mar 2018 05:08:23 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue002 [212.227.15.167]) with ESMTPSA (Nemesis) id 0ME6mN-1epAqo0sIB-00HOex; Tue, 20 Mar 2018 10:08:21 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Tue, 20 Mar 2018 10:08:12 +0100 Message-Id: <20180320090813.852-2-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180320090813.852-1-laurent@vivier.eu> References: <20180320090813.852-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K0:8qozlPS/bS41REdc7JtPfTmN5M58MPn6jI9nBSopk7c/jz1JIbx l2jFVfR3RMD0g1xmRTjWVMYWVN+YkB2p/wSvONJ+dT/JXM2JCVtS+iXxVcFOizi/+zUl6d6 ZfGy3uI78yZPV14TlMFnblm4LjCVL65Ge3UEXGITmmirEETFSBOCO0wcAnpbCacbRXfkgOm g7KQXvqIFv8UgcXWXmbmw== X-UI-Out-Filterresults: notjunk:1;V01:K0:4j/JdLTZ9eI=:/28Qzb5S3WfPGD6Oe7OMoD xe81qrFb9nyIRKgKYEWDcM+OUGX9Vh4nUfErfJ2+xxehOgQLEceGN2b9P1hFJImW6g/zJOlXc HJVjtv6YMnvxR+o6cIDZLNjSBSNhCi+1pquiFRmZetENgK4Wr2Rm34GWAP7HR1RIrEx0fmK/7 oO2ScsBsrUswHuEiui9nwXOML3aBLP7yJjyXQaLaCtorN5qyUnYm3K6hA6pFKVu+hntk/7s4b lO9pFA4vdCyg+Ev9cL92avTMVhNf6Ys8jJkcvKLo0l/BGWOovYkMhjP+wQLqMRb8+cyyCoVCE JMy14dJ7YiZ1WiKJB97w3cEPvmS755wByxRQ88QIiN1wfnTek05qnzUe5Y3GHz5NaqlHxhmYV 18H7qTPPG3QspVdTSTbcDlSanOigAxiu4ajv4HsHAqJHMOCw3ZdPsG1sourJQaaXJW8jr9/FI Htmj2cVGOb5GrqKc+/r2tpnuCH+xo8DuewhM0rNglEprg5kQgrPWZ9tHAq+xLmG9jzdmXqUfu 4j30NFNG8k2gnQovjEjcrVpngt9zUOyuWFbdgjv9oOV4eutB8pcO127L4iE0LLhL0xARClesE NhedRZNjHfDnsG6vwIByR5ScEpLb7CNBY4aEfbXqZBis1Rz/IOhqpwarcFRojJQVqQCHTLr9u EDQ+SSO+Sz5agkh16sc6X7nNlTB4dVOtBhtGOcJkcCJyI3cqmDVh5Lxgtx21je67Xc6H116IY ZE2HKDtGC5DmaRjU3U9KRy3Die+LPmpZT63QR2enqTNQ9H5SFnZZqyzyRdQ= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.134 Subject: [Qemu-devel] [PULL 1/2] target/m68k: add DisasContext parameter to gen_extend() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 This parameter will be needed to manage automatic release of temporary allocated TCG variables. Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20180319113544.704-2-laurent@vivier.eu> --- target/m68k/translate.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/target/m68k/translate.c b/target/m68k/translate.c index cef6f663ad..1c2ff56305 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -617,7 +617,7 @@ static void gen_flush_flags(DisasContext *s) s->cc_op =3D CC_OP_FLAGS; } =20 -static inline TCGv gen_extend(TCGv val, int opsize, int sign) +static inline TCGv gen_extend(DisasContext *s, TCGv val, int opsize, int s= ign) { TCGv tmp; =20 @@ -811,7 +811,7 @@ static TCGv gen_ea_mode(CPUM68KState *env, DisasContext= *s, int mode, int reg0, gen_partset_reg(opsize, reg, val); return store_dummy; } else { - return gen_extend(reg, opsize, what =3D=3D EA_LOADS); + return gen_extend(s, reg, opsize, what =3D=3D EA_LOADS); } case 1: /* Address register direct. */ reg =3D get_areg(s, reg0); @@ -819,7 +819,7 @@ static TCGv gen_ea_mode(CPUM68KState *env, DisasContext= *s, int mode, int reg0, tcg_gen_mov_i32(reg, val); return store_dummy; } else { - return gen_extend(reg, opsize, what =3D=3D EA_LOADS); + return gen_extend(s, reg, opsize, what =3D=3D EA_LOADS); } case 2: /* Indirect register */ reg =3D get_areg(s, reg0); @@ -1759,8 +1759,8 @@ DISAS_INSN(abcd_reg) =20 gen_flush_flags(s); /* !Z is sticky */ =20 - src =3D gen_extend(DREG(insn, 0), OS_BYTE, 0); - dest =3D gen_extend(DREG(insn, 9), OS_BYTE, 0); + src =3D gen_extend(s, DREG(insn, 0), OS_BYTE, 0); + dest =3D gen_extend(s, DREG(insn, 9), OS_BYTE, 0); bcd_add(dest, src); gen_partset_reg(OS_BYTE, DREG(insn, 9), dest); =20 @@ -1794,8 +1794,8 @@ DISAS_INSN(sbcd_reg) =20 gen_flush_flags(s); /* !Z is sticky */ =20 - src =3D gen_extend(DREG(insn, 0), OS_BYTE, 0); - dest =3D gen_extend(DREG(insn, 9), OS_BYTE, 0); + src =3D gen_extend(s, DREG(insn, 0), OS_BYTE, 0); + dest =3D gen_extend(s, DREG(insn, 9), OS_BYTE, 0); =20 bcd_sub(dest, src); =20 @@ -1856,7 +1856,7 @@ DISAS_INSN(addsub) =20 add =3D (insn & 0x4000) !=3D 0; opsize =3D insn_opsize(insn); - reg =3D gen_extend(DREG(insn, 9), opsize, 1); + reg =3D gen_extend(s, DREG(insn, 9), opsize, 1); dest =3D tcg_temp_new(); if (insn & 0x100) { SRC_EA(env, tmp, opsize, 1, &addr); @@ -2386,7 +2386,7 @@ DISAS_INSN(cas) return; } =20 - cmp =3D gen_extend(DREG(ext, 0), opsize, 1); + cmp =3D gen_extend(s, DREG(ext, 0), opsize, 1); =20 /* if =3D=3D Dc then * =3D Du @@ -3055,7 +3055,7 @@ DISAS_INSN(or) int opsize; =20 opsize =3D insn_opsize(insn); - reg =3D gen_extend(DREG(insn, 9), opsize, 0); + reg =3D gen_extend(s, DREG(insn, 9), opsize, 0); dest =3D tcg_temp_new(); if (insn & 0x100) { SRC_EA(env, src, opsize, 0, &addr); @@ -3120,8 +3120,8 @@ DISAS_INSN(subx_reg) =20 opsize =3D insn_opsize(insn); =20 - src =3D gen_extend(DREG(insn, 0), opsize, 1); - dest =3D gen_extend(DREG(insn, 9), opsize, 1); + src =3D gen_extend(s, DREG(insn, 0), opsize, 1); + dest =3D gen_extend(s, DREG(insn, 9), opsize, 1); =20 gen_subx(s, src, dest, opsize); =20 @@ -3176,7 +3176,7 @@ DISAS_INSN(cmp) =20 opsize =3D insn_opsize(insn); SRC_EA(env, src, opsize, 1, NULL); - reg =3D gen_extend(DREG(insn, 9), opsize, 1); + reg =3D gen_extend(s, DREG(insn, 9), opsize, 1); gen_update_cc_cmp(s, reg, src, opsize); } =20 @@ -3329,8 +3329,8 @@ DISAS_INSN(addx_reg) =20 opsize =3D insn_opsize(insn); =20 - dest =3D gen_extend(DREG(insn, 9), opsize, 1); - src =3D gen_extend(DREG(insn, 0), opsize, 1); + dest =3D gen_extend(s, DREG(insn, 9), opsize, 1); + src =3D gen_extend(s, DREG(insn, 0), opsize, 1); =20 gen_addx(s, src, dest, opsize); =20 @@ -3369,7 +3369,7 @@ static inline void shift_im(DisasContext *s, uint16_t= insn, int opsize) int logical =3D insn & 8; int left =3D insn & 0x100; int bits =3D opsize_bytes(opsize) * 8; - TCGv reg =3D gen_extend(DREG(insn, 0), opsize, !logical); + TCGv reg =3D gen_extend(s, DREG(insn, 0), opsize, !logical); =20 if (count =3D=3D 0) { count =3D 8; @@ -3419,7 +3419,7 @@ static inline void shift_reg(DisasContext *s, uint16_= t insn, int opsize) int logical =3D insn & 8; int left =3D insn & 0x100; int bits =3D opsize_bytes(opsize) * 8; - TCGv reg =3D gen_extend(DREG(insn, 0), opsize, !logical); + TCGv reg =3D gen_extend(s, DREG(insn, 0), opsize, !logical); TCGv s32; TCGv_i64 t64, s64; =20 @@ -3556,7 +3556,7 @@ DISAS_INSN(shift_mem) while M68000 sets if the most significant bit is changed at any time during the shift operation */ if (!logical && m68k_feature(s->env, M68K_FEATURE_M68000)) { - src =3D gen_extend(src, OS_WORD, 1); + src =3D gen_extend(s, src, OS_WORD, 1); tcg_gen_xor_i32(QREG_CC_V, QREG_CC_N, src); } } else { @@ -3789,7 +3789,7 @@ DISAS_INSN(rotate8_im) TCGv shift; int tmp; =20 - reg =3D gen_extend(DREG(insn, 0), OS_BYTE, 0); + reg =3D gen_extend(s, DREG(insn, 0), OS_BYTE, 0); =20 tmp =3D (insn >> 9) & 7; if (tmp =3D=3D 0) { @@ -3816,7 +3816,7 @@ DISAS_INSN(rotate16_im) TCGv shift; int tmp; =20 - reg =3D gen_extend(DREG(insn, 0), OS_WORD, 0); + reg =3D gen_extend(s, DREG(insn, 0), OS_WORD, 0); tmp =3D (insn >> 9) & 7; if (tmp =3D=3D 0) { tmp =3D 8; @@ -3876,7 +3876,7 @@ DISAS_INSN(rotate8_reg) TCGv t0, t1; int left =3D (insn & 0x100); =20 - reg =3D gen_extend(DREG(insn, 0), OS_BYTE, 0); + reg =3D gen_extend(s, DREG(insn, 0), OS_BYTE, 0); src =3D DREG(insn, 9); /* shift in [0..63] */ t0 =3D tcg_temp_new_i32(); @@ -3911,7 +3911,7 @@ DISAS_INSN(rotate16_reg) TCGv t0, t1; int left =3D (insn & 0x100); =20 - reg =3D gen_extend(DREG(insn, 0), OS_WORD, 0); + reg =3D gen_extend(s, DREG(insn, 0), OS_WORD, 0); src =3D DREG(insn, 9); /* shift in [0..63] */ t0 =3D tcg_temp_new_i32(); @@ -4353,7 +4353,7 @@ DISAS_INSN(chk) return; } SRC_EA(env, src, opsize, 1, NULL); - reg =3D gen_extend(DREG(insn, 9), opsize, 1); + reg =3D gen_extend(s, DREG(insn, 9), opsize, 1); =20 gen_flush_flags(s); gen_helper_chk(cpu_env, reg, src); --=20 2.14.3 From nobody Sat Oct 25 21:20:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1521537003030799.2034068506193; Tue, 20 Mar 2018 02:10:03 -0700 (PDT) Received: from localhost ([::1]:46919 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eyDHI-0003lJ-VR for importer@patchew.org; Tue, 20 Mar 2018 05:09:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46521) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eyDFs-00031c-3l for qemu-devel@nongnu.org; Tue, 20 Mar 2018 05:08:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eyDFn-0002Ok-KP for qemu-devel@nongnu.org; Tue, 20 Mar 2018 05:08:28 -0400 Received: from mout.kundenserver.de ([212.227.126.131]:59527) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eyDFn-0002Nb-A5 for qemu-devel@nongnu.org; Tue, 20 Mar 2018 05:08:23 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue002 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MB724-1eqXkv2elo-00A08u; Tue, 20 Mar 2018 10:08:21 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Tue, 20 Mar 2018 10:08:13 +0100 Message-Id: <20180320090813.852-3-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180320090813.852-1-laurent@vivier.eu> References: <20180320090813.852-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K0:PNxxFdRlVSF11aPwZxXChaEyePvZojXJOYAzByD7tF2H9Rs9lUR oRPI6/lJNtZvWneHrGdsMVTEad+Z339Prf9QWKF0XFyjS/n+d9tXXQXc7hg2WlN+Zak/Q/Q cBLdjXq2vJHymhH8jsEoPfqxTlPpuo1H2eBuI5YxalxP+mvu7QSbZ/XlpkKqrHuVMxw4gm7 ITVxuQfgW897nl2slsHZw== X-UI-Out-Filterresults: notjunk:1;V01:K0:rXlRb5YCqJw=:9HjUIs2fpSKj2nTXBRSxPE 6oV3BaQbneOpv5qdb7NzBJL81XIbKXar8Yx5XKCE+YGXKJFFkxbsGa40bqwo6rAv6HR/Xc5ao zlDwhHTVDfucmF9o/gBYpwJhh00MHwKZzvrxfFy5YYiwyqVytJYbhHsEHdQGG58mYwTsPx3g5 7R/NVqrdLyuCG0HiFc+dA0lw4awsUIGts1IoHZy24wt/RgBcu+DxAtw6PlTV8ysURHfBvCQX3 /LAaiox0EgPgylQb2k3YBnKYRO00x1h+mn7KeWtwqGkelXOiU8ll/UAXHmZtcfvm2N1H+aVc9 XPvnSY4vMtIQ/P7UOSUaIXBPm7GCTGTEzqqI7KDeNBnPPl7/lI8qP2ElA1c9iBCTEdFqYZft8 tnBhvvH3SJQYbldSAR25SY5ptLVQaSPnEDCqY41KqycFlTrEc+COp6iH8WhgkU9BoJ4bZAtmr ToMuAXoYwJF0Tp5fc+2veSeX0yHQePOs+khucKlHoTnRTt6QIoiUiJ1dBozeRZ67aqazD+hhP i2/SfKvfQe8AdGDkvQ1qEDtZ4AO0xcSYZ8IQZsWk+fbWGrBh0mweBk8rscxslV1ilbjk2/QmO thxkARoxZy6/azlLa6yjzMg75O0Ai/SpPR3gAZwS/9FZD4/ZBlFhyn00ROnjN2tD+Gmb3msVf 7i6IDGtLdWkaCB82iK9tbQpZbOVITbGa2JSlYmPnEnPsEPMQAijm5hAYzC4G0NrFdiznUCOx8 vagpZO4OFu1mDgBJyZQWuzSrXfJxAnQ4PcV+BL0Z7PywzsWJkJ2WYNs/B/U= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.131 Subject: [Qemu-devel] [PULL 2/2] target/m68k: add a mechanism to automatically free TCGv X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 SRC_EA() and gen_extend() can return either a temporary TCGv or a memory allocated one. Mark them when they are allocated, and free them automatically at end of the instruction translation. We want to free locally allocated TCGv to avoid overflow in sequence like: 0xc00ae406: movel %fp@(-132),%fp@(-268) 0xc00ae40c: movel %fp@(-128),%fp@(-264) 0xc00ae412: movel %fp@(-20),%fp@(-212) 0xc00ae418: movel %fp@(-16),%fp@(-208) 0xc00ae41e: movel %fp@(-60),%fp@(-220) 0xc00ae424: movel %fp@(-56),%fp@(-216) 0xc00ae42a: movel %fp@(-124),%fp@(-252) 0xc00ae430: movel %fp@(-120),%fp@(-248) 0xc00ae436: movel %fp@(-12),%fp@(-260) 0xc00ae43c: movel %fp@(-8),%fp@(-256) 0xc00ae442: movel %fp@(-52),%fp@(-276) 0xc00ae448: movel %fp@(-48),%fp@(-272) ... That can fill a lot of TCGv entries in a sequence, especially since 15fa08f845 ("tcg: Dynamically allocate TCGOps") we have no limit to fill the TCGOps cache and we can fill the entire TCG variables array and overflow it. Suggested-by: Richard Henderson Signed-off-by: Laurent Vivier Reviewed-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20180319113544.704-3-laurent@vivier.eu> --- target/m68k/translate.c | 56 +++++++++++++++++++++++++++++++++++++--------= ---- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 1c2ff56305..6beaf9ed66 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -123,8 +123,34 @@ typedef struct DisasContext { int done_mac; int writeback_mask; TCGv writeback[8]; +#define MAX_TO_RELEASE 8 + int release_count; + TCGv release[MAX_TO_RELEASE]; } DisasContext; =20 +static void init_release_array(DisasContext *s) +{ +#ifdef CONFIG_DEBUG_TCG + memset(s->release, 0, sizeof(s->release)); +#endif + s->release_count =3D 0; +} + +static void do_release(DisasContext *s) +{ + int i; + for (i =3D 0; i < s->release_count; i++) { + tcg_temp_free(s->release[i]); + } + init_release_array(s); +} + +static TCGv mark_to_release(DisasContext *s, TCGv tmp) +{ + g_assert(s->release_count < MAX_TO_RELEASE); + return s->release[s->release_count++] =3D tmp; +} + static TCGv get_areg(DisasContext *s, unsigned regno) { if (s->writeback_mask & (1 << regno)) { @@ -347,7 +373,8 @@ static TCGv gen_ldst(DisasContext *s, int opsize, TCGv = addr, TCGv val, gen_store(s, opsize, addr, val, index); return store_dummy; } else { - return gen_load(s, opsize, addr, what =3D=3D EA_LOADS, index); + return mark_to_release(s, gen_load(s, opsize, addr, + what =3D=3D EA_LOADS, index)); } } =20 @@ -439,7 +466,7 @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasCon= text *s, TCGv base) } else { bd =3D 0; } - tmp =3D tcg_temp_new(); + tmp =3D mark_to_release(s, tcg_temp_new()); if ((ext & 0x44) =3D=3D 0) { /* pre-index */ add =3D gen_addr_index(s, ext, tmp); @@ -449,7 +476,7 @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasCon= text *s, TCGv base) if ((ext & 0x80) =3D=3D 0) { /* base not suppressed */ if (IS_NULL_QREG(base)) { - base =3D tcg_const_i32(offset + bd); + base =3D mark_to_release(s, tcg_const_i32(offset + bd)); bd =3D 0; } if (!IS_NULL_QREG(add)) { @@ -465,11 +492,11 @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasC= ontext *s, TCGv base) add =3D tmp; } } else { - add =3D tcg_const_i32(bd); + add =3D mark_to_release(s, tcg_const_i32(bd)); } if ((ext & 3) !=3D 0) { /* memory indirect */ - base =3D gen_load(s, OS_LONG, add, 0, IS_USER(s)); + base =3D mark_to_release(s, gen_load(s, OS_LONG, add, 0, IS_US= ER(s))); if ((ext & 0x44) =3D=3D 4) { add =3D gen_addr_index(s, ext, tmp); tcg_gen_add_i32(tmp, add, base); @@ -494,7 +521,7 @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasCon= text *s, TCGv base) } } else { /* brief extension word format */ - tmp =3D tcg_temp_new(); + tmp =3D mark_to_release(s, tcg_temp_new()); add =3D gen_addr_index(s, ext, tmp); if (!IS_NULL_QREG(base)) { tcg_gen_add_i32(tmp, add, base); @@ -624,7 +651,7 @@ static inline TCGv gen_extend(DisasContext *s, TCGv val= , int opsize, int sign) if (opsize =3D=3D OS_LONG) { tmp =3D val; } else { - tmp =3D tcg_temp_new(); + tmp =3D mark_to_release(s, tcg_temp_new()); gen_ext(tmp, val, opsize, sign); } =20 @@ -746,7 +773,7 @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasContex= t *s, return NULL_QREG; } reg =3D get_areg(s, reg0); - tmp =3D tcg_temp_new(); + tmp =3D mark_to_release(s, tcg_temp_new()); if (reg0 =3D=3D 7 && opsize =3D=3D OS_BYTE && m68k_feature(s->env, M68K_FEATURE_M68000)) { tcg_gen_subi_i32(tmp, reg, 2); @@ -756,7 +783,7 @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasContex= t *s, return tmp; case 5: /* Indirect displacement. */ reg =3D get_areg(s, reg0); - tmp =3D tcg_temp_new(); + tmp =3D mark_to_release(s, tcg_temp_new()); ext =3D read_im16(env, s); tcg_gen_addi_i32(tmp, reg, (int16_t)ext); return tmp; @@ -767,14 +794,14 @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasCont= ext *s, switch (reg0) { case 0: /* Absolute short. */ offset =3D (int16_t)read_im16(env, s); - return tcg_const_i32(offset); + return mark_to_release(s, tcg_const_i32(offset)); case 1: /* Absolute long. */ offset =3D read_im32(env, s); - return tcg_const_i32(offset); + return mark_to_release(s, tcg_const_i32(offset)); case 2: /* pc displacement */ offset =3D s->pc; offset +=3D (int16_t)read_im16(env, s); - return tcg_const_i32(offset); + return mark_to_release(s, tcg_const_i32(offset)); case 3: /* pc index+displacement. */ return gen_lea_indexed(env, s, NULL_QREG); case 4: /* Immediate. */ @@ -900,7 +927,7 @@ static TCGv gen_ea_mode(CPUM68KState *env, DisasContext= *s, int mode, int reg0, default: g_assert_not_reached(); } - return tcg_const_i32(offset); + return mark_to_release(s, tcg_const_i32(offset)); default: return NULL_QREG; } @@ -6033,6 +6060,7 @@ static void disas_m68k_insn(CPUM68KState * env, Disas= Context *s) uint16_t insn =3D read_im16(env, s); opcode_table[insn](env, s, insn); do_writebacks(s); + do_release(s); } =20 /* generate intermediate code for basic block 'tb'. */ @@ -6067,6 +6095,8 @@ void gen_intermediate_code(CPUState *cs, TranslationB= lock *tb) max_insns =3D TCG_MAX_INSNS; } =20 + init_release_array(dc); + gen_tb_start(tb); do { pc_offset =3D dc->pc - pc_start; --=20 2.14.3