From c728154bbbc1a86465a0fd6bfc839bc9710ac374 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 20 Jan 2013 19:30:54 +0000 Subject: [PATCH] target-mips: Sign-extend the result of LWR 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 Reviewed-by: Richard Henderson Signed-off-by: Aurelien Jarno --- target-mips/translate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target-mips/translate.c b/target-mips/translate.c index 8520d28519..e58d916b04 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -1745,6 +1745,7 @@ static void gen_ld(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; -- 2.11.4.GIT