x86: also disallow non-byte/-word registers with byte/word suffix
authorJan Beulich <jbeulich@suse.com>
Wed, 12 Feb 2020 09:59:32 +0000 (10:59 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 12 Feb 2020 09:59:32 +0000 (10:59 +0100)
Along the lines of be4c5e58bd ("x86: Always disallow double word suffix
with word general register") also adjust check_{byte,word}_reg(), to make
overall behavior consistent again in this regard.

gas/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/general.l
gas/testsuite/gas/i386/general.s
gas/testsuite/gas/i386/intelbad.l
gas/testsuite/gas/i386/inval.l
gas/testsuite/gas/i386/inval.s

index 11b20f787313f124905ba6d195c7a4b268e0e66c..3e08345377b448fa93768e193c1cbd09719bd196 100644 (file)
@@ -1,3 +1,18 @@
+2020-02-12  Jan Beulich  <jbeulich@suse.com>
+
+       PR gas/25438
+       * config/tc-i386.c (REGISTER_WARNINGS): Delete.
+       (check_byte_reg): Skip only source operand of CRC32. Drop Non-
+       64-bit-only warning.
+       (check_word_reg): Consistently error on mismatching register
+       size and suffix.
+       * testsuite/gas/i386/general.s: Replace dword GPR with word one
+       for movw. Replace suffix / GPR for orb.
+       * testsuite/gas/i386/inval.s: Add tests for movw with dword and
+       byte GPRs as well as ones for inb/outb with a word accumulator.
+       * testsuite/gas/i386/general.l, testsuite/gas/i386/intelbad.l,
+       testsuite/gas/i386/inval.l: Adjust expectations.
+
 2020-02-12  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (operand_type_register_match): Also fall
index 1cb5a27ebf257dfcf0c78b4af9c276b5b2c9c8db..314fd7274bf8fb70e55659c3be89cb32a25b3730 100644 (file)
 #endif
 #endif
 
-#ifndef REGISTER_WARNINGS
-#define REGISTER_WARNINGS 1
-#endif
-
 #ifndef INFER_ADDR_PREFIX
 #define INFER_ADDR_PREFIX 1
 #endif
@@ -6638,31 +6634,10 @@ check_byte_reg (void)
          && i.tm.operand_types[op].bitfield.word)
        continue;
 
-      /* crc32 doesn't generate this warning.  */
-      if (i.tm.base_opcode == 0xf20f38f0)
+      /* crc32 only wants its source operand checked here.  */
+      if (i.tm.base_opcode == 0xf20f38f0 && op)
        continue;
 
-      if ((i.types[op].bitfield.word
-          || i.types[op].bitfield.dword
-          || i.types[op].bitfield.qword)
-         && i.op[op].regs->reg_num < 4
-         /* Prohibit these changes in 64bit mode, since the lowering
-            would be more complicated.  */
-         && flag_code != CODE_64BIT)
-       {
-#if REGISTER_WARNINGS
-         if (!quiet_warnings)
-           as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
-                    register_prefix,
-                    (i.op[op].regs + (i.types[op].bitfield.word
-                                      ? REGNAM_AL - REGNAM_AX
-                                      : REGNAM_AL - REGNAM_EAX))->reg_name,
-                    register_prefix,
-                    i.op[op].regs->reg_name,
-                    i.suffix);
-#endif
-         continue;
-       }
       /* Any other register is bad.  */
       if (i.types[op].bitfield.class == Reg
          || i.types[op].bitfield.class == RegMMX
@@ -6818,29 +6793,17 @@ check_word_reg (void)
                i.suffix);
        return 0;
       }
-    /* Warn if the e or r prefix on a general reg is present.  */
-    else if ((!quiet_warnings || flag_code == CODE_64BIT)
-            && (i.types[op].bitfield.dword
+    /* Error if the e or r prefix on a general reg is present.  */
+    else if ((i.types[op].bitfield.dword
                 || i.types[op].bitfield.qword)
             && (i.tm.operand_types[op].bitfield.class == Reg
                 || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.word)
       {
-       /* Prohibit these changes in the 64bit mode, since the
-          lowering is more complicated.  */
-       if (flag_code == CODE_64BIT)
-         {
-           as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
-                   register_prefix, i.op[op].regs->reg_name,
-                   i.suffix);
-           return 0;
-         }
-#if REGISTER_WARNINGS
-       as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"),
-                register_prefix,
-                (i.op[op].regs + REGNAM_AX - REGNAM_EAX)->reg_name,
-                register_prefix, i.op[op].regs->reg_name, i.suffix);
-#endif
+       as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
+               register_prefix, i.op[op].regs->reg_name,
+               i.suffix);
+       return 0;
       }
   return 1;
 }
index 470527716adca972a0dfb0807d092db39c4f391e..79da1acc7a5c26255b02ab85c41cd34217329893 100644 (file)
@@ -9,12 +9,6 @@
 .*:25: Warning:.*
 .*:27: Warning:.*
 .*:29: Warning:.*
