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]

Re: [PATCH] x86/Intel: fix indirect far jmp/call with operand size specified


On Fri, Feb 22, 2008 at 08:41:54AM -0800, H.J. Lu wrote:
> On Fri, Feb 22, 2008 at 8:31 AM, Jan Beulich <jbeulich@novell.com> wrote:
> > >> Distilled version (from memory):
> >  >>
> >  >>      .intel_syntax noprefix
> >  >>      .code16
> >  >> start:
> >  >>      call    word ptr [bx]
> >  >>      call    dword ptr [bx]
> >  >>      call    fword ptr [bx]
> >  >>      jmp     word ptr [bx]
> >  >>      jmp     dword ptr [bx]
> >  >>      jmp     fword ptr [bx]
> >  >>
> >  >
> >  >It works with the current binutils.
> >
> >  Of course, since I committed the fix (being an Intel syntax thing, I didn't
> >  need your approval).
> >
> 
> That is exactly why I'd like to see testcases. I will see what I can do.
> 

I am checking in this patch to add a few testcases. It also disallows
16-bit near indirect branches for x86-64.


H.J.
----
gas/testsuite/

2008-02-23  H.J. Lu  <hongjiu.lu@intel.com>

	* gas/i386/jump.s: Add tests for far branches.
	* gas/i386/jump16.s: Likewise.

	* gas/i386/jump.d: Updated.
	* gas/i386/jump16.d: Likewise.
	* gas/i386/x86-64-inval.l: Likewise.

	* gas/i386/x86-64-inval.s: Add tests for 16-bit near indirect
	branches.

opcodes/

2008-02-23  H.J. Lu  <hongjiu.lu@intel.com>

	* i386-opc.tbl: Disallow 16-bit near indirect branches for
	x86-64.
	* i386-tbl.h: Regenerated.

--- binutils/gas/testsuite/gas/i386/jump.d.branch	2000-04-25 00:19:46.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/jump.d	2008-02-23 08:52:13.000000000 -0800
@@ -5,22 +5,31 @@
 
 Disassembly of section .text:
 
-0+000 <.text>:
-   0:	eb fe [ 	]*jmp    (0x0|0 <.text>)
-   2:	e9 ((fc|f9) ff ff ff|00 00 00 00) [ 	]*jmp    (0x)?(0|3|7)( <.text(\+0x7)?>)?	3: (R_386_PC)?(DISP)?32	xxx
-   7:	ff 25 00 00 00 00 [ 	]*jmp    \*0x0	9: (R_386_)?(dir)?32	xxx
-   d:	ff e7 [ 	]*jmp    \*%edi
-   f:	ff 27 [ 	]*jmp    \*\(%edi\)
-  11:	ff 2c bd 00 00 00 00 [ 	]*ljmp   \*0x0\(,%edi,4\)	14: (R_386_)?(dir)?32	xxx
-  18:	ff 2d 00 00 00 00 [ 	]*ljmp   \*0x0	1a: (R_386_)?(dir)?32	xxx
-  1e:	ea 00 00 00 00 34 12 [ 	]*ljmp   \$0x1234,\$0x0	1f: (R_386_)?(dir)?32	xxx
-  25:	e8 d6 ff ff ff [ 	]*call   (0x0|0 <.text>)
-  2a:	e8 ((fc|d1) ff ff ff|00 00 00 00) [ 	]*call   (0x)?(0|2b|2f)( <.text(\+0x2f)?>)?	2b: (R_386_PC)?(DISP)?32	xxx
-  2f:	ff 15 00 00 00 00 [ 	]*call   \*0x0	31: (R_386_)?(dir)?32	xxx
-  35:	ff d7 [ 	]*call   \*%edi
-  37:	ff 17 [ 	]*call   \*\(%edi\)
-  39:	ff 1c bd 00 00 00 00 [ 	]*lcall  \*0x0\(,%edi,4\)	3c: (R_386_)?(dir)?32	xxx
-  40:	ff 1d 00 00 00 00 [ 	]*lcall  \*0x0	42: (R_386_)?(dir)?32	xxx
-  46:	9a 00 00 00 00 34 12 [ 	]*lcall  \$0x1234,\$0x0	47: (R_386_)?(dir)?32	xxx
-  4d:.*
-.*
+0+ <.text>:
+[ 	]*[a-f0-9]+:	eb fe                	jmp    0x0
+[ 	]*[a-f0-9]+:	e9 fc ff ff ff       	jmp    0x3	3: R_386_PC32	xxx
+[ 	]*[a-f0-9]+:	ff 25 00 00 00 00    	jmp    \*0x0	9: R_386_32	xxx
+[ 	]*[a-f0-9]+:	ff e7                	jmp    \*%edi
+[ 	]*[a-f0-9]+:	ff 27                	jmp    \*\(%edi\)
+[ 	]*[a-f0-9]+:	ff 2c bd 00 00 00 00 	ljmp   \*0x0\(,%edi,4\)	14: R_386_32	xxx
+[ 	]*[a-f0-9]+:	66 ff 2c bd 00 00 00 00 	ljmpw  \*0x0\(,%edi,4\)	1c: R_386_32	xxx
+[ 	]*[a-f0-9]+:	ff 2d 00 00 00 00    	ljmp   \*0x0	22: R_386_32	xxx
+[ 	]*[a-f0-9]+:	66 ff 2d 00 00 00 00 	ljmpw  \*0x0	29: R_386_32	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 00 00 34 12 	ljmp   \$0x1234,\$0x0	2e: R_386_32	xxx
+[ 	]*[a-f0-9]+:	e8 c7 ff ff ff       	call   0x0
+[ 	]*[a-f0-9]+:	e8 fc ff ff ff       	call   0x3a	3a: R_386_PC32	xxx
+[ 	]*[a-f0-9]+:	ff 15 00 00 00 00    	call   \*0x0	40: R_386_32	xxx
+[ 	]*[a-f0-9]+:	ff d7                	call   \*%edi
+[ 	]*[a-f0-9]+:	ff 17                	call   \*\(%edi\)
+[ 	]*[a-f0-9]+:	ff 1c bd 00 00 00 00 	lcall  \*0x0\(,%edi,4\)	4b: R_386_32	xxx
+[ 	]*[a-f0-9]+:	66 ff 1c bd 00 00 00 00 	lcallw \*0x0\(,%edi,4\)	53: R_386_32	xxx
+[ 	]*[a-f0-9]+:	ff 1d 00 00 00 00    	lcall  \*0x0	59: R_386_32	xxx
+[ 	]*[a-f0-9]+:	66 ff 1d 00 00 00 00 	lcallw \*0x0	60: R_386_32	xxx
+[ 	]*[a-f0-9]+:	9a 00 00 00 00 34 12 	lcall  \$0x1234,\$0x0	65: R_386_32	xxx
+[ 	]*[a-f0-9]+:	66 ff 13             	callw  \*\(%ebx\)
+[ 	]*[a-f0-9]+:	ff 13                	call   \*\(%ebx\)
+[ 	]*[a-f0-9]+:	ff 1b                	lcall  \*\(%ebx\)
+[ 	]*[a-f0-9]+:	66 ff 23             	jmpw   \*\(%ebx\)
+[ 	]*[a-f0-9]+:	ff 23                	jmp    \*\(%ebx\)
+[ 	]*[a-f0-9]+:	ff 2b                	ljmp   \*\(%ebx\)
+#pass
--- binutils/gas/testsuite/gas/i386/jump.s.branch	2000-01-21 02:18:33.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/jump.s	2008-02-23 08:49:35.000000000 -0800
@@ -8,7 +8,9 @@
 	jmp	*%edi
 	jmp	*(%edi)
 	ljmp	*xxx(,%edi,4)
