This is the mail archive of the binutils-cvs@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]

[binutils-gdb] i386: Don't add 0x66 prefix to IRET for .code16gcc


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7cb22ff84745da0856bf74578b9bd7dff4379ed5

commit 7cb22ff84745da0856bf74578b9bd7dff4379ed5
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Apr 26 10:19:53 2019 -0700

    i386: Don't add 0x66 prefix to IRET for .code16gcc
    
    The .code16gcc directive supports 16bit mode with 32-bit address.  Since
    IRET (opcode 0xcf) in 16bit mode returns from an interrupt in 16bit mode,
    we shouldn't add 0x66 prefix for IRET.
    
    	PR gas/24485
    	* config/tc-i386.c (process_suffix): Don't add DATA_PREFIX_OPCODE
    	to IRET for .code16gcc.
    	* testsuite/gas/i386/jump16.s: Add IRET tests.
    	* testsuite/gas/i386/jump16.d: Updated.

Diff:
---
 gas/ChangeLog                   | 8 ++++++++
 gas/config/tc-i386.c            | 6 ++++++
 gas/testsuite/gas/i386/jump16.d | 2 ++
 gas/testsuite/gas/i386/jump16.s | 6 ++++++
 4 files changed, 22 insertions(+)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8558ecd..c94ffdd 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2019-04-26  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR gas/24485
+	* config/tc-i386.c (process_suffix): Don't add DATA_PREFIX_OPCODE
+	to IRET for .code16gcc.
+	* testsuite/gas/i386/jump16.s: Add IRET tests.
+	* testsuite/gas/i386/jump16.d: Updated.
+
 2019-04-25  Alexandre Oliva  <aoliva@redhat.com>
 	    Alan Modra  <amodra@gmail.com>
 
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 5eb6c4c..032b1d3 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -6352,7 +6352,13 @@ process_suffix (void)
 	    if (!add_prefix (ADDR_PREFIX_OPCODE))
 	      return 0;
 	}
+      /* stackop_size is set to LONG_MNEM_SUFFIX for the .code16gcc
+	 directive to support 16bit mode with 32-bit address.  Since
+	 IRET (opcode 0xcf) in 16bit mode returns from an interrupt
+	 in 16bit mode, we shouldn't add DATA_PREFIX_OPCODE here.  */
       else if (i.suffix != QWORD_MNEM_SUFFIX
+	       && (stackop_size != LONG_MNEM_SUFFIX
+		   || i.tm.base_opcode != 0xcf)
 	       && !i.tm.opcode_modifier.ignoresize
 	       && !i.tm.opcode_modifier.floatmf
 	       && !i.tm.opcode_modifier.vex
diff --git a/gas/testsuite/gas/i386/jump16.d b/gas/testsuite/gas/i386/jump16.d
index a83bad6..7a1dc76 100644
--- a/gas/testsuite/gas/i386/jump16.d
+++ b/gas/testsuite/gas/i386/jump16.d
@@ -67,4 +67,6 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	ea 10 10 90 90       	ljmp   \$0x9090,\$0x1010
 [ 	]*[a-f0-9]+:	ea 00 00 90 90       	ljmp   \$0x9090,\$0x0	ed: (R_386_)?16	xxx
 [ 	]*[a-f0-9]+:	ea 00 00 90 90       	ljmp   \$0x9090,\$0x0	f2: (R_386_)?16	xxx
+[ 	]*[a-f0-9]+:	cf                   	iret   
+[ 	]*[a-f0-9]+:	cf                   	iret   
 #pass
diff --git a/gas/testsuite/gas/i386/jump16.s b/gas/testsuite/gas/i386/jump16.s
index f8bc0ea..aff5665 100644
--- a/gas/testsuite/gas/i386/jump16.s
+++ b/gas/testsuite/gas/i386/jump16.s
@@ -71,3 +71,9 @@
 	jmp	0x9090:0x1010
 	jmp	0x9090,xxx
 	jmp	0x9090:xxx
+
+.code16gcc
+	iret
+
+.code16
+	iret


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