x86: Always disallow double word suffix with word general register
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 22 Jan 2020 17:24:14 +0000 (09:24 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 22 Jan 2020 17:24:14 +0000 (09:24 -0800)
In 64-bit mode, double word suffix in mnemonic with word general register
is disallowed.  Otherwise, assembler gives a warning:

$ cat /tmp/x.s
movl %ax, %bx
movl %ds, %ax
movl %ax, %cs
$ gcc -c /tmp/x.s
/tmp/x.s: Assembler messages:
/tmp/x.s:1: Error: incorrect register `%bx' used with `l' suffix
/tmp/x.s:2: Error: incorrect register `%ax' used with `l' suffix
/tmp/x.s:3: Error: incorrect register `%ax' used with `l' suffix
$ gcc -c /tmp/x.s -m32
/tmp/x.s: Assembler messages:
/tmp/x.s: Assembler messages:
/tmp/x.s:1: Warning: using `%ebx' instead of `%bx' due to `l' suffix
/tmp/x.s:1: Warning: using `%eax' instead of `%ax' due to `l' suffix
/tmp/x.s:2: Warning: using `%eax' instead of `%ax' due to `l' suffix
/tmp/x.s:3: Warning: using `%eax' instead of `%ax' due to `l' suffix

This patch makes it a hard error in all modes.  Now we get:

$ gcc -c /tmp/x.s -m32
/tmp/x.s: Assembler messages:
/tmp/x.s:1: Error: incorrect register `%bx' used with `l' suffix
/tmp/x.s:2: Error: incorrect register `%ax' used with `l' suffix
/tmp/x.s:3: Error: incorrect register `%ax' used with `l' suffix

PR gas/25438
* config/tc-i386.c (check_long_reg): Always disallow double word
suffix in mnemonic with word general register.
* testsuite/gas/i386/general.s: Replace word general register
with double word general register for movl.
* testsuite/gas/i386/inval.s: Add tests for movl with word general
register.
* testsuite/gas/i386/general.l: Updated.
* testsuite/gas/i386/inval.l: Likewise.

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

index 2d247a101279948a7f2b66bc80085f53460418bf..8a18aa7774dc4214270aa80ad1bb8a9165dcbd68 100644 (file)
@@ -1,3 +1,15 @@
+2020-01-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/25438
+       * config/tc-i386.c (check_long_reg): Always disallow double word
+       suffix in mnemonic with word general register.
+       * testsuite/gas/i386/general.s: Replace word general register
+       with double word general register for movl.
+       * testsuite/gas/i386/inval.s: Add tests for movl with word general
+       register.
+       * testsuite/gas/i386/general.l: Updated.
+       * testsuite/gas/i386/inval.l: Likewise.
+
 2020-01-22  Alan Modra  <amodra@gmail.com>
 
        * config/tc-ppc.c (parse_tls_arg): Handle tls arg for
index 3a2a1b743536db577589e7235d453cb6fb073036..34778ae7605d353769db07a1c73eb8de3824266c 100644 (file)
@@ -6672,28 +6672,16 @@ check_long_reg (void)
                i.suffix);
        return 0;
       }