+	ljmpw	*xxx(,%edi,4)
 	ljmp	*xxx
+	ljmpw	*xxx
 	ljmp	$0x1234,$xxx
 
 	call	1b
@@ -17,8 +19,15 @@
 	call	*%edi
 	call	*(%edi)
 	lcall	*xxx(,%edi,4)
+	lcallw	*xxx(,%edi,4)
 	lcall	*xxx
+	lcallw	*xxx
 	lcall	$0x1234,$xxx
 
-	# Force a good alignment.
-	.p2align	4,0
+	.intel_syntax noprefix
+	call	word ptr [ebx]
+	call	dword ptr [ebx]
+	call	fword ptr [ebx]
+	jmp	word ptr [ebx]
+	jmp	dword ptr [ebx]
+	jmp	fword ptr [ebx]
--- binutils/gas/testsuite/gas/i386/jump16.d.branch	2007-04-26 22:54:10.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/jump16.d	2008-02-23 09:19:01.000000000 -0800
@@ -5,36 +5,46 @@
 
 Disassembly of section .text:
 
-0+000 <.text>:
-   0:	eb fe [ 	]*jmp    (0x0|0 <.text>)
-   2:	e9 (fe|fb) ff [ 	]*jmp    (0x3|0x0|0 <.text>)	3: (R_386_PC)?(DISP)?16	xxx
-   5:	ff 26 00 00 [ 	]*jmp    \*0x0	7: (R_386_)?(dir)?16	xxx
-   9:	66 ff e7 [ 	]*jmpl   \*%edi
-   c:	67 ff 27 [ 	]*addr32 jmp \*\(%edi\)
-   f:	67 ff af 00 00 00 00 [ 	]*addr32 ljmp \*0x0\(%edi\)	12: (R_386_)?(dir)?32	xxx
-  16:	ff 2e 00 00 [ 	]*ljmp   \*0x0	18: (R_386_)?(dir)?16	xxx
-  1a:	ea 00 00 34 12 [ 	]*ljmp   \$0x1234,\$0x0	1b: (R_386_)?(dir)?16	xxx
-  1f:	66 e8 db ff ff ff [ 	]*calll  (0x0|0 <.text>)
-  25:	66 e8 (fc|d5) ff ff ff [ 	]*calll  (0x27|0x0|0 <.text>)	27: (R_386_PC)?(DISP)?32	xxx
-  2b:	66 ff 16 00 00 [ 	]*calll  \*0x0	2e: (R_386_)?(dir)?16	xxx
-  30:	66 ff d7 [ 	]*calll  \*%edi
-  33:	67 66 ff 17 [ 	]*addr32 calll \*\(%edi\)
-  37:	67 66 ff 9f 00 00 00 00 [ 	]*addr32 lcalll \*0x0\(%edi\)	3b: (R_386_)?(dir)?32	xxx
-  3f:	66 ff 1e 00 00 [ 	]*lcalll \*0x0	42: (R_386_)?(dir)?16	xxx
-  44:	66 9a 00 00 00 00 34 12 [ 	]*lcalll \$0x1234,\$0x0	46: (R_386_)?(dir)?32	xxx
-  4c:	eb b2 [ 	]*jmp    (0x0|0 <.text>)
-  4e:	ff 26 00 00 [ 	]*jmp    \*0x0	50: (R_386_)?(dir)?16	xxx
-  52:	ff e7 [ 	]*jmp    \*%di
-  54:	ff 25 [ 	]*jmp    \*\(%di\)
-  56:	ff ad 00 00 [ 	]*ljmp   \*0x0\(%di\)	58: (R_386_)?(dir)?16	xxx
-  5a:	ff 2e 00 00 [ 	]*ljmp   \*0x0	5c: (R_386_)?(dir)?16	xxx
-  5e:	ea 00 00 34 12 [ 	]*ljmp   \$0x1234,\$0x0	5f: (R_386_)?(dir)?16	xxx
-  63:	e8 9a ff [ 	]*call   (0x0|0 <.text>)
-  66:	e8 (fe|97) ff [ 	]*call   (0x67|0x0|0 <.text>)	67: (R_386_PC)?(DISP)?16	xxx
-  69:	ff 16 00 00 [ 	]*call   \*0x0	6b: (R_386_)?(dir)?16	xxx
-  6d:	ff d7 [ 	]*call   \*%di
-  6f:	ff 15 [ 	]*call   \*\(%di\)
-  71:	ff 9d 00 00 [ 	]*lcall  \*0x0\(%di\)	73: (R_386_)?(dir)?16	xxx
-  75:	ff 1e 00 00 [ 	]*lcall  \*0x0	77: (R_386_)?(dir)?16	xxx
-  79:	9a 00 00 34 12 [ 	]*lcall  \$0x1234,\$0x0	7a: (R_386_)?(dir)?16	xxx
-	...
+0+ <.text>:
+[ 	]*[a-f0-9]+:	eb fe                	jmp    0x0
+[ 	]*[a-f0-9]+:	e9 fe ff             	jmp    0x3	3: R_386_PC16	xxx
+[ 	]*[a-f0-9]+:	ff 26 00 00          	jmp    \*0x0	7: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 ff e7             	jmpl   \*%edi
+[ 	]*[a-f0-9]+:	67 ff 27             	addr32 jmp \*\(%edi\)
+[ 	]*[a-f0-9]+:	67 ff af 00 00 00 00 	addr32 ljmp \*0x0\(%edi\)	12: R_386_32	xxx
+[ 	]*[a-f0-9]+:	ff 2e 00 00          	ljmp   \*0x0	18: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 34 12       	ljmp   \$0x1234,\$0x0	1b: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 e8 db ff ff ff    	calll  0x0
+[ 	]*[a-f0-9]+:	66 e8 fc ff ff ff    	calll  0x27	27: R_386_PC32	xxx
+[ 	]*[a-f0-9]+:	66 ff 16 00 00       	calll  \*0x0	2e: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 ff d7             	calll  \*%edi
+[ 	]*[a-f0-9]+:	67 66 ff 17          	addr32 calll \*\(%edi\)
+[ 	]*[a-f0-9]+:	67 66 ff 9f 00 00 00 00 	addr32 lcalll \*0x0\(%edi\)	3b: R_386_32	xxx
+[ 	]*[a-f0-9]+:	66 ff 1e 00 00       	lcalll \*0x0	42: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 9a 00 00 00 00 34 12 	lcalll \$0x1234,\$0x0	46: R_386_32	xxx
+[ 	]*[a-f0-9]+:	eb b2                	jmp    0x0
+[ 	]*[a-f0-9]+:	ff 26 00 00          	jmp    \*0x0	50: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ff e7                	jmp    \*%di
+[ 	]*[a-f0-9]+:	ff 25                	jmp    \*\(%di\)
+[ 	]*[a-f0-9]+:	ff ad 00 00          	ljmp   \*0x0\(%di\)	58: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 ff ad 00 00       	ljmpl  \*0x0\(%di\)	5d: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ff 2e 00 00          	ljmp   \*0x0	61: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 ff 2e 00 00       	ljmpl  \*0x0	66: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 34 12       	ljmp   \$0x1234,\$0x0	69: R_386_16	xxx
+[ 	]*[a-f0-9]+:	e8 90 ff             	call   0x0
+[ 	]*[a-f0-9]+:	e8 fe ff             	call   0x71	71: R_386_PC16	xxx
+[ 	]*[a-f0-9]+:	ff 16 00 00          	call   \*0x0	75: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ff d7                	call   \*%di
+[ 	]*[a-f0-9]+:	ff 15                	call   \*\(%di\)
+[ 	]*[a-f0-9]+:	ff 9d 00 00          	lcall  \*0x0\(%di\)	7d: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 ff 9d 00 00       	lcalll \*0x0\(%di\)	82: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ff 1e 00 00          	lcall  \*0x0	86: R_386_16	xxx
+[ 	]*[a-f0-9]+:	66 ff 1e 00 00       	lcalll \*0x0	8b: R_386_16	xxx
+[ 	]*[a-f0-9]+:	9a 00 00 34 12       	lcall  \$0x1234,\$0x0	8e: R_386_16	xxx
+[ 	]*[a-f0-9]+:	ff 17                	call   \*\(%bx\)
+[ 	]*[a-f0-9]+:	ff 1f                	lcall  \*\(%bx\)
+[ 	]*[a-f0-9]+:	66 ff 1f             	lcalll \*\(%bx\)
+[ 	]*[a-f0-9]+:	ff 27                	jmp    \*\(%bx\)
+[ 	]*[a-f0-9]+:	ff 2f                	ljmp   \*\(%bx\)
+[ 	]*[a-f0-9]+:	66 ff 2f             	ljmpl  \*\(%bx\)
+#pass
--- binutils/gas/testsuite/gas/i386/jump16.s.branch	2000-01-21 02:18:33.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/jump16.s	2008-02-23 09:18:11.000000000 -0800
@@ -27,7 +27,9 @@
 	jmp	*%di
 	jmp	*(%di)
 	ljmp	*xxx(%di)
