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.
This commit is contained in:
H.J. Lu 2020-01-22 09:24:14 -08:00
parent 6a462ad49e
commit be4c5e58bd
6 changed files with 35 additions and 30 deletions

View 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> 2020-01-22 Alan Modra <amodra@gmail.com>
* config/tc-ppc.c (parse_tls_arg): Handle tls arg for * config/tc-ppc.c (parse_tls_arg): Handle tls arg for

View File

@ -6672,28 +6672,16 @@ check_long_reg (void)
i.suffix); i.suffix);
return 0; return 0;
} }
/* Warn if the e prefix on a general reg is missing. */ /* Error if the e prefix on a general reg is missing. */
else if ((!quiet_warnings || flag_code == CODE_64BIT) else if (i.types[op].bitfield.word
&& i.types[op].bitfield.word
&& (i.tm.operand_types[op].bitfield.class == Reg && (i.tm.operand_types[op].bitfield.class == Reg
|| i.tm.operand_types[op].bitfield.instance == Accum) || i.tm.operand_types[op].bitfield.instance == Accum)
&& i.tm.operand_types[op].bitfield.dword) && i.tm.operand_types[op].bitfield.dword)
{ {
/* Prohibit these changes in the 64bit mode, since the as_bad (_("incorrect register `%s%s' used with `%c' suffix"),
lowering is more complicated. */ register_prefix, i.op[op].regs->reg_name,
if (flag_code == CODE_64BIT) i.suffix);
{ return 0;
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
} }
/* Warn if the r prefix on a general reg is present. */ /* Warn if the r prefix on a general reg is present. */
else if (i.types[op].bitfield.qword else if (i.types[op].bitfield.qword

View File

@ -9,8 +9,6 @@
.*:25: Warning:.* .*:25: Warning:.*
.*:27: Warning:.* .*:27: Warning:.*
.*:29: Warning:.* .*:29: Warning:.*
.*:39: Warning:.*
.*:41: Warning:.*
.*:48: Warning:.* .*:48: Warning:.*
.*:51: Warning:.* .*:51: Warning:.*
.*:124: Warning:.* .*:124: Warning:.*
@ -30,7 +28,6 @@
.*:142: Warning:.* .*:142: Warning:.*
.*:143: Warning:.* .*:143: Warning:.*
.*:144: Warning:.* .*:144: Warning:.*
.*:178: Warning:.*
.*:224: Warning:.* .*:224: Warning:.*
.*:233: Warning:.* .*:233: Warning:.*
.*:234: Warning:.* .*:234: Warning:.*
@ -84,11 +81,9 @@
36 007e 1F popl %ds 36 007e 1F popl %ds
37 007f 8CD8 mov %ds,%eax 37 007f 8CD8 mov %ds,%eax
38 0081 8CD8 movl %ds,%eax 38 0081 8CD8 movl %ds,%eax
39 0083 8CD8 movl %ds,%ax 39 0083 8CDB movl %ds,%ebx
.*Warning:.*
40 0085 8ED8 mov %eax,%ds 40 0085 8ED8 mov %eax,%ds
41 0087 8ED8 movl %ax,%ds 41 0087 8EDB movl %ebx,%ds
.*Warning:.*
42 0089 8ED8 movl %eax,%ds 42 0089 8ED8 movl %eax,%ds
43 43
44 008b 661E pushw %ds 44 008b 661E pushw %ds
@ -244,8 +239,7 @@
175 01a9 66F7F1 div %cx,%ax 175 01a9 66F7F1 div %cx,%ax
176 01ac F7F1 div %ecx,%eax 176 01ac F7F1 div %ecx,%eax
177 01ae 8EDE mov %si,%ds 177 01ae 8EDE mov %si,%ds
178 01b0 8EDE movl %si,%ds # warning here 178 01b0 8EDF movl %edi,%ds
.*Warning:.*
179 01b2 1E pushl %ds 179 01b2 1E pushl %ds
180 01b3 1E push %ds 180 01b3 1E push %ds
181 01b4 A0000000 00 mov 0,%al 181 01b4 A0000000 00 mov 0,%al

View File

@ -36,9 +36,9 @@
popl %ds popl %ds
mov %ds,%eax mov %ds,%eax
movl %ds,%eax movl %ds,%eax
movl %ds,%ax movl %ds,%ebx
mov %eax,%ds mov %eax,%ds
movl %ax,%ds movl %ebx,%ds
movl %eax,%ds movl %eax,%ds
pushw %ds pushw %ds
@ -175,7 +175,7 @@
div %cx,%ax div %cx,%ax
div %ecx,%eax div %ecx,%eax
mov %si,%ds mov %si,%ds
movl %si,%ds # warning here movl %edi,%ds
pushl %ds pushl %ds
push %ds push %ds
mov 0,%al mov 0,%al

View File

@ -88,6 +88,9 @@
.*:98: Error: .*rol.* .*:98: Error: .*rol.*
.*:99: Error: .*rcl.* .*:99: Error: .*rcl.*
.*:102: Error: .* .*:102: Error: .*
.*:104: Error: .*
.*:105: Error: .*
.*:106: Error: .*
GAS LISTING .* GAS LISTING .*
@ -196,3 +199,7 @@ GAS LISTING .*
[ ]*[1-9][0-9]*[ ]+ [ ]*[1-9][0-9]*[ ]+
[ ]*[1-9][0-9]*[ ]+\.att_syntax prefix [ ]*[1-9][0-9]*[ ]+\.att_syntax prefix
[ ]*[1-9][0-9]*[ ]+movsd \(%esi\), %ss:\(%edi\), %ss:\(%eax\) [ ]*[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

View File

@ -100,3 +100,7 @@ movnti word ptr [eax], ax
.att_syntax prefix .att_syntax prefix
movsd (%esi), %ss:(%edi), %ss:(%eax) movsd (%esi), %ss:(%edi), %ss:(%eax)
movl %ds, %ax
movl %ax, %ds
movl %ax, %bx