[PATCH 2/4] x86/APX: respect {vex}/{vex3}

Jan Beulich jbeulich@suse.com
Mon Feb 19 08:00:55 GMT 2024


On 18.02.2024 08:55, Cui, Lili wrote:
>> Even when an EVEX encoding is available, use of such a prefix ought to be
>> respected (resulting in an error) rather than ignored. As requested during
>> review already, introduce a new encoding enumerator to record use of eGPR-
>> s, and update state transitions accordingly.
>>
> 
> Yes, we have such issue for dual VEX/EVEX templates.
> 
>> The optimize_encoding() change also addresses an internal assembler error
>> that was previously raised when respective memory operands used eGPR-s for
>> addressing.
>>
>> While this results in a change of diagnostic issued for VEX-encoded insns, the
>> new one is at least no worse than the prior one.
>> ---
>> Question is whether for the state transitions we want to introduce a couple of
>> helper functions: check_register() has duplicates each of what
>> RC_SAE_specifier() and check_VecOperations() also do.
>>
>> --- a/gas/config/tc-i386.c
>> +++ b/gas/config/tc-i386.c
>> @@ -439,9 +439,6 @@ struct _i386_insn
>>      /* Prefer the REX2 prefix in encoding.  */
>>      bool rex2_encoding;
>>
>> -    /* Need to use an Egpr capable encoding (REX2 or EVEX).  */
>> -    bool has_egpr;
>> -
>>      /* Disable instruction size optimization.  */
>>      bool no_optimize;
>>
>> @@ -451,6 +448,7 @@ struct _i386_insn
>>  	encoding_default = 0,
>>  	encoding_vex,
>>  	encoding_vex3,
>> +	encoding_egpr, /* REX2 or EVEX.  */
> 
> I find it difficult to understand putting egpr here.  Although this area can be further optimized, it is difficult to say that this solution is clearer than the current one.
> 
> 1. We have separated vex/evex and rex/rex2, and put the state containing both rex2 and evex in vex/evex encoding, so that the logic becomes confusing.
> 2. In this enumeration, each enumeration represents an encoding format, and only encoding_egpr describes the register of the operand.

I don't view it like this: This enumerator indicates "need an encoding
which can represent eGPR-s, i.e. REX2 or EVEX". To me encoding_rex2_or_evex
would be pretty clearly worse a name for it.

> 3. encoding_egpr is not the final encoding expression, but an intermediate state that ultimately needs to be converted into other expressions of the same level.

Not much different from encoding_evex512.

> If this patch just wants to report an error to vex prefix, maybe we could handle it like this. Or create a separate branch.
> 
> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -8322,7 +8322,8 @@ VEX_check_encoding (const insn_template *t)
>        return 0;
>      }
> 
> -  if (!t->opcode_modifier.vex)
> +  if (!t->opcode_modifier.vex
> +      || ((i.vec_encoding == vex_encoding_vex) && i.has_egpr))
>      {
>        /* This instruction template doesn't have VEX prefix.  */
>        if (i.vec_encoding != vex_encoding_default)

That's indeed a possibility, I think. Yet already when reviewing the
original work of yours I indicated that I'd like the encoding
restrictions all be represented by a single enum. To me it is more
difficult to follow when there are two separate entities which need
to be consulted in order to reflect all constraints.

>> +.*:211: Error: no VEX/XOP encoding for `and'
>> +.*:212: Error: no VEX/XOP encoding for `and'
>> +.*:213: Error: .* `and'
>> +.*:214: Error: no VEX/XOP encoding for `and'
>> +.*:215: Error: no VEX/XOP encoding for `and'
>> +.*:216: Error: .* `and'
>> +.*:219: Error: .* `andn'

Please pay attention to the gap in line numbers here; that ...

>> --- a/gas/testsuite/gas/i386/x86-64-apx-egpr-inval.s
>> +++ b/gas/testsuite/gas/i386/x86-64-apx-egpr-inval.s
>> @@ -207,3 +207,13 @@
>>  	vtestpd (%r27),%ymm6
>>  	vtestps (%r27),%xmm6
>>  	vtestps (%r27),%ymm6
>> +# {vex}
>> +	{vex} and %eax, %eax
>> +	{vex} and %r8, %r8
>> +	{vex} and %r16, %r16
>> +	{vex} and %eax, %eax, %eax
>> +	{vex} and %r8, %r8, %r8
>> +	{vex} and %r16, %r16, %r16
>> +	{vex} andn %eax, %eax, %eax
>> +	{vex} andn %r8, %r8, %r8
> 
> These two test cases are valid.

... reflects exactly this fact.

Jan


More information about the Binutils mailing list