+	ljmpl	*xxx(%di)
 	ljmp	*xxx
+	ljmpl	*xxx
 	ljmp	$0x1234,$xxx
 
 	call	1b
@@ -36,8 +38,15 @@
 	call	*%di
 	call	*(%di)
 	lcall	*xxx(%di)
+	lcalll	*xxx(%di)
 	lcall	*xxx
+	lcalll	*xxx
 	lcall	$0x1234,$xxx
 
-	# Force a good alignment.
-	.p2align	4,0
+	.intel_syntax noprefix
+	call	word ptr [bx]
+	call	dword ptr [bx]
+	call	fword ptr [bx]
+	jmp	word ptr [bx]
+	jmp	dword ptr [bx]
+	jmp	fword ptr [bx]
--- binutils/gas/testsuite/gas/i386/x86-64-inval.l.branch	2008-01-15 10:51:01.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/x86-64-inval.l	2008-02-23 08:00:33.000000000 -0800
@@ -58,6 +58,8 @@
 .*:59: Error: .*
 .*:60: Error: .*
 .*:61: Error: .*
+.*:62: Error: .*
+.*:63: Error: .*
 .*:64: Error: .*
 .*:65: Error: .*
 .*:66: Error: .*
@@ -69,8 +71,6 @@
 .*:72: Error: .*
 .*:73: Error: .*
 .*:74: Error: .*
