From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K0Cs4-0002GZ-EE for qemu-devel@nongnu.org; Sun, 25 May 2008 05:50:32 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K0Cs2-0002Fs-Ow for qemu-devel@nongnu.org; Sun, 25 May 2008 05:50:31 -0400 Received: from [199.232.76.173] (port=60020 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K0Cs2-0002Fg-Iz for qemu-devel@nongnu.org; Sun, 25 May 2008 05:50:30 -0400 Received: from ug-out-1314.google.com ([66.249.92.170]:37002) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1K0Cs2-0008Os-Hj for qemu-devel@nongnu.org; Sun, 25 May 2008 05:50:30 -0400 Received: by ug-out-1314.google.com with SMTP id j40so177630ugd.4 for ; Sun, 25 May 2008 02:50:28 -0700 (PDT) From: Richard Sandiford Date: Sun, 25 May 2008 10:50:25 +0100 Message-ID: <87od6u67by.fsf@firetop.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: [Qemu-devel] [PATCH] Fix truncate/extend reversal in MIPS DIV{, U} handling Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org The MIPS DIV and DIVU handling has the truncations and extensions reversed. This means that, on 64-bit targets, 32-bit results are not being sign-extended to fill LO and HI. Richard Index: qemu/target-mips/translate.c =================================================================== --- qemu.orig/target-mips/translate.c 2008-05-25 09:57:57.000000000 +0100 +++ qemu/target-mips/translate.c 2008-05-25 09:57:58.000000000 +0100 @@ -1989,12 +1989,12 @@ static void gen_muldiv (DisasContext *ct TCGv r_tmp2 = new_tmp(); TCGv r_tmp3 = new_tmp(); - tcg_gen_ext_i32_tl(r_tmp1, cpu_T[0]); - tcg_gen_ext_i32_tl(r_tmp2, cpu_T[1]); + tcg_gen_trunc_tl_i32(r_tmp1, cpu_T[0]); + tcg_gen_trunc_tl_i32(r_tmp2, cpu_T[1]); tcg_gen_div_i32(r_tmp3, r_tmp1, r_tmp2); tcg_gen_rem_i32(r_tmp1, r_tmp1, r_tmp2); - tcg_gen_trunc_tl_i32(cpu_T[0], r_tmp3); - tcg_gen_trunc_tl_i32(cpu_T[1], r_tmp1); + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp3); + tcg_gen_ext_i32_tl(cpu_T[1], r_tmp1); gen_store_LO(cpu_T[0], 0); gen_store_HI(cpu_T[1], 0); dead_tmp(r_tmp1); @@ -2015,12 +2015,12 @@ static void gen_muldiv (DisasContext *ct TCGv r_tmp2 = new_tmp(); TCGv r_tmp3 = new_tmp(); - tcg_gen_ext_i32_tl(r_tmp1, cpu_T[0]); - tcg_gen_ext_i32_tl(r_tmp2, cpu_T[1]); + tcg_gen_trunc_tl_i32(r_tmp1, cpu_T[0]); + tcg_gen_trunc_tl_i32(r_tmp2, cpu_T[1]); tcg_gen_divu_i32(r_tmp3, r_tmp1, r_tmp2); tcg_gen_remu_i32(r_tmp1, r_tmp1, r_tmp2); - tcg_gen_trunc_tl_i32(cpu_T[0], r_tmp3); - tcg_gen_trunc_tl_i32(cpu_T[1], r_tmp1); + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp3); + tcg_gen_ext_i32_tl(cpu_T[1], r_tmp1); gen_store_LO(cpu_T[0], 0); gen_store_HI(cpu_T[1], 0); dead_tmp(r_tmp1);