From 0e9f3bf12616b108682bb6f6e2a5ef04df9586a8 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 5 Oct 2020 05:23:29 -0700 Subject: [PATCH] x86: Clear modrm if not needed The MODRM byte can be checked to display the instruction name only if the MODRM byte needed. Clear modrm if the MODRM byte isn't needed so that modrm field checks in putop like, modrm.mod == N with N != 0, can be done without checking need_modrm. gas/ PR binutils/26705 * testsuite/gas/i386/x86-64-suffix.s: Add "mov %rsp,%rbp" before sysretq. * testsuite/gas/i386/x86-64-suffix-intel.d: Updated. * testsuite/gas/i386/x86-64-suffix.d: Likewise. opcodes/ PR binutils/26705 * i386-dis.c (print_insn): Clear modrm if not needed. (putop): Check need_modrm for modrm.mod != 3. Don't check need_modrm for modrm.mod == 3. --- gas/ChangeLog | 8 ++++++++ gas/testsuite/gas/i386/x86-64-suffix-intel.d | 2 ++ gas/testsuite/gas/i386/x86-64-suffix.d | 2 ++ gas/testsuite/gas/i386/x86-64-suffix.s | 2 ++ opcodes/ChangeLog | 7 +++++++ opcodes/i386-dis.c | 12 ++++++++---- 6 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 56796ff948..ae5a614543 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2020-10-05 H.J. Lu + + PR binutils/26705 + * testsuite/gas/i386/x86-64-suffix.s: Add "mov %rsp,%rbp" before + sysretq. + * testsuite/gas/i386/x86-64-suffix-intel.d: Updated. + * testsuite/gas/i386/x86-64-suffix.d: Likewise. + 2020-10-05 Nick Clifton PR 26253 diff --git a/gas/testsuite/gas/i386/x86-64-suffix-intel.d b/gas/testsuite/gas/i386/x86-64-suffix-intel.d index 74c8eaa474..55d4a8dd1b 100644 --- a/gas/testsuite/gas/i386/x86-64-suffix-intel.d +++ b/gas/testsuite/gas/i386/x86-64-suffix-intel.d @@ -18,11 +18,13 @@ Disassembly of section .text: [ ]*[a-f0-9]+: cf iretd [ ]*[a-f0-9]+: 48 cf iretq [ ]*[a-f0-9]+: 0f 07 sysretd +[ ]*[a-f0-9]+: 48 89 e5 mov rbp,rsp [ ]*[a-f0-9]+: 48 0f 07 sysretq [ ]*[a-f0-9]+: 66 cf iretw [ ]*[a-f0-9]+: cf iretd [ ]*[a-f0-9]+: cf iretd [ ]*[a-f0-9]+: 48 cf iretq [ ]*[a-f0-9]+: 0f 07 sysretd +[ ]*[a-f0-9]+: 48 89 e5 mov rbp,rsp [ ]*[a-f0-9]+: 48 0f 07 sysretq #pass diff --git a/gas/testsuite/gas/i386/x86-64-suffix.d b/gas/testsuite/gas/i386/x86-64-suffix.d index d81ac4526b..5ae11730b6 100644 --- a/gas/testsuite/gas/i386/x86-64-suffix.d +++ b/gas/testsuite/gas/i386/x86-64-suffix.d @@ -17,11 +17,13 @@ Disassembly of section .text: [ ]*[a-f0-9]+: cf iretl [ ]*[a-f0-9]+: 48 cf iretq [ ]*[a-f0-9]+: 0f 07 sysretl +[ ]*[a-f0-9]+: 48 89 e5 movq %rsp,%rbp [ ]*[a-f0-9]+: 48 0f 07 sysretq [ ]*[a-f0-9]+: 66 cf iretw [ ]*[a-f0-9]+: cf iretl [ ]*[a-f0-9]+: cf iretl [ ]*[a-f0-9]+: 48 cf iretq [ ]*[a-f0-9]+: 0f 07 sysretl +[ ]*[a-f0-9]+: 48 89 e5 movq %rsp,%rbp [ ]*[a-f0-9]+: 48 0f 07 sysretq #pass diff --git a/gas/testsuite/gas/i386/x86-64-suffix.s b/gas/testsuite/gas/i386/x86-64-suffix.s index 2261c2c1ae..a226836215 100644 --- a/gas/testsuite/gas/i386/x86-64-suffix.s +++ b/gas/testsuite/gas/i386/x86-64-suffix.s @@ -14,6 +14,7 @@ foo: iretl iretq sysretl + mov %rsp,%rbp sysretq .intel_syntax noprefix @@ -22,4 +23,5 @@ foo: iret iretq sysretd + mov rbp,rsp sysretq diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index c57c0b1e20..f1b427318d 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2020-10-05 H.J. Lu + + PR binutils/26705 + * i386-dis.c (print_insn): Clear modrm if not needed. + (putop): Check need_modrm for modrm.mod != 3. Don't check + need_modrm for modrm.mod == 3. + 2020-09-28 Przemyslaw Wirkus * aarch64-opc.c: Added ETMv4 system registers TRCACATRn, TRCACVRn, diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 67d5b6aaef..f4f35bc8f1 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -9927,7 +9927,7 @@ print_insn (bfd_vma pc, disassemble_info *info) FETCH_DATA (info, codep + 1); threebyte = *codep; dp = &dis386_twobyte[threebyte]; - need_modrm = twobyte_has_modrm[*codep]; + need_modrm = twobyte_has_modrm[threebyte]; codep++; } else @@ -9954,6 +9954,8 @@ print_insn (bfd_vma pc, disassemble_info *info) modrm.reg = (*codep >> 3) & 7; modrm.rm = *codep & 7; } + else + memset (&modrm, 0, sizeof (modrm)); need_vex = 0; memset (&vex, 0, sizeof (vex)); @@ -10644,7 +10646,8 @@ putop (const char *in_template, int sizeflag) case 'A': if (intel_syntax) break; - if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + if ((need_modrm && modrm.mod != 3) + || (sizeflag & SUFFIX_ALWAYS)) *obufp++ = 'b'; break; case 'B': @@ -10796,7 +10799,7 @@ putop (const char *in_template, int sizeflag) case 'P': if (l == 0) { - if (((need_modrm && modrm.mod == 3) || !cond) + if ((modrm.mod == 3 || !cond) && !(sizeflag & SUFFIX_ALWAYS)) break; /* Fall through. */ @@ -10840,7 +10843,8 @@ putop (const char *in_template, int sizeflag) if (intel_syntax && !alt) break; USED_REX (REX_W); - if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS)) + if ((need_modrm && modrm.mod != 3) + || (sizeflag & SUFFIX_ALWAYS)) { if (rex & REX_W) *obufp++ = 'q';