-.*:75: Error: .*
-.*:76: Error: .*
 .*:77: Error: .*
 .*:78: Error: .*
 .*:79: Error: .*
@@ -80,6 +80,41 @@
 .*:83: Error: .*
 .*:84: Error: .*
 .*:85: Error: .*
+.*:86: Error: .*
+.*:87: Error: .*
+.*:88: Error: .*
+.*:89: Error: .*
+.*:90: Error: .*
+.*:91: Error: .*
+.*:92: Error: .*
+.*:93: Error: .*
+.*:94: Error: .*
+.*:95: Error: .*
+.*:96: Error: .*
+.*:97: Error: .*
+.*:98: Error: .*
+.*:99: Error: .*
+.*:100: Error: .*
+.*:101: Error: .*
+.*:102: Error: .*
+.*:103: Error: .*
+.*:104: Error: .*
+.*:105: Error: .*
+.*:106: Error: .*
+.*:107: Error: .*
+.*:108: Error: .*
+.*:109: Error: .*
+.*:110: Error: .*
+.*:111: Error: .*
+.*:112: Error: .*
+.*:113: Error: .*
+.*:114: Error: .*
+.*:115: Error: .*
+.*:116: Error: .*
+.*:117: Error: .*
+.*:118: Error: .*
+.*:119: Error: .*
+.*:120: Error: .*
 GAS LISTING .*
 
 
@@ -96,78 +131,116 @@ GAS LISTING .*
 [ 	]*11[ 	]+calll \*\(%eax\)	\# 32-bit data size not allowed
 [ 	]*12[ 	]+calll \*\(%r8\)	\# 32-bit data size not allowed
 [ 	]*13[ 	]+calll \*\(%rax\)	\# 32-bit data size not allowed
