diff options
author | Jan Beulich <jbeulich@suse.com> | 2019-12-09 13:31:07 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2019-12-09 13:31:07 +0100 |
commit | 164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde (patch) | |
tree | 571ed2970908cb24c1d784d62fec02de5fc24c10 /gas | |
parent | a8f4f6b9bc2b1273cfa94fc1f21af7bcf13012d5 (diff) | |
download | binutils-gdb-164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde.tar.gz |
x86/Intel: fix "near ptr" / "far ptr" handling
Commit dc2be329b950 ("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).
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-i386-intel.c | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/intelbad.l | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/intelbad.s | 6 |
4 files changed, 24 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 54ede43421b..f198b01a441 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,6 +1,14 @@ 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" attribute suffix instead of suffix uniformly for insns not possibly accepting "tbyte ptr" explicitly. diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index 7d0a5b8d851..8eb587b233e 100644 --- a/gas/config/tc-i386-intel.c +++ b/gas/config/tc-i386-intel.c @@ -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: diff --git a/gas/testsuite/gas/i386/intelbad.l b/gas/testsuite/gas/i386/intelbad.l index 4dc091741f6..20809136fe0 100644 --- a/gas/testsuite/gas/i386/intelbad.l +++ b/gas/testsuite/gas/i386/intelbad.l @@ -157,3 +157,7 @@ .*:176: Warning: .* .*:177: Error: .* .*:178: Error: .* +.*:180: Error: .* +.*:181: Error: .* +.*:183: Error: .* +.*:184: Error: .* diff --git a/gas/testsuite/gas/i386/intelbad.s b/gas/testsuite/gas/i386/intelbad.s index 93e1c44e84b..afbb6035dad 100644 --- a/gas/testsuite/gas/i386/intelbad.s +++ b/gas/testsuite/gas/i386/intelbad.s @@ -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] |