On 11/02/2016 03:15 PM, Laurent Vivier wrote:
+ for (i = 15; i >= 0; i--, mask >>= 1) { + if (mask & 1) { + 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); + } else { + gen_store(s, opsize, addr, mreg(i)); + } + if (mask != 1) { + tcg_gen_sub_i32(addr, addr, incr); + } + }
One more thing: This is pre-decrement. Why are you decrementing after the store? Seems to me this should be
if (mask & 1) { tcg_gen_sub_i32(addr, addr, incr); if (REG(insn, 0) + 8 == i ...) ... } r~