This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] 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.)

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+$


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]