-[ 	]*14[ 	]+callq \*\(%ax\)	\# 32-bit data size not allowed
-[ 	]*15[ 	]+callw \*\(%ax\)	\# no 16-bit addressing
-[ 	]*16[ 	]+daa		\# illegal
-[ 	]*17[ 	]+das		\# illegal
-[ 	]*18[ 	]+enterl \$0,\$0	\# can't have 32-bit stack operands
-[ 	]*19[ 	]+into		\# illegal
-[ 	]*20[ 	]+foo:	jcxz foo	\# No prefix exists to select CX as a counter
-[ 	]*21[ 	]+jmpl \*%eax	\# 32-bit data size not allowed
-[ 	]*22[ 	]+jmpl \*\(%rax\)	\# 32-bit data size not allowed
-[ 	]*23[ 	]+lcalll \$0,\$0	\# illegal
-[ 	]*24[ 	]+lcallq \$0,\$0	\# illegal
-[ 	]*25[ 	]+ldsl %eax,\(%rax\) \# illegal
-[ 	]*26[ 	]+ldsq %rax,\(%rax\) \# illegal
-[ 	]*27[ 	]+lesl %eax,\(%rax\) \# illegal
-[ 	]*28[ 	]+lesq %rax,\(%rax\) \# illegal
-[ 	]*29[ 	]+ljmpl \$0,\$0	\# illegal
-[ 	]*30[ 	]+ljmpq \$0,\$0	\# illegal
-[ 	]*31[ 	]+ljmpq \*\(%rax\)	\# 64-bit data size not allowed
-[ 	]*32[ 	]+loopw foo	\# No prefix exists to select CX as a counter
-[ 	]*33[ 	]+loopew foo	\# No prefix exists to select CX as a counter
-[ 	]*34[ 	]+loopnew foo	\# No prefix exists to select CX as a counter
-[ 	]*35[ 	]+loopnzw foo	\# No prefix exists to select CX as a counter
-[ 	]*36[ 	]+loopzw foo	\# No prefix exists to select CX as a counter
-[ 	]*37[ 	]+leavel		\# can't have 32-bit stack operands
-[ 	]*38[ 	]+pop %ds		\# illegal
-[ 	]*39[ 	]+pop %es		\# illegal
-[ 	]*40[ 	]+pop %ss		\# illegal
-[ 	]*41[ 	]+popa		\# illegal
-[ 	]*42[ 	]+popl %eax	\# can't have 32-bit stack operands
-[ 	]*43[ 	]+push %cs	\# illegal
-[ 	]*44[ 	]+push %ds	\# illegal
-[ 	]*45[ 	]+push %es	\# illegal
-[ 	]*46[ 	]+push %ss	\# illegal
-[ 	]*47[ 	]+pusha		\# illegal
-[ 	]*48[ 	]+pushl %eax	\# can't have 32-bit stack operands
-[ 	]*49[ 	]+pushfl		\# can't have 32-bit stack operands
-[ 	]*50[ 	]+popfl		\# can't have 32-bit stack operands
-[ 	]*51[ 	]+retl		\# can't have 32-bit stack operands
-[ 	]*52[ 	]+insertq \$4,\$2,%xmm2,%ebx \# The last operand must be XMM register\.
-[ 	]*53[ 	]+fnstsw %eax
-[ 	]*54[ 	]+fnstsw %al
-[ 	]*55[ 	]+fstsw %eax
-[ 	]*56[ 	]+fstsw %al
-[ 	]*57[ 	]+in \$8,%rax
+[ 	]*14[ 	]+callw \*%ax	\# 16-bit data size not allowed
+[ 	]*15[ 	]+callw \*\(%ax\)	\# 16-bit data size not allowed
+[ 	]*16[ 	]+callw \*\(%eax\)	\# 16-bit data size not allowed
+[ 	]*17[ 	]+callw \*\(%r8\)	\# 16-bit data size not allowed
+[ 	]*18[ 	]+callw \*\(%rax\)	\# 16-bit data size not allowed
+[ 	]*19[ 	]+callq \*\(%ax\)	\# no 16-bit addressing
+[ 	]*20[ 	]+daa		\# illegal
+[ 	]*21[ 	]+das		\# illegal
+[ 	]*22[ 	]+enterl \$0,\$0	\# can't have 32-bit stack operands
+[ 	]*23[ 	]+into		\# illegal
+[ 	]*24[ 	]+foo:	jcxz foo	\# No prefix exists to select CX as a counter
+[ 	]*25[ 	]+jmpl \*%eax	\# 32-bit data size not allowed
+[ 	]*26[ 	]+jmpl \*\(%ax\)	\# 32-bit data size not allowed
+[ 	]*27[ 	]+jmpl \*\(%eax\)	\# 32-bit data size not allowed
+[ 	]*28[ 	]+jmpl \*\(%r8\)	\# 32-bit data size not allowed
+[ 	]*29[ 	]+jmpl \*\(%rax\)	\# 32-bit data size not allowed
+[ 	]*30[ 	]+jmpw \*%ax	\# 16-bit data size not allowed
+[ 	]*31[ 	]+jmpw \*\(%ax\)	\# 16-bit data size not allowed
+[ 	]*32[ 	]+jmpw \*\(%eax\)	\# 16-bit data size not allowed
+[ 	]*33[ 	]+jmpw \*\(%r8\)	\# 16-bit data size not allowed
+[ 	]*34[ 	]+jmpw \*\(%rax\)	\# 16-bit data size not allowed
+[ 	]*35[ 	]+jmpq \*\(%ax\)	\# no 16-bit addressing
+[ 	]*36[ 	]+lcalll \$0,\$0	\# illegal
+[ 	]*37[ 	]+lcallq \$0,\$0	\# illegal
+[ 	]*38[ 	]+ldsl %eax,\(%rax\) \# illegal
+[ 	]*39[ 	]+ldsq %rax,\(%rax\) \# illegal
+[ 	]*40[ 	]+lesl %eax,\(%rax\) \# illegal
+[ 	]*41[ 	]+lesq %rax,\(%rax\) \# illegal
+[ 	]*42[ 	]+ljmpl \$0,\$0	\# illegal
+[ 	]*43[ 	]+ljmpq \$0,\$0	\# illegal
+[ 	]*44[ 	]+ljmpq \*\(%rax\)	\# 64-bit data size not allowed
+[ 	]*45[ 	]+loopw foo	\# No prefix exists to select CX as a counter
+[ 	]*46[ 	]+loopew foo	\# No prefix exists to select CX as a counter
+[ 	]*47[ 	]+loopnew foo	\# No prefix exists to select CX as a counter
+[ 	]*48[ 	]+loopnzw foo	\# No prefix exists to select CX as a counter
+[ 	]*49[ 	]+loopzw foo	\# No prefix exists to select CX as a counter
+[ 	]*50[ 	]+leavel		\# can't have 32-bit stack operands
+[ 	]*51[ 	]+pop %ds		\# illegal
+[ 	]*52[ 	]+pop %es		\# illegal
+[ 	]*53[ 	]+pop %ss		\# illegal
+[ 	]*54[ 	]+popa		\# illegal
+[ 	]*55[ 	]+popl %eax	\# can't have 32-bit stack operands
+[ 	]*56[ 	]+push %cs	\# illegal
+[ 	]*57[ 	]+push %ds	\# illegal
 GAS LISTING .*
 
 
