Enable Intel AVX512_FP16 instructions and test

Jan Beulich jbeulich@suse.com
Wed Aug 4 15:50:00 GMT 2021


On 04.08.2021 16:47, Cui, Lili wrote:
> @@ -6088,6 +6092,21 @@ check_VecOperands (const insn_template *t)
>        return 1;
>      }
>  
> +  /* For some special instructions require that destination must be distinct
> +     from source registers.  */
> +  if (t->opcode_modifier.reqdistinctreg && i.operands >= 3)

I'd like to suggest that "i.operands >= 3" be taken out of there and
converted to e.g. "know (i.operands >= 3)" inside the if()'s body.

> +    {
> +      unsigned int dest_reg = i.operands - 1;
> +
> +      /* #UD if dest_reg == src1_reg or dest_reg == src2_reg.  */
> +      if (i.op[dest_reg - 1].regs == i.op[dest_reg].regs
> +	  || (i.reg_operands > 2
> +	      && i.op[dest_reg - 2].regs == i.op[dest_reg].regs))
> +	{
> +	  i.error = invalid_dest_and_src_register_set;
> +	  return 1;
> +	}
> +    }
>    /* Check if broadcast is supported by the instruction and is applied
>       to the memory operand.  */
>    if (i.broadcast.type)

Can you please retain a blank line between the unrelated code blocks?

> @@ -7628,6 +7650,16 @@ check_word_reg (void)
>  		i.suffix);
>  	return 0;
>        }
> +    /* For some instructions need encode as EVEX.W=1 without explicit VexW1. */
> +    else if (i.types[op].bitfield.qword
> +	     && i.tm.operand_types[op].bitfield.class == Reg
> +	     && intel_syntax
> +	     && i.tm.opcode_modifier.toqword
> +	     && i.types[0].bitfield.class != RegSIMD)

Largely out of curiosity, is the last part of the condition actually
needed?

> +      {
> +          /* Convert to QWORD.  We want EVEX.W byte. */
> +	  i.suffix = QWORD_MNEM_SUFFIX;

Nit: Indentation of the two lines doesn't match.

> @@ -13507,6 +13665,45 @@ MOVSXD_Fixup (int bytemode, int sizeflag)
>    OP_E (bytemode, sizeflag);
>  }
>  
> +ReqDistinctReg_Fixup (int bytemode, int sizeflag)

Please don't omit the "static void" here. I'm actually surprised
that the compiler didn't warn about this form.

> +{
> +  unsigned int reg = vex.register_specifier;
> +  unsigned int modrm_reg = modrm.reg;
> +  unsigned int modrm_rm = modrm.rm;
> +
> +  /* Calc destination register number.  */
> +  if (rex & REX_R)
> +    modrm_reg += 8;
> +  if (!vex.r)
> +    modrm_reg += 16;
> +
> +  /* Calc src1 register number.  */
> +  if (address_mode != mode_64bit)
> +    reg &= 7;
> +  else if (vex.evex && !vex.v)
> +    reg += 16;
> +
> +  /* Calc src2 register number.  */
> +  if (modrm.mod == 3)
> +    {
> +      if (rex & REX_B)
> +        modrm_rm += 8;
> +      if ((rex & REX_X))

Ideally you'd be consistent with the use of parentheses in similar
statements.

Jan



More information about the Binutils mailing list