Le 03/11/2016 à 21:47, Richard Henderson a écrit : > 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 ...) > ... > } >
Because it has already been decremented by gen_lea()... so this a problem if we have page fault, except if we use your "areg writeback" series, and we will. Thanks, Laurent