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 56796ff9485..ae5a614543f 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 74c8eaa4747..55d4a8dd1b6 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 d81ac4526bf..5ae11730b63 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 2261c2c1aee..a226836215c 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 c57c0b1e209..f1b427318d5 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 67d5b6aaefc..f4f35bc8f1a 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'; -- 2.30.2