On 11/02/2016 03:15 PM, Laurent Vivier wrote:
+                    if ((insn & 7) + 8 == i &&
+                        m68k_feature(s->env, M68K_FEATURE_EXT_FULL)) {
+                        /* M68020+: if the addressing register is the
+                         * register moved to memory, the value written
+                         * is the initial value decremented by the size of
+                         * the operation
+                         * M68000/M68010: the value is the initial value
+                         */
+                        TCGv tmp = tcg_temp_new();
+                        tcg_gen_sub_i32(tmp, mreg(i), incr);
+                        gen_store(s, opsize, addr, tmp);
+                        tcg_temp_free(tmp);

This doesn't look right. Is the value stored the intermediate value of the decremented register, or the final value? What you're storing is reg-4, which is neither of these things.

I could see, maybe, that reg-4 might well turn out to be the right value for

        movem   {a0-a7}, (sp)-

since sp == a7, and therefore stored first. But I question that's the correct result for

        movem   {a0-a7}, (a1)-

If it's the incremental value, then you can just store "addr" and you don't need a temp. If it's the final value, then you can compute

        tcg_gen_subi_i32(tmp, AREG(insn, 0), ctpop32(mask) * 4);



r~

Reply via email to