-[ 	]*58[ 	]+out %rax,\$8
-[ 	]*59[ 	]+movzxl \(%rax\),%rax
-[ 	]*60[ 	]+movnti %ax, \(%rax\)
-[ 	]*61[ 	]+movntiw %ax, \(%rax\)
-[ 	]*62[ 	]+
-[ 	]*63[ 	]+\.intel_syntax noprefix
-[ 	]*64[ 	]+cmpxchg16b dword ptr \[rax\] \# Must be oword
-[ 	]*65[ 	]+movq xmm1, XMMWORD PTR \[rsp\]
-[ 	]*66[ 	]+movq xmm1, DWORD PTR \[rsp\]
-[ 	]*67[ 	]+movq xmm1, WORD PTR \[rsp\]
-[ 	]*68[ 	]+movq xmm1, BYTE PTR \[rsp\]
-[ 	]*69[ 	]+movq XMMWORD PTR \[rsp\],xmm1
-[ 	]*70[ 	]+movq DWORD PTR \[rsp\],xmm1
-[ 	]*71[ 	]+movq WORD PTR \[rsp\],xmm1
-[ 	]*72[ 	]+movq BYTE PTR \[rsp\],xmm1
-[ 	]*73[ 	]+fnstsw eax
-[ 	]*74[ 	]+fnstsw al
-[ 	]*75[ 	]+fstsw eax
-[ 	]*76[ 	]+fstsw al
-[ 	]*77[ 	]+in rax,8
-[ 	]*78[ 	]+out 8,rax
-[ 	]*79[ 	]+movsx ax, \[rax\]
-[ 	]*80[ 	]+movsx eax, \[rax\]
-[ 	]*81[ 	]+movsx rax, \[rax\]
-[ 	]*82[ 	]+movzx ax, \[rax\]
-[ 	]*83[ 	]+movzx eax, \[rax\]
-[ 	]*84[ 	]+movzx rax, \[rax\]
-[ 	]*85[ 	]+movnti word ptr \[rax\], ax
+[ 	]*58[ 	]+push %es	\# illegal
+[ 	]*59[ 	]+push %ss	\# illegal
+[ 	]*60[ 	]+pusha		\# illegal
+[ 	]*61[ 	]+pushl %eax	\# can't have 32-bit stack operands
+[ 	]*62[ 	]+pushfl		\# can't have 32-bit stack operands
+[ 	]*63[ 	]+popfl		\# can't have 32-bit stack operands
+[ 	]*64[ 	]+retl		\# can't have 32-bit stack operands
+[ 	]*65[ 	]+insertq \$4,\$2,%xmm2,%ebx \# The last operand must be XMM register\.
+[ 	]*66[ 	]+fnstsw %eax
+[ 	]*67[ 	]+fnstsw %al
+[ 	]*68[ 	]+fstsw %eax
+[ 	]*69[ 	]+fstsw %al
+[ 	]*70[ 	]+in \$8,%rax
+[ 	]*71[ 	]+out %rax,\$8
+[ 	]*72[ 	]+movzxl \(%rax\),%rax
+[ 	]*73[ 	]+movnti %ax, \(%rax\)
+[ 	]*74[ 	]+movntiw %ax, \(%rax\)
+[ 	]*75[ 	]+
+[ 	]*76[ 	]+\.intel_syntax noprefix
+[ 	]*77[ 	]+cmpxchg16b dword ptr \[rax\] \# Must be oword
+[ 	]*78[ 	]+movq xmm1, XMMWORD PTR \[rsp\]
+[ 	]*79[ 	]+movq xmm1, DWORD PTR \[rsp\]
+[ 	]*80[ 	]+movq xmm1, WORD PTR \[rsp\]
+[ 	]*81[ 	]+movq xmm1, BYTE PTR \[rsp\]
+[ 	]*82[ 	]+movq XMMWORD PTR \[rsp\],xmm1
+[ 	]*83[ 	]+movq DWORD PTR \[rsp\],xmm1
+[ 	]*84[ 	]+movq WORD PTR \[rsp\],xmm1
+[ 	]*85[ 	]+movq BYTE PTR \[rsp\],xmm1
+[ 	]*86[ 	]+fnstsw eax
+[ 	]*87[ 	]+fnstsw al
+[ 	]*88[ 	]+fstsw eax
+[ 	]*89[ 	]+fstsw al
+[ 	]*90[ 	]+in rax,8
+[ 	]*91[ 	]+out 8,rax
+[ 	]*92[ 	]+movsx ax, \[rax\]
+[ 	]*93[ 	]+movsx eax, \[rax\]
+[ 	]*94[ 	]+movsx rax, \[rax\]
+[ 	]*95[ 	]+movzx ax, \[rax\]
+[ 	]*96[ 	]+movzx eax, \[rax\]
+[ 	]*97[ 	]+movzx rax, \[rax\]
+[ 	]*98[ 	]+movnti word ptr \[rax\], ax
+[ 	]*99[ 	]+calld eax	\# 32-bit data size not allowed
+[ 	]*100[ 	]+calld \[ax\]	\# 32-bit data size not allowed
+[ 	]*101[ 	]+calld \[eax\]	\# 32-bit data size not allowed
+[ 	]*102[ 	]+calld \[r8\]	\# 32-bit data size not allowed
+[ 	]*103[ 	]+calld \[rax\]	\# 32-bit data size not allowed
+[ 	]*104[ 	]+callw ax	\# 16-bit data size not allowed
+[ 	]*105[ 	]+callw \[ax\]	\# 16-bit data size not allowed
+[ 	]*106[ 	]+callw \[eax\]	\# 16-bit data size not allowed
+[ 	]*107[ 	]+callw \[r8\]	\# 16-bit data size not allowed
+[ 	]*108[ 	]+callw \[rax\]	\# 16-bit data size not allowed
+[ 	]*109[ 	]+callq \[ax\]	\# no 16-bit addressing
+[ 	]*110[ 	]+jmpd eax	\# 32-bit data size not allowed
+[ 	]*111[ 	]+jmpd \[ax\]	\# 32-bit data size not allowed
+[ 	]*112[ 	]+jmpd \[eax\]	\# 32-bit data size not allowed
+[ 	]*113[ 	]+jmpd \[r8\]	\# 32-bit data size not allowed
+[ 	]*114[ 	]+jmpd \[rax\]	\# 32-bit data size not allowed
+GAS LISTING .*
+
+
+[ 	]*115[ 	]+jmpw ax		\# 16-bit data size not allowed
+[ 	]*116[ 	]+jmpw \[ax\]	\# 16-bit data size not allowed
+[ 	]*117[ 	]+jmpw \[eax\]	\# 16-bit data size not allowed
+[ 	]*118[ 	]+jmpw \[r8\]	\# 16-bit data size not allowed
+[ 	]*119[ 	]+jmpw \[rax\]	\# 16-bit data size not allowed
+[ 	]*120[ 	]+jmpq \[ax\]	\# no 16-bit addressing
--- binutils/gas/testsuite/gas/i386/x86-64-inval.s.branch	2008-01-15 10:51:01.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/x86-64-inval.s	2008-02-23 07:58:41.000000000 -0800
@@ -11,15 +11,28 @@
         calll *(%eax)	# 32-bit data size not allowed
         calll *(%r8)	# 32-bit data size not allowed
         calll *(%rax)	# 32-bit data size not allowed
