diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-10-05 05:23:29 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-10-05 05:23:39 -0700 |
commit | 0e9f3bf12616b108682bb6f6e2a5ef04df9586a8 (patch) | |
tree | fed8d852a0d65cf6b461151725aaa817369d2f8d /opcodes | |
parent | b58e7f729ebd85ff62a29357a01c15a29d458829 (diff) | |
download | gdb-0e9f3bf12616b108682bb6f6e2a5ef04df9586a8.zip gdb-0e9f3bf12616b108682bb6f6e2a5ef04df9586a8.tar.gz gdb-0e9f3bf12616b108682bb6f6e2a5ef04df9586a8.tar.bz2 |
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.
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 7 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 12 |
2 files changed, 15 insertions, 4 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index c57c0b1..f1b4273 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2020-10-05 H.J. Lu <hongjiu.lu@intel.com> + + 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 <przemyslaw.wirkus@arm.com> * aarch64-opc.c: Added ETMv4 system registers TRCACATRn, TRCACVRn, diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 67d5b6a..f4f35bc 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'; |