-.*:48: Warning:.*
-.*:51: Warning:.*
-.*:124: Warning:.*
-.*:125: Warning:.*
-.*:126: Warning:.*
-.*:127: Warning:.*
 .*:128: Warning:.*
 .*:129: Warning:.*
 .*:130: Warning:.*
   45 008d 661F                         popw    %ds
   46 008f 668CD8                       mov     %ds,%ax
   47 0092 668CD8                       movw    %ds,%ax
-  48 0095 668CD8                       movw    %ds,%eax
-.*Warning:.*
+  48 0095 668CDF                       movw    %ds,%di
   49 0098 8ED8                         mov     %ax,%ds
   50 009a 8ED8                         movw    %ax,%ds
-  51 009c 8ED8                         movw    %eax,%ds
-.*Warning:.*
+  51 009c 8EDF                         movw    %di,%ds
   52                           
   53                           # test various pushes
   54 009e 6A0A                         pushl   \$10
  120 012e 0F9303                       setaeb  \(%ebx\)
  121 0131 0F93C0                       setae   %al
  122                           
- 123                           #these should give warnings
- 124 0134 0C01                         orb     \$1,%ax
-.*Warning:.*
- 125 0136 0C01                         orb     \$1,%eax
-.*Warning:.*
- 126 0138 80CB01                       orb     \$1,%bx
-.*Warning:.*
- 127 013b 80CB01                       orb     \$1,%ebx
-.*Warning:.*
+ 123 0134 0C01                         orb     \$1,%al
+ 124 0136 0D000100 00                  orl     \$0x100,%eax
+ 125 013b 80CB01                       orb     \$1,%bl
+ 126                           
+ 127                           #these should give warnings
  128 013e D9C1                         fldl    %st\(1\)
 .*Warning:.*
  129 0140 DDD2                         fstl    %st\(2\)
index 77f54ae91ff51ed711a67fd2c60425c3195e1932..472924d221ed45d749907b61ce8b2879ad1462a0 100644 (file)
        popw    %ds
        mov     %ds,%ax
        movw    %ds,%ax
-       movw    %ds,%eax
+       movw    %ds,%di
        mov     %ax,%ds
        movw    %ax,%ds
-       movw    %eax,%ds
+       movw    %di,%ds
 
 # test various pushes
        pushl   $10
        setaeb  (%ebx)
        setae   %al
 
+       orb     $1,%al
+       orl     $0x100,%eax
+       orb     $1,%bl
+
 #these should give warnings
-       orb     $1,%ax
-       orb     $1,%eax
-       orb     $1,%bx
-       orb     $1,%ebx
        fldl    %st(1)
        fstl    %st(2)
        fstpl   %st(3)
index 20809136fe02c1ff897b3939619862b119e06046..b872fb5c9ccdc74eecf453f64d43413f26834bf9 100644 (file)
 .*:172: Error: .*
 .*:174: Error: .*
 .*:175: Error: .*
-.*:176: Warning: .*
+.*:176: Error: .*
 .*:177: Error: .*
 .*:178: Error: .*
 .*:180: Error: .*
index 0159e97a3fd4dec7a2b9f095c51ff2acbfb2f012..abe220620b7537769e735d436b5809c6f891e3a7 100644 (file)
 .*:104: Error: .*
 .*:105: Error: .*
 .*:106: Error: .*
+.*:108: Error: .*
+.*:109: Error: .*
+.*:110: Error: .*
+.*:112: Error: .*
+.*:113: Error: .*
+.*:114: Error: .*
 GAS LISTING .*
 
 
@@ -203,3 +209,14 @@ GAS LISTING .*
 [      ]*[1-9][0-9]*[  ]+movl  %ds, %ax
 [      ]*[1-9][0-9]*[  ]+movl  %ax, %ds
 [      ]*[1-9][0-9]*[  ]+movl  %ax, %bx
+[      ]*[1-9][0-9]*[  ]+
+[      ]*[1-9][0-9]*[  ]+movw  %ds, %eax
+[      ]*[1-9][0-9]*[  ]+movw  %eax, %ds
+[      ]*[1-9][0-9]*[  ]+movw  %eax, %ebx
+[      ]*[1-9][0-9]*[  ]+
+[      ]*[1-9][0-9]*[  ]+inb   %dx, %ax
+[      ]*[1-9][0-9]*[  ]+outb  %ax, %dx
+[      ]*[1-9][0-9]*[  ]+movb  %ax, %bx
+\fGAS LISTING .*
+
+
index 3ff58b34c67c74757fb7e411d6bbedd697f1e895..7adfec64600a453430c2883e1115fec13e386426 100644 (file)
@@ -104,3 +104,11 @@ movnti word ptr [eax], ax
        movl    %ds, %ax
        movl    %ax, %ds
        movl    %ax, %bx
+
+       movw    %ds, %eax
+       movw    %eax, %ds
+       movw    %eax, %ebx
+
+       inb     %dx, %ax
+       outb    %ax, %dx
+       movb    %ax, %bx