From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40920) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UiQrN-00045F-O0 for qemu-devel@nongnu.org; Fri, 31 May 2013 11:04:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UiQrC-0002zX-TG for qemu-devel@nongnu.org; Fri, 31 May 2013 11:03:17 -0400 Received: from mail-ve0-x22e.google.com ([2607:f8b0:400c:c01::22e]:50464) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UiQrC-0002zI-Mg for qemu-devel@nongnu.org; Fri, 31 May 2013 11:03:06 -0400 Received: by mail-ve0-f174.google.com with SMTP id oz10so1190983veb.19 for ; Fri, 31 May 2013 08:03:05 -0700 (PDT) Sender: Richard Henderson Message-ID: <51A8BBA5.3060402@twiddle.net> Date: Fri, 31 May 2013 08:03:01 -0700 From: Richard Henderson MIME-Version: 1.0 References: <1369855851-21400-1-git-send-email-rth@twiddle.net> In-Reply-To: <1369855851-21400-1-git-send-email-rth@twiddle.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] target-i386: Fix aflag logic for CODE64 and the 0x67 prefix List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Anthony Liguori Ping. On 05/29/2013 12:30 PM, Richard Henderson wrote: > The code reorganization in commit 4a6fd938 broke handling of PREFIX_ADR. > While fixing this, tidy and comment the code so that it's more obvious > what's going on in setting both aflag and dflag. > > The TARGET_X86_64 ifdef can be eliminated because CODE64 expands to the > constant zero when TARGET_X86_64 is undefined. > > Cc: Paolo Bonzini > Reported-by: Laszlo Ersek > Signed-off-by: Richard Henderson > --- > target-i386/translate.c | 30 +++++++++++++++--------------- > 1 file changed, 15 insertions(+), 15 deletions(-) > > diff --git a/target-i386/translate.c b/target-i386/translate.c > index 0aeccdb..14b0298 100644 > --- a/target-i386/translate.c > +++ b/target-i386/translate.c > @@ -4677,8 +4677,6 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, > } > s->pc = pc_start; > prefixes = 0; > - aflag = s->code32; > - dflag = s->code32; > s->override = -1; > rex_w = -1; > rex_r = 0; > @@ -4801,23 +4799,25 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, > } > > /* Post-process prefixes. */ > - if (prefixes & PREFIX_DATA) { > - dflag ^= 1; > - } > - if (prefixes & PREFIX_ADR) { > - aflag ^= 1; > - } > -#ifdef TARGET_X86_64 > if (CODE64(s)) { > - if (rex_w == 1) { > - /* 0x66 is ignored if rex.w is set */ > - dflag = 2; > + /* In 64-bit mode, the default data size is 32-bit. Select 64-bit > + data with rex_w, and 16-bit data with 0x66; rex_w takes precedence > + over 0x66 if both are present. */ > + dflag = (rex_w > 0 ? 2 : prefixes & PREFIX_DATA ? 0 : 1); > + /* In 64-bit mode, 0x67 selects 32-bit addressing. */ > + aflag = (prefixes & PREFIX_ADR ? 1 : 2); > + } else { > + /* In 16/32-bit mode, 0x66 selects the opposite data size. */ > + dflag = s->code32; > + if (prefixes & PREFIX_DATA) { > + dflag ^= 1; > } > - if (!(prefixes & PREFIX_ADR)) { > - aflag = 2; > + /* In 16/32-bit mode, 0x67 selects the opposite addressing. */ > + aflag = s->code32; > + if (prefixes & PREFIX_ADR) { > + aflag ^= 1; > } > } > -#endif > > s->prefix = prefixes; > s->aflag = aflag; >