[PATCH 1/2 v2] Support APX CCMP and CTEST

Cui, Lili lili.cui@intel.com
Tue Jun 18 02:57:57 GMT 2024


> On 14.06.2024 13:08, Cui, Lili wrote:
> > @@ -1929,6 +1939,111 @@ static INLINE bool need_evex_encoding (const
> > insn_template *t)  #define CPU_FLAGS_PERFECT_MATCH \
> >    (CPU_FLAGS_ARCH_MATCH | CPU_FLAGS_64BIT_MATCH)
> >
> > +static INLINE bool set_oszc_flags (unsigned int oszc_shift) {
> > +  if (i.oszc_flags & oszc_shift)
> > +    {
> > +      as_bad (_("same oszc flag used twice"));
> > +      return false;
> > +    }
> > +  i.oszc_flags |= oszc_shift;
> > +  return true;
> > +}
> > +
> > +/* Handle SCC OSZC flags.  */
> > +
> > +static int
> > +check_Scc_OszcOperations (const char *l) {
> > +  const char *suffix_string = l;
> > +
> > +  while (is_space_char (*suffix_string))
> > +    suffix_string++;
> 
> As mentioned in a earlier reply, I'd prefer if these were - consistent with what we
> have elsewhere - if(), not while(). But I won't insist.
> 

I prefer to use while (), thanks.

> > +  /* If {oszc flags} is absent, just return.  */  if (*suffix_string
> > + != '{')
> > +    return 0;
> > +
> > +  /* Skip '{'.  */
> > +  suffix_string++;
> > +
> > +  /* Parse 'dfv='.  */
> > +  while (is_space_char (*suffix_string))
> > +    suffix_string++;
> > +
> > +  if (strncasecmp (suffix_string, "dfv", 3) == 0)
> > +    suffix_string += 3;
> > +  else
> > +    {
> > +      as_bad (_("Unrecognized pseudo-suffix"));
> 
> Please can diagnostics start without capital letters (unless it's some form of
> acronym)? See elsewhere, including what you have right here in set_oszc_flags().
> 

Done.

> > +      return -1;
> > +    }
> > +
> > +  while (is_space_char (*suffix_string))
> > +    suffix_string++;
> > +
> > +  if (*suffix_string == '=')
> > +    suffix_string++;
> > +  else
> > +    {
> > +      as_bad (_("Unrecognized pseudo-suffix"));
> > +      return -1;
> > +    }
> > +
> > +  /* Parse 'of, sf, zf, cf}'.  */
> > +  while (*suffix_string)
> > +    {
> > +      while (is_space_char (*suffix_string))
> > +	suffix_string++;
> > +
> > +      /* Return for '{dfv=}'.  */
> > +      if (*suffix_string == '}')
> > +	return ++suffix_string - l;
> 
> Such an increment is pretty pointless, and hopefully the compiler will translate it
> to
> 
> 	return suffix_string + 1 - l;
> 
> anyway. Better to also write it like this right away.
>

Done.
 
> > +      if (strncasecmp (suffix_string, "of", 2) == 0)
> > +	{
> > +	  if (!set_oszc_flags (OSZC_OF))
> > +	    return -1;
> > +	}
> > +      else if (strncasecmp (suffix_string, "sf", 2) == 0)
> > +	{
> > +	  if (!set_oszc_flags (OSZC_SF))
> > +	    return -1;
> > +	}
> > +      else if (strncasecmp (suffix_string, "zf", 2) == 0)
> > +	{
> > +	  if (!set_oszc_flags (OSZC_ZF))
> > +	    return -1;
> > +	}
> > +      else if (strncasecmp (suffix_string, "cf", 2) == 0)
> > +	{
> > +	  if (!set_oszc_flags (OSZC_CF))
> > +	    return -1;
> > +	}
> > +      else
> > +	{
> > +	  as_bad (_("Unrecognized oszc flags or illegal `,' in pseudo-suffix"));
> > +	  return -1;
> > +	}
> > +
> > +      suffix_string += 2;
> > +
> > +      while (is_space_char (*suffix_string))
> > +	suffix_string++;
> > +
> > +      if (*suffix_string == '}')
> > +	return ++suffix_string - l;
> > +
> > +      if (*suffix_string != ',')
> > +	break;
> > +
> > +      suffix_string ++;
> 
> Please omit the stray / inconsistent blank.
> 

Done.

> > +    }
> > +
> > +  as_bad (_("Illegal `}' or `,' in pseudo-suffix"));
> 
> When you come here, isn't it that you _did not_ find the expected } or ,?
> IOW s/Illegal/missing"?
> 

Done.

> > @@ -7453,6 +7598,7 @@ parse_insn (const char *line, char *mnemonic, bool
> prefix_only)
> >  	    }
> >  	}
> >      }
> > +
> >    /* Any other comma loses.  */
> >    if (*l == ',')
> >      {
> 
> Stray / leftover change?
> 

Done.

> > @@ -10398,6 +10427,23 @@ putop (instr_info *ins, const char *in_template,
> int sizeflag)
> >  		*ins->obufp++ = *q;
> >  	      break;
> >  	    }
> > +	  else if (l == 1 && last[0] == 'S')
> > +	    {
> > +	      /* Add scc suffix.  */
> > +	      oappend (ins, scc_suffix[ins->vex.scc]);
> > +
> > +	      /* For SCC insns, the ND bit is required to be set to 0.  */
> > +	      if (ins->vex.nd)
> > +		oappend (ins, "(bad)");
> > +
> > +	      /* These bits have been consumed and should be cleared or restored
> > +		 to default values.  */
> > +	      ins->vex.v = 1;
> > +	      ins->vex.nf = false;
> > +	      ins->vex.mask_register_specifier = 0;
> 
> Unlike here ...
> 
> > @@ -10532,6 +10582,18 @@ putop (instr_info *ins, const char *in_template,
> int sizeflag)
> >  		  evex_printed = true;
> >  		}
> >  	    }
> > +	  else if (l == 1 && last[0] == 'D')
> > +	    {
> > +	      /* Get oszc flags value from register_specifier.  */
> > +	      int oszc_value = ~ins->vex.register_specifier & 0xf;
> > +
> > +	      /* Add {dfv=of, sf, zf, cf} flags.  */
> > +	      oappend (ins, oszc_flags[oszc_value]);
> > +
> > +	      /* These bits have been consumed and should be cleared or restored
> > +		 to default values.  */
> > +	      ins->vex.register_specifier = 0;
> 
> ... it now only "cleared" anymore here.
> 

Done.

> All adjustment requests are largely cosmetic, so with them carried out feel free
> to commit.
> 
Committed.

Thanks,
Lili.



More information about the Binutils mailing list