diff mbox series

[25/28] target/mips: Fix gen_mxu_s32ldd_s32lddr

Message ID 20210614083800.1166166-26-richard.henderson@linaro.org
State Superseded
Headers show
Series tcg: bswap improvements | expand

Commit Message

Richard Henderson June 14, 2021, 8:37 a.m. UTC
There were two bugs here: (1) the required endianness was
not present in the MemOp, and (2) we were not providing a
zero-extended input to the bswap as semantics required.

The best fix is to fold the bswap into the memory operation,
producing the desired result directly.

Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>
Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/mips/tcg/mxu_translate.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

-- 
2.25.1

Comments

Philippe Mathieu-Daudé June 21, 2021, 8:59 p.m. UTC | #1
Cc'ing Craig

On 6/14/21 10:37 AM, Richard Henderson wrote:
> There were two bugs here: (1) the required endianness was

> not present in the MemOp, and (2) we were not providing a

> zero-extended input to the bswap as semantics required.

> 

> The best fix is to fold the bswap into the memory operation,

> producing the desired result directly.

> 

> Cc: Philippe Mathieu-Daudé <f4bug@amsat.org>

> Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/mips/tcg/mxu_translate.c | 6 +-----

>  1 file changed, 1 insertion(+), 5 deletions(-)

> 

> diff --git a/target/mips/tcg/mxu_translate.c b/target/mips/tcg/mxu_translate.c

> index c12cf78df7..f4356432c7 100644

> --- a/target/mips/tcg/mxu_translate.c

> +++ b/target/mips/tcg/mxu_translate.c

> @@ -857,12 +857,8 @@ static void gen_mxu_s32ldd_s32lddr(DisasContext *ctx)

>          tcg_gen_ori_tl(t1, t1, 0xFFFFF000);

>      }

>      tcg_gen_add_tl(t1, t0, t1);

> -    tcg_gen_qemu_ld_tl(t1, t1, ctx->mem_idx, MO_SL);

> +    tcg_gen_qemu_ld_tl(t1, t1, ctx->mem_idx, MO_TESL ^ (sel * MO_BSWAP));

>  

> -    if (sel == 1) {

> -        /* S32LDDR */

> -        tcg_gen_bswap32_tl(t1, t1, TCG_BSWAP_IZ | TCG_BSWAP_OZ);

> -    }

>      gen_store_mxu_gpr(t1, XRa);

>  

>      tcg_temp_free(t0);

> 


Acked-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
diff mbox series

Patch

diff --git a/target/mips/tcg/mxu_translate.c b/target/mips/tcg/mxu_translate.c
index c12cf78df7..f4356432c7 100644
--- a/target/mips/tcg/mxu_translate.c
+++ b/target/mips/tcg/mxu_translate.c
@@ -857,12 +857,8 @@  static void gen_mxu_s32ldd_s32lddr(DisasContext *ctx)
         tcg_gen_ori_tl(t1, t1, 0xFFFFF000);
     }
     tcg_gen_add_tl(t1, t0, t1);
-    tcg_gen_qemu_ld_tl(t1, t1, ctx->mem_idx, MO_SL);
+    tcg_gen_qemu_ld_tl(t1, t1, ctx->mem_idx, MO_TESL ^ (sel * MO_BSWAP));
 
-    if (sel == 1) {
-        /* S32LDDR */
-        tcg_gen_bswap32_tl(t1, t1, TCG_BSWAP_IZ | TCG_BSWAP_OZ);
-    }
     gen_store_mxu_gpr(t1, XRa);
 
     tcg_temp_free(t0);