public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "H.J. Lu" <hjl.tools@gmail.com>
To: "Cui, Lili" <lili.cui@intel.com>
Cc: Jan Beulich <jbeulich@suse.com>,
	"binutils@sourceware.org" <binutils@sourceware.org>
Subject: Re: [PATCH] x86: Print {bad} on invalid broadcast in OP_E_memory
Date: Mon, 27 Sep 2021 07:39:43 -0700	[thread overview]
Message-ID: <CAMe9rOrHUoUdiznh+5ejbYTKBGni=YcMoQYW2zwrM2t1Q-5WNg@mail.gmail.com> (raw)
In-Reply-To: <CY4PR11MB1303BE434D2FB92D2F5594FD9EA79@CY4PR11MB1303.namprd11.prod.outlook.com>

On Mon, Sep 27, 2021 at 4:28 AM Cui, Lili <lili.cui@intel.com> wrote:
>
> > -----Original Message-----
> > From: Jan Beulich <jbeulich@suse.com>
> > Sent: Monday, September 27, 2021 6:12 PM
> > To: Cui, Lili <lili.cui@intel.com>
> > Cc: binutils@sourceware.org; hjl.tools@gmail.com
> > Subject: Re: [PATCH] x86: Print {bad} on invalid broadcast in OP_E_memory
>
> > I've indicated so in the past already (perhaps not to you, but in
> > general): I consider it wrong to add test cases with bogus expectations.
> > In the case here it's not only the broadcast that's invalid, but also the {%k7}.
> > For your purpose you don't need the masking part, so I'd like to ask that you
> > drop it. If and when we properly mark such bad uses of masking, a separate
> > test case covering that aspect will want adding, but the one you add now
> > would then better not require adjusting.
> >
> Yes, we don’t need masking part here, I dropped it. Thanks.
>
> > Jan
>
> Subject: [PATCH] x86: Print {bad} on invalid broadcast in OP_E_memory
>
> Don't print broadcast for scalar_mode, and print {bad} for invalid broadcast.
>
> gas/
>
>         PR binutils/28381
>         * testsuite/gas/i386/bad-bcast.s: Add a new testcase.
>         * testsuite/gas/i386/bad-bcast.d: Likewise.
>
> opcodes/
>
>         PR binutils/28381
>         * i386-dis.c (static struct): Add no_broadcast.
>         (OP_E_memory): Mark invalid broadcast with no_broadcast=1 and Print "{bad}"for it.
>         (intel_operand_size): mark invalid broadcast with no_broadcast=1.
>         (OP_XMM): Mark scalar_mode with no_broadcast=1.
> ---
>  gas/testsuite/gas/i386/bad-bcast.d |  10 +-
>  gas/testsuite/gas/i386/bad-bcast.s |   2 +
>  opcodes/i386-dis.c                 | 155 +++++++++++++++--------------
>  3 files changed, 88 insertions(+), 79 deletions(-)
>
> diff --git a/gas/testsuite/gas/i386/bad-bcast.d b/gas/testsuite/gas/i386/bad-bcast.d
> index 9fc474a42f..4f82925999 100644
> --- a/gas/testsuite/gas/i386/bad-bcast.d
> +++ b/gas/testsuite/gas/i386/bad-bcast.d
> @@ -7,8 +7,8 @@
>  Disassembly of section .text:
>
>  0+ <.text>:
> - +[a-f0-9]+:   62                      .byte 0x62
> - +[a-f0-9]+:   c3                      ret
> - +[a-f0-9]+:   8c 1d 66 90 66 90       mov    %ds,0x90669066
> - +[a-f0-9]+:   66 90                   xchg   %ax,%ax
> -#pass
> + +[a-f0-9]+:   62 c3 8c 1d 66\s+\(bad\)
> + +[a-f0-9]+:   90\s+nop
> + +[a-f0-9]+:   66 90\s+xchg   %ax,%ax
> + +[a-f0-9]+:   66 90\s+xchg   %ax,%ax
> + +[a-f0-9]+:   62 c1 ff 38 2a 20\s+vcvtsi2sd \(%eax\){bad},%xmm0,%xmm4
> diff --git a/gas/testsuite/gas/i386/bad-bcast.s b/gas/testsuite/gas/i386/bad-bcast.s
> index 3e49b2238e..6c55dcbbbd 100644
> --- a/gas/testsuite/gas/i386/bad-bcast.s
> +++ b/gas/testsuite/gas/i386/bad-bcast.s
> @@ -1,3 +1,5 @@
>         .text
>  # Invalid 16-bit broadcast with EVEX.W == 1.
>         .byte 0x62, 0xc3, 0x8c, 0x1d, 0x66, 0x90, 0x66, 0x90, 0x66, 0x90
> +# Invalid vcvtsi2sd with EVEX.b == 1.
> +       .byte 0x62,0xc1,0xff,0x38,0x2a,0x20

The bug report is for -Mintel.  But there are no tests for it.  Please
add -Mintel tests for bad casts.

> diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
> index aa292233d4..926f776de8 100644
> --- a/opcodes/i386-dis.c
> +++ b/opcodes/i386-dis.c
> @@ -2422,6 +2422,7 @@ static struct
>      int zeroing;
>      int ll;
>      int b;
> +    int no_broadcast;
>    }
>  vex;
>  static unsigned char need_vex;
> @@ -11059,23 +11060,25 @@ intel_operand_size (int bytemode, int sizeflag)
>  {
>    if (vex.b)
>      {
> -      switch (bytemode)
> -       {
> -       case x_mode:
> -       case evex_half_bcst_xmmq_mode:
> -         if (vex.w)
> -           oappend ("QWORD PTR ");
> -         else
> -           oappend ("DWORD PTR ");
> -         break;
> -       case xh_mode:
> -       case evex_half_bcst_xmmqh_mode:
> -       case evex_half_bcst_xmmqdh_mode:
> -         oappend ("WORD PTR ");
> -         break;
> -       default:
> -         abort ();
> -       }
> +      if (!vex.no_broadcast)
> +       switch (bytemode)
> +         {
> +         case x_mode:
> +         case evex_half_bcst_xmmq_mode:
> +           if (vex.w)
> +             oappend ("QWORD PTR ");
> +           else
> +             oappend ("DWORD PTR ");
> +           break;
> +         case xh_mode:
> +         case evex_half_bcst_xmmqh_mode:
> +         case evex_half_bcst_xmmqdh_mode:
> +           oappend ("WORD PTR ");
> +           break;
> +         default:
> +           vex.no_broadcast = 1;
> +           break;
> +         }
>        return;
>      }
>    switch (bytemode)
> @@ -11908,69 +11911,71 @@ OP_E_memory (int bytemode, int sizeflag)
>    if (vex.b)
>      {
>        evex_used |= EVEX_b_used;
> -      if (bytemode == xh_mode)
> -        {
> -          if (vex.w)
> -            {
> -             oappend ("{bad}");
> -            }
> -          else
> -            {
> -              switch (vex.length)
> -                {
> -                case 128:
> -                  oappend ("{1to8}");
> -                  break;
> -                case 256:
> -                  oappend ("{1to16}");
> -                  break;
> -                case 512:
> -                  oappend ("{1to32}");
> -                  break;
> -                default:
> -                 abort ();
> -                }
> -            }
> -        }
> -      else if (vex.w
> -         || bytemode == evex_half_bcst_xmmqdh_mode
> -         || bytemode == evex_half_bcst_xmmq_mode)
> +      if (!vex.no_broadcast)
>         {
> -         switch (vex.length)
> +         if (bytemode == xh_mode)
>             {
> -           case 128:
> -             oappend ("{1to2}");
> -             break;
> -           case 256:
> -             oappend ("{1to4}");
> -             break;
> -           case 512:
> -             oappend ("{1to8}");
> -             break;
> -           default:
> -             abort ();
> +             if (vex.w)
> +               oappend ("{bad}");
> +             else
> +               {
> +                 switch (vex.length)
> +                   {
> +                   case 128:
> +                     oappend ("{1to8}");
> +                     break;
> +                   case 256:
> +                     oappend ("{1to16}");
> +                     break;
> +                   case 512:
> +                     oappend ("{1to32}");
> +                     break;
> +                   default:
> +                     abort ();
> +                   }
> +               }
>             }
> -       }
> -      else if (bytemode == x_mode
> -         || bytemode == evex_half_bcst_xmmqh_mode)
> -       {
> -         switch (vex.length)
> +         else if (vex.w
> +                  || bytemode == evex_half_bcst_xmmqdh_mode
> +                  || bytemode == evex_half_bcst_xmmq_mode)
>             {
> -           case 128:
> -             oappend ("{1to4}");
> -             break;
> -           case 256:
> -             oappend ("{1to8}");
> -             break;
> -           case 512:
> -             oappend ("{1to16}");
> -             break;
> -           default:
> -             abort ();
> +             switch (vex.length)
> +               {
> +               case 128:
> +                 oappend ("{1to2}");
> +                 break;
> +               case 256:
> +                 oappend ("{1to4}");
> +                 break;
> +               case 512:
> +                 oappend ("{1to8}");
> +                 break;
> +               default:
> +                 abort ();
> +               }
> +           }
> +         else if (bytemode == x_mode
> +                  || bytemode == evex_half_bcst_xmmqh_mode)
> +           {
> +             switch (vex.length)
> +               {
> +               case 128:
> +                 oappend ("{1to4}");
> +                 break;
> +               case 256:
> +                 oappend ("{1to8}");
> +                 break;
> +               case 512:
> +                 oappend ("{1to16}");
> +                 break;
> +               default:
> +                 abort ();
> +               }
>             }
> +         else
> +           vex.no_broadcast = 1;
>         }
> -      else
> -       /* If operand doesn't allow broadcast, vex.b should be 0.  */
> +      if (vex.no_broadcast)
>         oappend ("{bad}");
>      }
>  }
> @@ -12685,6 +12690,8 @@ OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
>
>    if (bytemode == tmm_mode)
>      modrm.reg = reg;
> +  else if (bytemode == scalar_mode)
> +    vex.no_broadcast = 1;
>
>    print_vector_reg (reg, bytemode);
>  }
> --
> 2.17.1
>
> Lili.
>
>
>


-- 
H.J.

  parent reply	other threads:[~2021-09-27 14:40 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-27  9:39 Cui,Lili
2021-09-27 10:12 ` Jan Beulich
2021-09-27 11:28   ` Cui, Lili
2021-09-27 11:32     ` Jan Beulich
2021-09-27 14:39     ` H.J. Lu [this message]
2021-09-28  2:40       ` Cui, Lili
2021-09-28  2:45         ` H.J. Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAMe9rOrHUoUdiznh+5ejbYTKBGni=YcMoQYW2zwrM2t1Q-5WNg@mail.gmail.com' \
    --to=hjl.tools@gmail.com \
    --cc=binutils@sourceware.org \
    --cc=jbeulich@suse.com \
    --cc=lili.cui@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).