x86/Intel: fix "near ptr" / "far ptr" handling

Commit dc2be329b9 ("i386: Only check suffix in instruction mnemonic")
broke rejecting of these for floating point insns. Fix this by setting
the "byte" operand attribute, which will now (again) cause an error.

Furthermore the diagnostic for the "far ptr" case in general and for the
"near ptr" case in the non-float cases became "invalid instruction
suffix" instead of the intended "operand size mismatch". Fix this by
also setting the "tbyte" operand attribute (no insn template accepts
both byte and tbyte operands).
This commit is contained in:
Jan Beulich 2019-12-09 13:31:07 +01:00
parent a8f4f6b9bc
commit 164d49cb1c
4 changed files with 24 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2019-12-09 Jan Beulich <jbeulich@suse.com>
* config/tc-i386-intel.c (i386_intel_operand): Set "byte"
attribute suffix instead of suffix for floating point insns when
handling O_near_ptr / O_far_ptr.
* testsuite/gas/i386/intelbad.s: Add FPU tests.
* testsuite/gas/i386/intelbad.l: Adjust expectations.
2019-12-09 Jan Beulich <jbeulich@suse.com>
* config/tc-i386-intel.c (i386_intel_operand): Set "byte"

View File

@ -718,9 +718,12 @@ i386_intel_operand (char *operand_string, int got_a_float)
case O_near_ptr:
if (current_templates->start->opcode_modifier.jump != JUMP
&& current_templates->start->opcode_modifier.jump != JUMP_DWORD)
suffix = got_a_float /* so it will cause an error */
? BYTE_MNEM_SUFFIX
: LONG_DOUBLE_MNEM_SUFFIX;
{
/* cause an error */
i.types[this_operand].bitfield.byte = 1;
i.types[this_operand].bitfield.tbyte = 1;
suffix = i.suffix;
}
break;
default:

View File

@ -157,3 +157,7 @@
.*:176: Warning: .*
.*:177: Error: .*
.*:178: Error: .*
.*:180: Error: .*
.*:181: Error: .*
.*:183: Error: .*
.*:184: Error: .*

View File

@ -176,3 +176,9 @@ start:
lfs eax, dword ptr [eax]
lgs eax, qword ptr [eax]
lss eax, tbyte ptr [eax]
fld near ptr [ebx]
fst far ptr [ebx]
fild far ptr [ebx]
fist near ptr [ebx]