From 9ab00b61a9d7d84313b1793255a1bc63b97fd9b7 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 14 Jul 2020 10:26:51 +0200 Subject: [PATCH] x86: don't disassemble MOVBE with two suffixes MOVBE_Fixup() is entirely redundant with the S macro already used on the mnemonics, leading to double suffixes in suffix-always mode. Drop the function. --- gas/ChangeLog | 6 +++ gas/testsuite/gas/i386/i386.exp | 2 + gas/testsuite/gas/i386/movbe-suffix.d | 22 +++++++++ gas/testsuite/gas/i386/x86-64-movbe-suffix.d | 28 ++++++++++++ opcodes/ChangeLog | 6 +++ opcodes/i386-dis.c | 48 ++------------------ 6 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 gas/testsuite/gas/i386/movbe-suffix.d create mode 100644 gas/testsuite/gas/i386/x86-64-movbe-suffix.d diff --git a/gas/ChangeLog b/gas/ChangeLog index 5b44cce9ac1..83f0d8cdfb9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2020-07-14 Jan Beulich + + * testsuite/gas/i386/movbe-suffix.d, + testsuite/gas/i386/x86-64-movbe-suffix.d: New. + * testsuite/gas/i386/i386.exp: Run new tests. + 2020-07-14 Jan Beulich * testsuite/gas/i386/crc32-suffix.d, diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 42d35779c6d..85441770818 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -270,6 +270,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]] run_dump_test "sse-noavx" run_dump_test "movbe" run_dump_test "movbe-intel" + run_dump_test "movbe-suffix" run_list_test "inval-movbe" "-al" run_dump_test "ept" run_dump_test "ept-intel" @@ -876,6 +877,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t run_dump_test "x86-64-sse-noavx" run_dump_test "x86-64-movbe" run_dump_test "x86-64-movbe-intel" + run_dump_test "x86-64-movbe-suffix" run_list_test "x86-64-inval-movbe" "-al" run_dump_test "x86-64-ept" run_dump_test "x86-64-ept-intel" diff --git a/gas/testsuite/gas/i386/movbe-suffix.d b/gas/testsuite/gas/i386/movbe-suffix.d new file mode 100644 index 00000000000..83de18e0905 --- /dev/null +++ b/gas/testsuite/gas/i386/movbe-suffix.d @@ -0,0 +1,22 @@ +#objdump: -dwMsuffix +#name: i386 movbe w/ suffix +#source: movbe.s + +.*: file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+: 66 0f 38 f0 19 movbew \(%ecx\),%bx +[ ]*[a-f0-9]+: 0f 38 f0 19 movbel \(%ecx\),%ebx +[ ]*[a-f0-9]+: 66 0f 38 f1 19 movbew %bx,\(%ecx\) +[ ]*[a-f0-9]+: 0f 38 f1 19 movbel %ebx,\(%ecx\) +[ ]*[a-f0-9]+: 66 0f 38 f0 19 movbew \(%ecx\),%bx +[ ]*[a-f0-9]+: 0f 38 f0 19 movbel \(%ecx\),%ebx +[ ]*[a-f0-9]+: 66 0f 38 f1 19 movbew %bx,\(%ecx\) +[ ]*[a-f0-9]+: 0f 38 f1 19 movbel %ebx,\(%ecx\) +[ ]*[a-f0-9]+: 66 0f 38 f0 19 movbew \(%ecx\),%bx +[ ]*[a-f0-9]+: 0f 38 f0 19 movbel \(%ecx\),%ebx +[ ]*[a-f0-9]+: 66 0f 38 f1 19 movbew %bx,\(%ecx\) +[ ]*[a-f0-9]+: 0f 38 f1 19 movbel %ebx,\(%ecx\) +#pass diff --git a/gas/testsuite/gas/i386/x86-64-movbe-suffix.d b/gas/testsuite/gas/i386/x86-64-movbe-suffix.d new file mode 100644 index 00000000000..f6a98b129ec --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-movbe-suffix.d @@ -0,0 +1,28 @@ +#objdump: -dwMsuffix +#name: x86-64 movbe w/ suffix +#source: x86-64-movbe.s + +.*: file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+: 66 45 0f 38 f0 29 movbew \(%r9\),%r13w +[ ]*[a-f0-9]+: 45 0f 38 f0 29 movbel \(%r9\),%r13d +[ ]*[a-f0-9]+: 4d 0f 38 f0 29 movbeq \(%r9\),%r13 +[ ]*[a-f0-9]+: 66 45 0f 38 f1 29 movbew %r13w,\(%r9\) +[ ]*[a-f0-9]+: 45 0f 38 f1 29 movbel %r13d,\(%r9\) +[ ]*[a-f0-9]+: 4d 0f 38 f1 29 movbeq %r13,\(%r9\) +[ ]*[a-f0-9]+: 66 45 0f 38 f0 29 movbew \(%r9\),%r13w +[ ]*[a-f0-9]+: 45 0f 38 f0 29 movbel \(%r9\),%r13d +[ ]*[a-f0-9]+: 4d 0f 38 f0 29 movbeq \(%r9\),%r13 +[ ]*[a-f0-9]+: 66 45 0f 38 f1 29 movbew %r13w,\(%r9\) +[ ]*[a-f0-9]+: 45 0f 38 f1 29 movbel %r13d,\(%r9\) +[ ]*[a-f0-9]+: 4d 0f 38 f1 29 movbeq %r13,\(%r9\) +[ ]*[a-f0-9]+: 66 0f 38 f0 19 movbew \(%rcx\),%bx +[ ]*[a-f0-9]+: 0f 38 f0 19 movbel \(%rcx\),%ebx +[ ]*[a-f0-9]+: 48 0f 38 f0 19 movbeq \(%rcx\),%rbx +[ ]*[a-f0-9]+: 66 0f 38 f1 19 movbew %bx,\(%rcx\) +[ ]*[a-f0-9]+: 0f 38 f1 19 movbel %ebx,\(%rcx\) +[ ]*[a-f0-9]+: 48 0f 38 f1 19 movbeq %rbx,\(%rcx\) +#pass diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 42a2cc69ea0..0e9e75bd48b 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2020-07-14 Jan Beulich + + * i386-dis.c (MOVBE_Fixup): Delete. + (Mv): Define. + (prefix_table): Use Mv for movbe entries. + 2020-07-14 Jan Beulich * i386-dis.c (CRC32_Fixup): Delete. diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 3199a1740de..aa36ef5c61a 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -118,7 +118,6 @@ static void XMM_Fixup (int, int); static void FXSAVE_Fixup (int, int); static void PCMPESTR_Fixup (int, int); -static void MOVBE_Fixup (int, int); static void MOVSXD_Fixup (int, int); static void OP_Mask (int, int); @@ -266,6 +265,7 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr) #define Mo { OP_M, o_mode } #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */ #define Mq { OP_M, q_mode } +#define Mv { OP_M, v_mode } #define Mv_bnd { OP_M, v_bndmk_mode } #define Mx { OP_M, x_mode } #define Mxmm { OP_M, xmm_mode } @@ -4422,17 +4422,17 @@ static const struct dis386 prefix_table[][4] = { /* PREFIX_0F38F0 */ { - { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE }, + { "movbeS", { Gv, Mv }, PREFIX_OPCODE }, { Bad_Opcode }, - { "movbeS", { Gv, { MOVBE_Fixup, v_mode } }, PREFIX_OPCODE }, + { "movbeS", { Gv, Mv }, PREFIX_OPCODE }, { "crc32A", { Gdq, Eb }, PREFIX_OPCODE }, }, /* PREFIX_0F38F1 */ { - { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE }, + { "movbeS", { Mv, Gv }, PREFIX_OPCODE }, { Bad_Opcode }, - { "movbeS", { { MOVBE_Fixup, v_mode }, Gv }, PREFIX_OPCODE }, + { "movbeS", { Mv, Gv }, PREFIX_OPCODE }, { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE }, }, @@ -16807,44 +16807,6 @@ PCLMUL_Fixup (int bytemode ATTRIBUTE_UNUSED, } } -static void -MOVBE_Fixup (int bytemode, int sizeflag) -{ - /* Add proper suffix to "movbe". */ - char *p = mnemonicendp; - - switch (bytemode) - { - case v_mode: - if (intel_syntax) - goto skip; - - USED_REX (REX_W); - if (sizeflag & SUFFIX_ALWAYS) - { - if (rex & REX_W) - *p++ = 'q'; - else - { - if (sizeflag & DFLAG) - *p++ = 'l'; - else - *p++ = 'w'; - used_prefixes |= (prefixes & PREFIX_DATA); - } - } - break; - default: - oappend (INTERNAL_DISASSEMBLER_ERROR); - break; - } - mnemonicendp = p; - *p = '\0'; - - skip: - OP_M (bytemode, sizeflag); -} - static void MOVSXD_Fixup (int bytemode, int sizeflag) { -- 2.30.2