[binutils-gdb] x86: Always disallow double word suffix with word general register

H.J.Lu hjl@sourceware.org
Wed Jan 22 18:19:00 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=be4c5e58bdc839898739e0332aee84abf6e5299a

commit be4c5e58bdc839898739e0332aee84abf6e5299a
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Wed Jan 22 09:24:14 2020 -0800

    x86: Always disallow double word suffix with word general register
    
    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.

Diff:
---
 gas/ChangeLog                    | 12 ++++++++++++
 gas/config/tc-i386.c             | 24 ++++++------------------
 gas/testsuite/gas/i386/general.l | 12 +++---------
 gas/testsuite/gas/i386/general.s |  6 +++---
 gas/testsuite/gas/i386/inval.l   |  7 +++++++
 gas/testsuite/gas/i386/inval.s   |  4 ++++
 6 files changed, 35 insertions(+), 30 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 2d247a1..8a18aa7 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 3a2a1b7..34778ae 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -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
diff --git a/gas/testsuite/gas/i386/general.l b/gas/testsuite/gas/i386/general.l
index acd4440..4705277 100644
--- a/gas/testsuite/gas/i386/general.l
+++ b/gas/testsuite/gas/i386/general.l
@@ -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:.*
@@ -84,11 +81,9 @@
   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
@@ -244,8 +239,7 @@
  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
diff --git a/gas/testsuite/gas/i386/general.s b/gas/testsuite/gas/i386/general.s
index 39bbfe3..77f54ae 100644
--- a/gas/testsuite/gas/i386/general.s
+++ b/gas/testsuite/gas/i386/general.s
@@ -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
@@ -175,7 +175,7 @@
 	div	%cx,%ax
 	div	%ecx,%eax
 	mov	%si,%ds
-	movl	%si,%ds		# warning here
+	movl	%edi,%ds
 	pushl	%ds
 	push	%ds
 	mov	0,%al
diff --git a/gas/testsuite/gas/i386/inval.l b/gas/testsuite/gas/i386/inval.l
index 3d52a17..0159e97 100644
--- a/gas/testsuite/gas/i386/inval.l
+++ b/gas/testsuite/gas/i386/inval.l
@@ -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
diff --git a/gas/testsuite/gas/i386/inval.s b/gas/testsuite/gas/i386/inval.s
index 47655e5..3ff58b3 100644
--- a/gas/testsuite/gas/i386/inval.s
+++ b/gas/testsuite/gas/i386/inval.s
@@ -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



More information about the Binutils-cvs mailing list