On Wed, 2026-08-26 at 21:27 +0900, Oleg Endo wrote:
> On Wed, 2026-08-26 at 20:44 +0900, [email protected] wrote:
> > 
> > It is true that the current behavior differs from the pseudocode in the 
> > manual.
> > Wouldn't it be simpler to just generate a TCG that matches the pseudocode?
> > I'm sorry, I haven't actually tested this change yet.
> > 
> > diff --git a/target/sh4/translate.c b/target/sh4/translate.c
> > index e503a97b22..64fe2cd31d 100644
> > --- a/target/sh4/translate.c
> > +++ b/target/sh4/translate.c
> > @@ -801,13 +801,13 @@ static void _decode_opc(DisasContext * ctx)
> >          {
> >              TCGv arg0, arg1;
> >              arg0 = tcg_temp_new();
> > -            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
> > -                                MO_TESL | MO_ALIGN);
> > -            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
> >              arg1 = tcg_temp_new();
> >              tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx,
> >                                  MO_TESL | MO_ALIGN);
> >              tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
> > +            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
> > +                                MO_TESL | MO_ALIGN);
> > +            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
> >              gen_helper_macl(tcg_env, arg0, arg1);
> >          }
> >          return;
> > @@ -815,13 +815,13 @@ static void _decode_opc(DisasContext * ctx)
> >          {
> >              TCGv arg0, arg1;
> >              arg0 = tcg_temp_new();
> > -            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
> > -                                MO_TESW | MO_ALIGN);
> > -            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
> >              arg1 = tcg_temp_new();
> >              tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx,
> >                                  MO_TESW | MO_ALIGN);
> >              tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2);
> > +            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
> > +                                MO_TESW | MO_ALIGN);
> > +            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
> >              gen_helper_macw(tcg_env, arg0, arg1);
> >          }
> >          return;
> > 
> > 
> 
> Thanks, I think you're right.  I'll have another look and report back in a
> few days.
> 

I've checked it, the attached patch has less clutter, as per your suggestion
and it works.

Best regards,
Oleg Endo
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
index 53b0921..4ab439b 100644
--- a/target/sh4/translate.c
+++ b/target/sh4/translate.c
@@ -806,28 +806,28 @@ static void _decode_opc(DisasContext * ctx)
         {
             TCGv arg0, arg1;
             arg0 = tcg_temp_new();
-            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
-                                MO_TESL | MO_ALIGN);
             arg1 = tcg_temp_new();
             tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx,
                                 MO_TESL | MO_ALIGN);
-            gen_helper_macl(tcg_env, arg0, arg1);
-            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
             tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
+            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
+                                MO_TESL | MO_ALIGN);
+            tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
+            gen_helper_macl(tcg_env, arg0, arg1);
         }
         return;
     case 0x400f: /* mac.w @Rm+,@Rn+ */
         {
             TCGv arg0, arg1;
             arg0 = tcg_temp_new();
-            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
-                                MO_TESW | MO_ALIGN);
             arg1 = tcg_temp_new();
             tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx,
                                 MO_TESW | MO_ALIGN);
-            gen_helper_macw(tcg_env, arg0, arg1);
             tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2);
+            tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx,
+                                MO_TESW | MO_ALIGN);
             tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
+            gen_helper_macw(tcg_env, arg0, arg1);
         }
         return;
     case 0x0007: /* mul.l Rm,Rn */

Reply via email to