Received: from eggs.gnu.org ([208.118.235.92]:33329) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tx0bc-0001dd-GN for qemu-devel@nongnu.org; Sun, 20 Jan 2013 14:31:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tx0bZ-0000Xa-Tv for qemu-devel@nongnu.org; Sun, 20 Jan 2013 14:31:00 -0500 Received: from mail-wg0-f50.google.com ([74.125.82.50]:62754) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tx0bZ-0000XV-Ht for qemu-devel@nongnu.org; Sun, 20 Jan 2013 14:30:57 -0500 Received: by mail-wg0-f50.google.com with SMTP id es5so3232698wgb.17 for ; Sun, 20 Jan 2013 11:30:56 -0800 (PST) From: Richard Sandiford Date: Sun, 20 Jan 2013 19:30:54 +0000 Message-ID: <87pq0zlki9.fsf@talisman.default> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH] target-mips: Sign-extend the result of LWR List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, aurelien@aurel32.net Sign-extend the result of LWR, as is already done for LWL. This is necessary in the case where LWR loads the full word (i.e. the address is actually aligned). In the other cases, it is implementation defined whether the upper 32 bits of the result are unchanged or a copy of bit 31. The latter seems easier to implement. Previously the code used: (oldval & (0xfffffffe << (31 - bitshift))) | (newval >> bitshift) which zeroed the upper bits of the register, losing any previous sign extension in the unaligned cases. Signed-off-by: Richard Sandiford --- target-mips/translate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target-mips/translate.c b/target-mips/translate.c index 623edd0..08e28f3 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -1735,6 +1735,7 @@ static void gen_ld (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, tcg_temp_free(t2); tcg_gen_or_tl(t0, t0, t1); tcg_temp_free(t1); + tcg_gen_ext32s_tl(t0, t0); gen_store_gpr(t0, rt); opn = "lwr"; break; -- 1.7.11.7