|
From: | Richard Henderson |
Subject: | Re: [Qemu-devel] [PATCH v2 2/3] target-m68k: implement 680x0 movem |
Date: | Thu, 3 Nov 2016 13:47:26 -0600 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 |
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~
[Prev in Thread] | Current Thread | [Next in Thread] |