-    /* Warn if the e prefix on a general reg is missing.  */
-    else if ((!quiet_warnings || flag_code == CODE_64BIT)
-            && i.types[op].bitfield.word
+    /* Error if the e prefix on a general reg is missing.  */
+    else if (i.types[op].bitfield.word
             && (i.tm.operand_types[op].bitfield.class == Reg
                 || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.dword)
       {
-       /* 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_EAX - REGNAM_AX)->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;
       }
     /* Warn if the r prefix on a general reg is present.  */
     else if (i.types[op].bitfield.qword
index acd44403ee48dc4de8a33f83e584fe9db7801527..470527716adca972a0dfb0807d092db39c4f391e 100644 (file)
@@ -9,8 +9,6 @@
 .*:25: Warning:.*
 .*:27: Warning:.*
 .*:29: Warning:.*
-.*:39: Warning:.*
-.*:41: Warning:.*
 .*:48: Warning:.*
 .*:51: Warning:.*
 .*:124: Warning:.*
@@ -30,7 +28,6 @@
 .*:142: Warning:.*
 .*:143: Warning:.*
 .*:144: Warning:.*
-.*:178: Warning:.*
 .*:224: Warning:.*
 .*:233: Warning:.*
 .*:234: Warning:.*
   36 007e 1F                           popl    %ds
   37 007f 8CD8                         mov     %ds,%eax
   38 0081 8CD8                         movl    %ds,%eax
-  39 0083 8CD8                         movl    %ds,%ax
-.*Warning:.*
+  39 0083 8CDB                         movl    %ds,%ebx
   40 0085 8ED8                         mov     %eax,%ds
-  41 0087 8ED8                         movl    %ax,%ds
-.*Warning:.*
+  41 0087 8EDB                         movl    %ebx,%ds
   42 0089 8ED8                         movl    %eax,%ds
   43                           
   44 008b 661E                         pushw   %ds
  175 01a9 66F7F1                       div     %cx,%ax
  176 01ac F7F1                         div     %ecx,%eax
  177 01ae 8EDE                         mov     %si,%ds
- 178 01b0 8EDE                         movl    %si,%ds         # warning here
-.*Warning:.*
+ 178 01b0 8EDF                         movl    %edi,%ds
  179 01b2 1E                           pushl   %ds
  180 01b3 1E                           push    %ds
  181 01b4 A0000000 00                  mov     0,%al
index 39bbfe3e0b57e2072537eddd65ee87ca97739433..77f54ae91ff51ed711a67fd2c60425c3195e1932 100644 (file)
@@ -36,9 +36,9 @@
        popl    %ds
        mov     %ds,%eax
        movl    %ds,%eax
-       movl    %ds,%ax
+       movl    %ds,%ebx
        mov     %eax,%ds
-       movl    %ax,%ds
+       movl    %ebx,%ds
        movl    %eax,%ds
 
        pushw   %ds
        div     %cx,%ax
        div     %ecx,%eax
        mov     %si,%ds
-       movl    %si,%ds         # warning here
+       movl    %edi,%ds
        pushl   %ds
        push    %ds
        mov     0,%al
index 3d52a17d2e57e09606437f20f457296abe70041e..0159e97a3fd4dec7a2b9f095c51ff2acbfb2f012 100644 (file)
@@ -88,6 +88,9 @@
 .*:98: Error: .*rol.*
 .*:99: Error: .*rcl.*
 .*:102: Error: .*
+.*:104: Error: .*
+.*:105: Error: .*
+.*:106: Error: .*
 GAS LISTING .*
 
 
@@ -196,3 +199,7 @@ GAS LISTING .*
 [      ]*[1-9][0-9]*[  ]+
 [      ]*[1-9][0-9]*[  ]+\.att_syntax prefix
 [      ]*[1-9][0-9]*[  ]+movsd \(%esi\), %ss:\(%edi\), %ss:\(%eax\)
+[      ]*[1-9][0-9]*[  ]+
+[      ]*[1-9][0-9]*[  ]+movl  %ds, %ax
+[      ]*[1-9][0-9]*[  ]+movl  %ax, %ds
+[      ]*[1-9][0-9]*[  ]+movl  %ax, %bx
index 47655e545ee54390df500391d08c70845c01f93d..3ff58b34c67c74757fb7e411d6bbedd697f1e895 100644 (file)
@@ -100,3 +100,7 @@ movnti word ptr [eax], ax
 
        .att_syntax prefix
        movsd (%esi), %ss:(%edi), %ss:(%eax)
+
+       movl    %ds, %ax
+       movl    %ax, %ds
+       movl    %ax, %bx