aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-10-05 05:23:29 -0700
committerH.J. Lu <hjl.tools@gmail.com>2020-10-05 05:23:39 -0700
commit0e9f3bf12616b108682bb6f6e2a5ef04df9586a8 (patch)
treefed8d852a0d65cf6b461151725aaa817369d2f8d
parentb58e7f729ebd85ff62a29357a01c15a29d458829 (diff)
downloadfsf-binutils-gdb-0e9f3bf12616b108682bb6f6e2a5ef04df9586a8.zip
fsf-binutils-gdb-0e9f3bf12616b108682bb6f6e2a5ef04df9586a8.tar.gz
fsf-binutils-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.
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/testsuite/gas/i386/x86-64-suffix-intel.d2
-rw-r--r--gas/testsuite/gas/i386/x86-64-suffix.d2
-rw-r--r--gas/testsuite/gas/i386/x86-64-suffix.s2
-rw-r--r--opcodes/ChangeLog7
-rw-r--r--opcodes/i386-dis.c12
6 files changed, 29 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 56796ff..ae5a614 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2020-10-05 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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 <nickc@redhat.com>
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 74c8eaa..55d4a8d 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 d81ac45..5ae1173 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 2261c2c..a226836 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 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';