From 44846f29ab3a5fdab229cb63d9cd42323ed85767 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 1 Jun 2018 08:39:54 +0200 Subject: [PATCH] x86: relax redundant REX prefix check 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 | 8 ++++++++ gas/config/tc-i386.c | 5 +++-- gas/testsuite/gas/i386/ilp32/rex.d | 8 ++++++++ gas/testsuite/gas/i386/rex.d | 8 ++++++++ gas/testsuite/gas/i386/rex.s | 10 ++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index fdf8b2b..67da990 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,13 @@ 2018-06-01 Jan Beulich + * 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 + * config/tc-i386.c (control): Delete. (parse_real_register): Simply check "control" bit. Re-wrap. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 07a4e11..2d20f1c 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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; } diff --git a/gas/testsuite/gas/i386/ilp32/rex.d b/gas/testsuite/gas/i386/ilp32/rex.d index 36241c1..0646ab4 100644 --- a/gas/testsuite/gas/i386/ilp32/rex.d +++ b/gas/testsuite/gas/i386/ilp32/rex.d @@ -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\) diff --git a/gas/testsuite/gas/i386/rex.d b/gas/testsuite/gas/i386/rex.d index 3c52e16..5af478f 100644 --- a/gas/testsuite/gas/i386/rex.d +++ b/gas/testsuite/gas/i386/rex.d @@ -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\) diff --git a/gas/testsuite/gas/i386/rex.s b/gas/testsuite/gas/i386/rex.s index 004b9b8..c1490cc 100644 --- a/gas/testsuite/gas/i386/rex.s +++ b/gas/testsuite/gas/i386/rex.s @@ -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) -- 2.7.4