[PATCH 1/2] x86/APX: squash REX prefix when REX2 is being emitted

Cui, Lili lili.cui@intel.com
Wed Oct 9 08:24:29 GMT 2024



> -----Original Message-----
> From: Jan Beulich <jbeulich@suse.com>
> Sent: Tuesday, October 8, 2024 6:26 PM
> To: Binutils <binutils@sourceware.org>
> Cc: Cui, Lili <lili.cui@intel.com>; H.J. Lu <hjl.tools@gmail.com>
> Subject: [PATCH 1/2] x86/APX: squash REX prefix when REX2 is being emitted
> 
> We should not (silently) emit a REX prefix ahead of a REX2-encoded insn;
> such encodings are illegal. Best we can do is fold the REX bits into the
> REX2 prefix, and then zap the REX one from i.prefix[].
> 
> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -4526,7 +4526,8 @@ build_rex2_prefix (void)
>    i.vex.bytes[0] = 0xd5;
>    /* For the W R X B bits, the variables of rex prefix will be reused.  */
>    i.vex.bytes[1] = ((i.tm.opcode_space << 7)
> -		    | (i.rex2 << 4) | i.rex);
> +		    | (i.rex2 << 4)
> +		    | ((i.rex | i.prefix[REX_PREFIX]) & 0xf));
>  }
> 
>  /* Build the EVEX prefix (4-byte) for evex insn @@ -4675,6 +4676,7 @@
> static void establish_rex (void)
>        build_rex2_prefix ();
>        /* The individual REX.RXBW bits got consumed.  */
>        i.rex &= REX_OPCODE;
> +      i.prefix[REX_PREFIX] = 0;
>      }
>    else if (i.rex != 0)
>      add_prefix (REX_OPCODE | i.rex);
> --- a/gas/testsuite/gas/i386/x86-64-apx-rex2.d
> +++ b/gas/testsuite/gas/i386/x86-64-apx-rex2.d
> @@ -80,4 +80,8 @@ Disassembly of section .text:
>  [	 ]*[a-f0-9]+:[	 ]*d5 76 8d 7c 20 01    	lea
> 0x1\(%r16,%r28,1\),%r31d
>  [	 ]*[a-f0-9]+:[	 ]*d5 12 8d 84 04 81 00 00 00 	lea
> 0x81\(%r20,%r8,1\),%eax
>  [	 ]*[a-f0-9]+:[	 ]*d5 57 8d bc 04 81 00 00 00 	lea
> 0x81\(%r28,%r8,1\),%r31d
> +[	 ]*[a-f0-9]+:[	 ]*d5 14 f7 14 24       	\{rex2 0x14\} notl \(%r20\)
> +[	 ]*[a-f0-9]+:[	 ]*d5 12 f7 14 24       	notl   \(%r20,%r12,1\)
> +[	 ]*[a-f0-9]+:[	 ]*d5 11 f7 14 24       	notl   \(%r28\)
> +[	 ]*[a-f0-9]+:[	 ]*d5 18 f7 14 24       	notq   \(%r20\)
>  #pass
> --- a/gas/testsuite/gas/i386/x86-64-apx-rex2.s
> +++ b/gas/testsuite/gas/i386/x86-64-apx-rex2.s
> @@ -83,3 +83,9 @@ _start:
>           leal	1(%r16, %r28), %r31d
>           leal	129(%r20, %r8), %eax
>           leal	129(%r28, %r8), %r31d
> +
> +## explicit REX prefix
> +         rex.r notl (%r20)
> +         rex.x notl (%r20)
> +         rex.b notl (%r20)

First of all, the compiler will not generate such instructions. For hand-written assembly, this usage is very dangerous, as Egpr appears later but the old prefix is ​​still used (Of course, there could be various reasons.), but if this is a bug, or a problem that occurred after introducing Egpr and the assembler changes the register to 28, It is difficult to locate the error in the program. I think it would be better to report an error and ask users to use a sensible rex2 prefix.

Lili.

> +         rex.w not (%r20)



More information about the Binutils mailing list