[binutils-gdb] x86/Intel: improve diagnostics
Jan Beulich
jbeulich@sourceware.org
Wed Feb 12 09:59:00 GMT 2020
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5de4d9ef71d5233026d8e9fbd74ec87cca4d220a
commit 5de4d9ef71d5233026d8e9fbd74ec87cca4d220a
Author: Jan Beulich <jbeulich@suse.com>
Date: Wed Feb 12 10:58:42 2020 +0100
x86/Intel: improve diagnostics
The diagnostics issued by check_*_reg() are pretty AT&T-centric. Re-use
logic already used for SIMD memory operand size checking also for ones
where GPRs would alternatively also be allowed. (There's certainly room
for further improvement here.)
Diff:
---
gas/ChangeLog | 6 ++++++
gas/config/tc-i386.c | 9 +++++----
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 6eb7f4f..11b20f7 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-12 Jan Beulich <jbeulich@suse.com>
+
+ * config/tc-i386.c (operand_type_register_match): Also fall
+ through initial two if()-s when the template allows for a GPR
+ operand. Adjust comment.
+
2020-02-11 Jan Beulich <jbeulich@suse.com>
(struct _i386_insn): New field "short_form".
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index fec132a..1cb5a27 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -2248,8 +2248,7 @@ mismatch:
/* If given types g0 and g1 are registers they must be of the same type
unless the expected operand type register overlap is null.
- Memory operand size of certain SIMD instructions is also being checked
- here. */
+ Some Intel syntax memory operand size checking also happens here. */
static INLINE int
operand_type_register_match (i386_operand_type g0,
@@ -2261,14 +2260,16 @@ operand_type_register_match (i386_operand_type g0,
&& g0.bitfield.class != RegSIMD
&& (!operand_type_check (g0, anymem)
|| g0.bitfield.unspecified
- || t0.bitfield.class != RegSIMD))
+ || (t0.bitfield.class != Reg
+ && t0.bitfield.class != RegSIMD)))
return 1;
if (g1.bitfield.class != Reg
&& g1.bitfield.class != RegSIMD
&& (!operand_type_check (g1, anymem)
|| g1.bitfield.unspecified
- || t1.bitfield.class != RegSIMD))
+ || (t1.bitfield.class != Reg
+ && t1.bitfield.class != RegSIMD)))
return 1;
if (g0.bitfield.byte == g1.bitfield.byte
More information about the Binutils-cvs
mailing list