The code reorganization in commit 4a6fd938 broke handling of PREFIX_ADR.
Restore the previous behavior:
If TARGET_X86_64 *and* CODE64():
(a) PREFIX_ADR set: no effect, "aflag" should stay at the original
"s->code32" value,
(b) PREFIX_ADR clear: "aflag" should be set to constant 2.
Other
On 2013-05-24 14:37, Laszlo Ersek wrote:
@@ -4813,7 +4813,11 @@ static target_ulong disas_insn(CPUX86State *env,
DisasContext *s,
/* 0x66 is ignored if rex.w is set */
dflag = 2;
}
-if (!(prefixes & PREFIX_ADR)) {
+if (prefixes & PREFIX_ADR)
Il 26/05/2013 01:23, Richard Henderson ha scritto:
> On 2013-05-24 14:37, Laszlo Ersek wrote:
>> @@ -4813,7 +4813,11 @@ static target_ulong disas_insn(CPUX86State
>> *env, DisasContext *s,
>> /* 0x66 is ignored if rex.w is set */
>> dflag = 2;
>> }
>> -
On 05/26/13 10:33, Paolo Bonzini wrote:
> Il 26/05/2013 01:23, Richard Henderson ha scritto:
>> On 2013-05-24 14:37, Laszlo Ersek wrote:
>>> @@ -4813,7 +4813,11 @@ static target_ulong disas_insn(CPUX86State
>>> *env, DisasContext *s,
>>> /* 0x66 is ignored if rex.w is set */
>>>
Il 27/05/2013 01:45, Laszlo Ersek ha scritto:
> I believe aflag++ is incorrect if the current default address size for
> 32-bit is 16-bit (ie. (s->code32 & 1) == 0).
... which cannot happen. :)
(Sorry, should have been more verbose).
See cpu_x86_load_seg_cache:
#ifdef TARGET_X86_64