x86: relax redundant REX prefix check
authorJan Beulich <jbeulich@novell.com>
Fri, 1 Jun 2018 06:39:54 +0000 (08:39 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 1 Jun 2018 06:39:54 +0000 (08:39 +0200)
All REX bits can be specified via individual prefixes. Redundancy should
only be reported on a per-bit basis.

Note that I originally had further checks added to the test case,
checking the effect also on PDEP. I had to strip those, because my patch
to correctly handle those
(https://sourceware.org/ml/binutils/2017-02/msg00280.html) was rejected.
I continue to think that there should not be any new prefix introduced
to handle the VEX case - whether the encoding of an insn requires VEX et
al should not be of immediate interest to the programmer.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/ilp32/rex.d
gas/testsuite/gas/i386/rex.d
gas/testsuite/gas/i386/rex.s

index fdf8b2b13ff4dfa2542e30caeced95f485eaa34d..67da9902b64d1f3cd2159a93bbea0872d1010329 100644 (file)
@@ -1,3 +1,11 @@
+2018-06-01  Jan Beulich  <jbeulich@suse.com>
+
+       * config/tc-i386.c (add_prefix): Check REX bits individually.
+       * testsuite/gas/i386/rex.s: Add tests for overriding individual
+       REX bits, including when others are already set.
+       * testsuite/gas/i386/ilp32/rex.d, testsuite/gas/i386/rex.d:
+       Adjust expectations.
+
 2018-06-01  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (control): Delete.
index 07a4e11320a8bc71a21ab6768398cb7f9bd9dd95..2d20f1cae9470f57c5529aa6016373396c79f4be 100644 (file)
@@ -2330,8 +2330,9 @@ add_prefix (unsigned int prefix)
       && flag_code == CODE_64BIT)
     {
       if ((i.prefix[REX_PREFIX] & prefix & REX_W)
-         || ((i.prefix[REX_PREFIX] & (REX_R | REX_X | REX_B))
-             && (prefix & (REX_R | REX_X | REX_B))))
+         || (i.prefix[REX_PREFIX] & prefix & REX_R)
+         || (i.prefix[REX_PREFIX] & prefix & REX_X)
+         || (i.prefix[REX_PREFIX] & prefix & REX_B))
        ret = PREFIX_EXIST;
       q = REX_PREFIX;
     }
index 36241c1d067135abab25e296b6d5ad32378f32e1..0646ab4041ad9302597ba16b72a76c597e6f50f6 100644 (file)
@@ -16,6 +16,14 @@ Disassembly of section .text:
 [       ]*[0-9a-f]+:[   ]+4a 0f ae 04 05 00 00 00 00[   ]+fxsave64[     ]+(0x0)?\(,%r8(,1)?\)
 [       ]*[0-9a-f]+:[   ]+43 0f ae 04 00[       ]+fxsave[       ]+\(%r8,%r8(,1)?\)
 [       ]*[0-9a-f]+:[   ]+4b 0f ae 04 00[       ]+fxsave64[     ]+\(%r8,%r8(,1)?\)
+[       ]*[0-9a-f]+:[   ]+48 03 04 00[  ]+add[  ]+\(%rax,%rax(,1)?\),%rax
+[       ]*[0-9a-f]+:[   ]+44 03 04 00[  ]+add[  ]+\(%rax,%rax(,1)?\),%r8d
+[       ]*[0-9a-f]+:[   ]+41 03 04 00[  ]+add[  ]+\(%r8,%rax(,1)?\),%eax
+[       ]*[0-9a-f]+:[   ]+42 03 04 00[  ]+add[  ]+\(%rax,%r8(,1)?\),%eax
+[       ]*[0-9a-f]+:[   ]+49 03 04 00[  ]+add[  ]+\(%r8,%rax(,1)?\),%rax
+[       ]*[0-9a-f]+:[   ]+46 03 04 00[  ]+add[  ]+\(%rax,%r8(,1)?\),%r8d
+[       ]*[0-9a-f]+:[   ]+45 03 04 00[  ]+add[  ]+\(%r8,%rax(,1)?\),%r8d
+[       ]*[0-9a-f]+:[   ]+4a 03 04 00[  ]+add[  ]+\(%rax,%r8(,1)?\),%rax
 [       ]*[0-9a-f]+:[   ]+41\s+rex\.B
 [       ]*[0-9a-f]+:[   ]+9b dd 30\s+fsave\s+\(%rax\)
 [       ]*[0-9a-f]+:[   ]+9b 41 dd 30\s+fsave\s+\(%r8\)
index 3c52e169da7de03a835fba3348e21bd89facb768..5af478f1d6991e413aad5419daa68a37a59a65d8 100644 (file)
@@ -15,6 +15,14 @@ Disassembly of section .text:
 [       ]*[0-9a-f]+:[   ]+4a 0f ae 04 05 00 00 00 00[   ]+fxsave64[     ]+(0x0)?\(,%r8(,1)?\)
 [       ]*[0-9a-f]+:[   ]+43 0f ae 04 00[       ]+fxsave[       ]+\(%r8,%r8(,1)?\)
 [       ]*[0-9a-f]+:[   ]+4b 0f ae 04 00[       ]+fxsave64[     ]+\(%r8,%r8(,1)?\)
+[       ]*[0-9a-f]+:[   ]+48 03 04 00[  ]+add[  ]+\(%rax,%rax(,1)?\),%rax
+[       ]*[0-9a-f]+:[   ]+44 03 04 00[  ]+add[  ]+\(%rax,%rax(,1)?\),%r8d
+[       ]*[0-9a-f]+:[   ]+41 03 04 00[  ]+add[  ]+\(%r8,%rax(,1)?\),%eax
+[       ]*[0-9a-f]+:[   ]+42 03 04 00[  ]+add[  ]+\(%rax,%r8(,1)?\),%eax
+[       ]*[0-9a-f]+:[   ]+49 03 04 00[  ]+add[  ]+\(%r8,%rax(,1)?\),%rax
+[       ]*[0-9a-f]+:[   ]+46 03 04 00[  ]+add[  ]+\(%rax,%r8(,1)?\),%r8d
+[       ]*[0-9a-f]+:[   ]+45 03 04 00[  ]+add[  ]+\(%r8,%rax(,1)?\),%r8d
+[       ]*[0-9a-f]+:[   ]+4a 03 04 00[  ]+add[  ]+\(%rax,%r8(,1)?\),%rax
 [       ]*[0-9a-f]+:[   ]+41\s+rex\.B
 [       ]*[0-9a-f]+:[   ]+9b dd 30\s+fsave\s+\(%rax\)
 [       ]*[0-9a-f]+:[   ]+9b 41 dd 30\s+fsave\s+\(%r8\)
index 004b9b85335397de001e71cb953aad279723fd06..c1490ccdeef47ad29b341bf075d9565470bbe763 100644 (file)
@@ -10,6 +10,16 @@ _start:
        rex/fxsave (%r8,%r8)
        rex64/fxsave (%r8,%r8)
 
+       rex.w add       (%rax,%rax), %eax
+       rex.r add       (%rax,%rax), %eax
+       rex.b add       (%rax,%rax), %eax
+       rex.x add       (%rax,%rax), %eax
+
+       rex.w add       (%r8,%rax), %eax
+       rex.r add       (%rax,%r8), %eax
+       rex.b add       (%rax,%rax), %r8d
+       rex.x add       (%rax,%rax), %rax
+
        .byte 0x41,0x9b,0xdd,0x30
        fsave (%r8)