[PATCH 05/19] x86: don't disassemble MOVBE with two suffixes
Jan Beulich
jbeulich@suse.com
Mon Jul 13 09:35:13 GMT 2020
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/
2020-07-XX Jan Beulich <jbeulich@suse.com>
* testsuite/gas/i386/movbe-suffix.d,
testsuite/gas/i386/x86-64-movbe-suffix.d: New.
* testsuite/gas/i386/i386.exp: Run new tests.
opcodes/
2020-07-XX Jan Beulich <jbeulich@suse.com>
* i386-dis.c (MOVBE_Fixup): Delete.
(Mv): Define.
(prefix_table): Use Mv for movbe entries.
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -270,6 +270,7 @@ if [expr ([istarget "i*86-*-*"] || [ist
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-*-*"] || [ista
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"
--- /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+ <foo>:
+[ ]*[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
--- /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+ <foo>:
+[ ]*[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
--- 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 *inf
#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[
/* 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 },
},
@@ -16808,44 +16808,6 @@ PCLMUL_Fixup (int bytemode ATTRIBUTE_UNU
}
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)
{
/* Add proper suffix to "movsxd". */
More information about the Binutils
mailing list