From: Laurent Vivier <laurent@vivier.eu>
According to Programmer's Reference Manual, if Dc1 and Dc2 specify the
same data register and the comparison fails, memory operand 1 is stored
in the data register.
The current helpers wrote Dc1 then Dc2, leaving operand 2 in the shared
register.
Swap the writeback order for cas2w/cas2l so memory operand 1 wins.
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-ID: <20251226213707.331741-1-laurent@vivier.eu>
(cherry picked from commit 11dac41f2e830bcd7ba74969dc50f5740e3ce7e7)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
index 15bad5dd46..eeb61f940a 100644
--- a/target/m68k/op_helper.c
+++ b/target/m68k/op_helper.c
@@ -778,8 +778,8 @@ void HELPER(cas2w)(CPUM68KState *env, uint32_t regs, uint32_t a1, uint32_t a2)
env->cc_v = c2;
}
env->cc_op = CC_OP_CMPW;
- env->dregs[Dc1] = deposit32(env->dregs[Dc1], 0, 16, l1);
env->dregs[Dc2] = deposit32(env->dregs[Dc2], 0, 16, l2);
+ env->dregs[Dc1] = deposit32(env->dregs[Dc1], 0, 16, l1);
}
static void do_cas2l(CPUM68KState *env, uint32_t regs, uint32_t a1, uint32_t a2,
@@ -840,8 +840,8 @@ static void do_cas2l(CPUM68KState *env, uint32_t regs, uint32_t a1, uint32_t a2,
env->cc_v = c2;
}
env->cc_op = CC_OP_CMPL;
- env->dregs[Dc1] = l1;
env->dregs[Dc2] = l2;
+ env->dregs[Dc1] = l1;
}
void HELPER(cas2l)(CPUM68KState *env, uint32_t regs, uint32_t a1, uint32_t a2)
--
2.47.3