-        callq *(%ax)	# 32-bit data size not allowed
-        callw *(%ax)	# no 16-bit addressing
+	callw *%ax	# 16-bit data size not allowed
+	callw *(%ax)	# 16-bit data size not allowed
+	callw *(%eax)	# 16-bit data size not allowed
+	callw *(%r8)	# 16-bit data size not allowed
+	callw *(%rax)	# 16-bit data size not allowed
+	callq *(%ax)	# no 16-bit addressing
         daa		# illegal
         das		# illegal
         enterl $0,$0	# can't have 32-bit stack operands
         into		# illegal
 foo:	jcxz foo	# No prefix exists to select CX as a counter
 	jmpl *%eax	# 32-bit data size not allowed
-        jmpl *(%rax)	# 32-bit data size not allowed
+	jmpl *(%ax)	# 32-bit data size not allowed
+	jmpl *(%eax)	# 32-bit data size not allowed
+	jmpl *(%r8)	# 32-bit data size not allowed
+	jmpl *(%rax)	# 32-bit data size not allowed
+	jmpw *%ax	# 16-bit data size not allowed
+	jmpw *(%ax)	# 16-bit data size not allowed
+	jmpw *(%eax)	# 16-bit data size not allowed
+	jmpw *(%r8)	# 16-bit data size not allowed
+	jmpw *(%rax)	# 16-bit data size not allowed
+	jmpq *(%ax)	# no 16-bit addressing
         lcalll $0,$0	# illegal
         lcallq $0,$0	# illegal
         ldsl %eax,(%rax) # illegal
