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:
parent
6a462ad49e
commit
be4c5e58bd
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user