[PATCH] x86/APX: correct disassembly for EVEX.B4

Cui, Lili lili.cui@intel.com
Fri Sep 6 02:04:41 GMT 2024



> -----Original Message-----
> From: Jan Beulich <jbeulich@suse.com>
> Sent: Thursday, September 5, 2024 7:31 PM
> To: Binutils <binutils@sourceware.org>
> Cc: Cui, Lili <lili.cui@intel.com>; H.J. Lu <hjl.tools@gmail.com>
> Subject: [PATCH] x86/APX: correct disassembly for EVEX.B4
> 
> EVEX.B4 is used only for GPR (or addressing of memory) operands. SIMD
> registers encoded via ModR/M.rm (when ModR/M.mod == 3) have their top bit
> in EVEX.X3. Supposedly (doc version 004) EVEX.B4 is ignored when unused,
> hence also don't flag such encodings as invalid.
> 
> --- a/opcodes/i386-dis.c
> +++ b/opcodes/i386-dis.c
> @@ -13001,14 +13001,15 @@ OP_EX (instr_info *ins, int bytemode, in
>    USED_REX (REX_B);
>    if (ins->rex & REX_B)
>      reg += 8;
> -  if (ins->rex2 & REX_B)
> -    reg += 16;
>    if (ins->vex.evex)
>      {
>        USED_REX (REX_X);
>        if ((ins->rex & REX_X))
>  	reg += 16;
> +      ins->rex2_used &= ~REX_B;
>      }
> +  else if (ins->rex2 & REX_B)
> +    reg += 16;
> 
>    if ((sizeflag & SUFFIX_ALWAYS)
>        && (bytemode == x_swap_mode

when setting ins->vex.evex , we use EVEX.X to decode SIMD, then ins->rex also needs to be put into the else branch since it uses REX_B right?

If (ins->vex.evex)
  {
     Use REX_X.
  }
else
  {
    Use REX_B.
  }

Lili.


More information about the Binutils mailing list