x86-64/Intel: fix CALL/JMP with dword operand

Message ID 84b5d550-f874-379c-a049-d7d2c299ad3a@suse.com
State New
Headers show
Series
  • x86-64/Intel: fix CALL/JMP with dword operand
Related show

Commit Message

Jan Beulich Nov. 27, 2019, 10:35 a.m.
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.

Comments

H.J. Lu Dec. 3, 2019, 5:46 p.m. | #1
On Wed, Nov 27, 2019 at 2:35 AM Jan Beulich <jbeulich@suse.com> wrote:
>

> 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.

>


OK.

Thanks.

-- 
H.J.

Patch

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