aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2019-12-04 10:44:27 +0100
committerJan Beulich <jbeulich@suse.com>2019-12-04 10:44:27 +0100
commitd488367a421f4c4fd47d37ae0013318024b1019b (patch)
tree2e7cf0601770ff42699ff8d2fa16afd9f20e217d /gas
parent319ff62c8ab28c846365aef65c137735f8af88cb (diff)
downloadgdb-d488367a421f4c4fd47d37ae0013318024b1019b.zip
gdb-d488367a421f4c4fd47d37ae0013318024b1019b.tar.gz
gdb-d488367a421f4c4fd47d37ae0013318024b1019b.tar.bz2
x86-64/Intel: fix CALL/JMP with dword operand
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.)
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-i386-intel.c5
-rw-r--r--gas/testsuite/gas/i386/x86-64-jump.d16
-rw-r--r--gas/testsuite/gas/i386/x86-64-jump.s8
4 files changed, 31 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index dba3faa..d309806 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,13 @@
2019-12-04 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.
+
+2019-12-04 Jan Beulich <jbeulich@suse.com>
+
* config/tc-i386.c (output_insn): Don't consider Cpu* settings
when setting GNU_PROPERTY_X86_FEATURE_2_MMX.
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index 49f558d..51fa38d 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -657,11 +657,12 @@ i386_intel_operand (char *operand_string, int got_a_float)
&& 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
diff --git a/gas/testsuite/gas/i386/x86-64-jump.d b/gas/testsuite/gas/i386/x86-64-jump.d
index c771e5e..1a1521d 100644
--- 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
diff --git a/gas/testsuite/gas/i386/x86-64-jump.s b/gas/testsuite/gas/i386/x86-64-jump.s
index 96ae66e..104ed53 100644
--- 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+$