[PATCH] x86-64/Intel: fix CALL/JMP with dword operand
Jan Beulich
jbeulich@suse.com
Wed Nov 27 10:35:00 GMT 2019
More information about the Binutils mailing list
Wed Nov 27 10:35:00 GMT 2019
- Previous message (by thread): [PATCH] [RISCV] Support subtraction of .uleb128.
- Next message (by thread): [Patch][gas][arm] Set context table for '.arch_extension'
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
While dc2be329b950 ("i386: Only check suffix in instruction mnemonic")
has made the assembler accept these in the first place (they were wrongly
rejected before), the generated code was still wrong in that it lacked
an operand size override. (In 64-bit code, other than in 16- and 32-bit
ones, CALL and JMP with memory operands are all entirely unambiguous: No
operand size can have two meanings.)
gas/
2019-11-XX Jan Beulich <jbeulich@suse.com>
* config/tc-i386-intel.c (i386_intel_operand): Also handle DWORD
with 64-bit mode branches.
* testsuite/gas/i386/x86-64-jump.s: Extend Intel syntax branch
operand coverage.
* testsuite/gas/i386/x86-64-jump.d: Adjust expectations.
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -657,11 +657,12 @@ i386_intel_operand (char *operand_string
&& current_templates->start->name[3] == 0)
|| current_templates->start->base_opcode == 0x62 /* bound */)
suffix = WORD_MNEM_SUFFIX;
- else if (flag_code == CODE_16BIT
+ else if (flag_code != CODE_32BIT
&& (current_templates->start->opcode_modifier.jump == JUMP
|| current_templates->start->opcode_modifier.jump
== JUMP_DWORD))
- suffix = LONG_DOUBLE_MNEM_SUFFIX;
+ suffix = flag_code == CODE_16BIT ? LONG_DOUBLE_MNEM_SUFFIX
+ : WORD_MNEM_SUFFIX;
else if (got_a_float == 1) /* "f..." */
suffix = SHORT_MNEM_SUFFIX;
else
--- a/gas/testsuite/gas/i386/x86-64-jump.d
+++ b/gas/testsuite/gas/i386/x86-64-jump.d
@@ -31,14 +31,22 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: e3 00 jrcxz 0x69 68: R_X86_64_PC8 \$\+0x1
[ ]*[a-f0-9]+: 90 nop
[ ]*[a-f0-9]+: 66 ff 13 callw \*\(%rbx\)
+[ ]*[a-f0-9]+: 66 ff 1b lcallw \*\(%rbx\)
+[ ]*[a-f0-9]+: ff 1b lcall \*\(%rbx\)
+[ ]*[a-f0-9]+: ff 13 callq \*\(%rbx\)
+[ ]*[a-f0-9]+: ff 13 callq \*\(%rbx\)
[ ]*[a-f0-9]+: ff 1b lcall \*\(%rbx\)
[ ]*[a-f0-9]+: 66 ff 23 jmpw \*\(%rbx\)
+[ ]*[a-f0-9]+: 66 ff 2b ljmpw \*\(%rbx\)
+[ ]*[a-f0-9]+: ff 2b ljmp \*\(%rbx\)
+[ ]*[a-f0-9]+: ff 23 jmpq \*\(%rbx\)
+[ ]*[a-f0-9]+: ff 23 jmpq \*\(%rbx\)
[ ]*[a-f0-9]+: ff 2b ljmp \*\(%rbx\)
-[ ]*[a-f0-9]+: eb 00 jmp 0x76
+[ ]*[a-f0-9]+: eb 00 jmp 0x[0-9a-f]*
[ ]*[a-f0-9]+: 90 nop
-[ ]*[a-f0-9]+: 67 e3 00 jecxz 0x7a
+[ ]*[a-f0-9]+: 67 e3 00 jecxz 0x[0-9a-f]*
[ ]*[a-f0-9]+: 90 nop
-[ ]*[a-f0-9]+: e3 00 jrcxz 0x7d
+[ ]*[a-f0-9]+: e3 00 jrcxz 0x[0-9a-f]*
[ ]*[a-f0-9]+: 90 nop
-[ ]*[a-f0-9]+: eb 00 jmp 0x80
+[ ]*[a-f0-9]+: eb 00 jmp 0x[0-9a-f]*
#pass
--- a/gas/testsuite/gas/i386/x86-64-jump.s
+++ b/gas/testsuite/gas/i386/x86-64-jump.s
@@ -29,9 +29,17 @@
.intel_syntax noprefix
call word ptr [rbx]
+ call dword ptr [rbx]
call fword ptr [rbx]
+ call qword ptr [rbx]
+ call near ptr [rbx]
+ call far ptr [rbx]
jmp word ptr [rbx]
+ jmp dword ptr [rbx]
jmp fword ptr [rbx]
+ jmp qword ptr [rbx]
+ jmp near ptr [rbx]
+ jmp far ptr [rbx]
jmp $+2
nop
jecxz 3+$
- Previous message (by thread): [PATCH] [RISCV] Support subtraction of .uleb128.
- Next message (by thread): [Patch][gas][arm] Set context table for '.arch_extension'
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list