x86/Intel: improve diagnostics
authorJan Beulich <jbeulich@suse.com>
Wed, 12 Feb 2020 09:58:42 +0000 (10:58 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 12 Feb 2020 09:58:42 +0000 (10:58 +0100)
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.)

gas/ChangeLog
gas/config/tc-i386.c

index 6eb7f4f94a02b44a527daa0251073404e4ebcd51..11b20f787313f124905ba6d195c7a4b268e0e66c 100644 (file)
@@ -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".
index fec132ab760d430b5512afc726e9988d77c3f622..1cb5a27ebf257dfcf0c78b4af9c276b5b2c9c8db 100644 (file)
@@ -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