@@ -83,3 +96,25 @@ movzx ax, [rax]
 movzx eax, [rax]
 movzx rax, [rax]
 movnti word ptr [rax], ax
+	calld eax	# 32-bit data size not allowed
+	calld [ax]	# 32-bit data size not allowed
+	calld [eax]	# 32-bit data size not allowed
+	calld [r8]	# 32-bit data size not allowed
+	calld [rax]	# 32-bit data size not allowed
+	callw ax	# 16-bit data size not allowed
+	callw [ax]	# 16-bit data size not allowed
+	callw [eax]	# 16-bit data size not allowed
+	callw [r8]	# 16-bit data size not allowed
+	callw [rax]	# 16-bit data size not allowed
+	callq [ax]	# no 16-bit addressing
+	jmpd eax	# 32-bit data size not allowed
+	jmpd [ax]	# 32-bit data size not allowed
+	jmpd [eax]	# 32-bit data size not allowed
+	jmpd [r8]	# 32-bit data size not allowed
+	jmpd [rax]	# 32-bit data size not allowed
+	jmpw ax		# 16-bit data size not allowed
+	jmpw [ax]	# 16-bit data size not allowed
+	jmpw [eax]	# 16-bit data size not allowed
+	jmpw [r8]	# 16-bit data size not allowed
+	jmpw [rax]	# 16-bit data size not allowed
+	jmpq [ax]	# no 16-bit addressing
--- binutils/opcodes/i386-opc.tbl.branch	2008-02-22 06:25:39.000000000 -0800
+++ binutils/opcodes/i386-opc.tbl	2008-02-23 08:55:48.000000000 -0800
@@ -318,7 +318,7 @@ shrd, 2, 0xfad, None, 2, Cpu386, Modrm|N
 call, 1, 0xe8, None, 1, CpuNo64, JumpDword|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Disp16|Disp32 }
 call, 1, 0xe8, None, 1, Cpu64, JumpDword|DefaultSize|No_bSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64, { Disp16|Disp32 }
 call, 1, 0xff, 0x2, 1, CpuNo64, Modrm|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg16|Reg32|Word|Dword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|JumpAbsolute }
-call, 1, 0xff, 0x2, 1, Cpu64, Modrm|DefaultSize|No_bSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64, { Reg16|Reg64|Word|Qword|Unspecified|BaseIndex|Disp8|Disp32|Disp32S|JumpAbsolute }
+call, 1, 0xff, 0x2, 1, Cpu64, Modrm|DefaultSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64, { Reg64|Qword|Unspecified|BaseIndex|Disp8|Disp32|Disp32S|JumpAbsolute }
 // Intel Syntax
 call, 2, 0x9a, None, 1, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
 // Intel Syntax
@@ -328,7 +328,7 @@ lcall, 1, 0xff, 0x3, 1, 0, Modrm|Default
 
 jmp, 1, 0xeb, None, 1, 0, Jump|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Disp8|Disp16|Disp32|Disp32S|Disp64 }
 jmp, 1, 0xff, 0x4, 1, CpuNo64, Modrm|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg16|Reg32|Word|Dword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|JumpAbsolute }
-jmp, 1, 0xff, 0x4, 1, Cpu64, Modrm|No_bSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64, { Reg16|Reg64|Word|Qword|Unspecified|BaseIndex|Disp8|Disp32|Disp32S|JumpAbsolute }
+jmp, 1, 0xff, 0x4, 1, Cpu64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64, { Reg64|Qword|Unspecified|BaseIndex|Disp8|Disp32|Disp32S|JumpAbsolute }
 // Intel Syntax.
 jmp, 2, 0xea, None, 1, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
 // Intel Syntax.
--- binutils/opcodes/i386-tbl.h.branch	2008-02-22 06:25:39.000000000 -0800
+++ binutils/opcodes/i386-tbl.h	2008-02-23 08:56:06.000000000 -0800
@@ -2335,11 +2335,11 @@ const template i386_optab[] =
   { "call", 1, 0xff, 0x2, 1,
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
         0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
-    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
+    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
       0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
       0, 0 },
-    { { { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
-	  0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 
+    { { { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
+	  0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
 	  1, 0, 0 } } } },
   { "call", 2, 0x9a, None, 1,
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
@@ -2404,11 +2404,11 @@ const template i386_optab[] =
   { "jmp", 1, 0xff, 0x4, 1,
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
         0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
-    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 
+    { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 
       0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
       0, 0 },
-    { { { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
-	  0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 
+    { { { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
+	  0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
 	  1, 0, 0 } } } },
   { "jmp", 2, 0xea, None, 1,
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 


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