This is the mail archive of the binutils@sources.redhat.com 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 adjustments


(Resubmission of the previously sent patch with the adjustment to cs/ds
acceptance removed and with lahf/sahf re-eanbled in 64-bit mode.)
The previously sent patch for x86-64 corrections to the opcode table
wasn't
completely applied for some reason. Additionally, I found an
inconsistency
with the other x86-64 patch that I had sent, and there are also a
couple of
additions that should be done. This patch tries to address all of
this.

Built and tested on i686-pc-linux-gnu (including a cross version
targeting
x86_64-unknown-linux-gnu).

Jan

gas/
2004-11-23 Jan Beulich <jbeulich@novell.com>

	* config/tc-i386.c (optimize_imm): Adjust immediates to only
those
	permissible for the selected instruction suffix.
	(process_suffix): For DefaultSize instructions, suppressing the
	guessing of a 'q' suffix if the instruction doesn't support it
is
	pointless, because only an 'l' suffix can be guessed in this
place.

gas/testsuite/
2004-11-23 Jan Beulich <jbeulich@novell.com>
	* gas/i386/x86-64-inval.[sl]: Remove sahf/lahf.

include/opcode/
2004-11-23 Jan Beulich <jbeulich@novell.com>

	* i386.h: CpuNo64 mov can't reasonably have a 'q' suffix. Moves
	to/from test registers are illegal in 64-bit mode. Add missing
	NoRex64 to sidt. fxsave/fxrstor now allow for a 'q' suffix
	(previously one had to explicitly encode a rex64 prefix).
Re-enable
	lahf/sahf in 64-bit mode as at least some Athlon64/Opteron
steppings
	support it there. Add cmpxchg16b as per Intel's 64-bit
documentation.

---
/home/jbeulich/src/binutils/mainline/2004-11-23.09.00/gas/config/tc-i386.c	2004-11-18
17:19:30.000000000 +0100
+++ 2004-11-23.09.00/gas/config/tc-i386.c	2004-11-23
09:35:34.268721024 +0100
@@ -2362,9 +2362,6 @@ process_suffix (void)
 	   && (i.tm.opcode_modifier & No_sSuf))
     {
       i.suffix = stackop_size;
-      if (i.suffix == QWORD_MNEM_SUFFIX
-	  && (i.tm.opcode_modifier & No_qSuf))
-	i.suffix = LONG_MNEM_SUFFIX;
     }
   else if (intel_syntax
 	   && !i.suffix
@@ -2702,7 +2699,7 @@ finalize_imm ()
   i.types[0] = overlap0;
 
   overlap1 = i.types[1] & i.tm.operand_types[1];
-  if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32S | Imm32))
+  if ((overlap1 & (Imm8 | Imm8S | Imm16 | Imm32S | Imm32 | Imm64))
       && overlap1 != Imm8 && overlap1 != Imm8S
       && overlap1 != Imm16 && overlap1 != Imm32S
       && overlap1 != Imm32 && overlap1 != Imm64)
---
/home/jbeulich/src/binutils/mainline/2004-11-23.09.00/gas/testsuite/gas/i386/x86-64-inval.l	2004-07-23
08:26:32.000000000 +0200
+++
2004-11-23.09.00/gas/testsuite/gas/i386/x86-64-inval.l	2004-11-23
10:15:19.863055560 +0100
@@ -48,8 +48,6 @@
 .*:49: Error: .*
 .*:50: Error: .*
 .*:51: Error: .*
-.*:52: Error: .*
-.*:53: Error: .*
 GAS LISTING .*
 
 
@@ -75,34 +73,32 @@ GAS LISTING .*
   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 [ 	]*lahf		# illegal
-  24 [ 	]*lcalll \$0,\$0	# illegal
-  25 [ 	]*lcallq \$0,\$0	# illegal
-  26 [ 	]*ldsl %eax,\(%rax\) # illegal
-  27 [ 	]*ldsq %rax,\(%rax\) # illegal
-  28 [ 	]*lesl %eax,\(%rax\) # illegal
-  29 [ 	]*lesq %rax,\(%rax\) # illegal
-  30 [ 	]*ljmpl \$0,\$0	# illegal
-  31 [ 	]*ljmpq \$0,\$0	# illegal
-  32 [ 	]*ljmpq \*\(%rax\)	# 64-bit data size not allowed
-  33 [ 	]*loopw foo	# No prefix exists to select CX as a
counter
-  34 [ 	]*loopew foo	# No prefix exists to select CX as a
counter
-  35 [ 	]*loopnew foo	# No prefix exists to select CX as a
counter
-  36 [ 	]*loopnzw foo	# No prefix exists to select CX as a
counter
-  37 [ 	]*loopzw foo	# No prefix exists to select CX as a
counter
-  38 [ 	]*leavel		# can't have 32-bit stack
operands
-  39 [ 	]*pop %ds		# illegal
-  40 [ 	]*pop %es		# illegal
-  41 [ 	]*pop %ss		# illegal
-  42 [ 	]*popa		# illegal
-  43 [ 	]*popl %eax	# can't have 32-bit stack operands
-  44 [ 	]*push %cs	# illegal
-  45 [ 	]*push %ds	# illegal
-  46 [ 	]*push %es	# illegal
-  47 [ 	]*push %ss	# illegal
-  48 [ 	]*pusha		# illegal
-  49 [ 	]*pushl %eax	# can't have 32-bit stack operands
-  50 [ 	]*pushfl		# can't have 32-bit stack
operands
-  51 [ 	]*popfl		# can't have 32-bit stack operands
-  52 [ 	]*retl		# can't have 32-bit stack operands
-  53 [ 	]*sahf		# illegal
+  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
---
/home/jbeulich/src/binutils/mainline/2004-11-23.09.00/gas/testsuite/gas/i386/x86-64-inval.s	2004-07-23
08:26:32.000000000 +0200
+++
2004-11-23.09.00/gas/testsuite/gas/i386/x86-64-inval.s	2004-11-23
10:13:30.000000000 +0100
@@ -20,7 +20,6 @@
 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
-        lahf		# illegal
         lcalll $0,$0	# illegal
         lcallq $0,$0	# illegal
         ldsl %eax,(%rax) # illegal
@@ -50,4 +49,3 @@ foo:	jcxz foo	# No prefix exists to sele
         pushfl		# can't have 32-bit stack operands
 	popfl		# can't have 32-bit stack operands
 	retl		# can't have 32-bit stack operands
-        sahf		# illegal
---
/home/jbeulich/src/binutils/mainline/2004-11-23.09.00/include/opcode/i386.h	2004-11-18
17:05:34.000000000 +0100
+++ 2004-11-23.09.00/include/opcode/i386.h	2004-11-23
09:44:32.268932560 +0100
@@ -85,7 +85,7 @@ static const template i386_optab[] =
 #define MOV_AX_DISP32 0xa0
 /* In the 64bit mode the short form mov immediate is redefined to
have
    64bit displacement value.  */
-{ "mov",   2,	0xa0, X, CpuNo64,bwlq_Suf|D|W,			{
Disp16|Disp32, Acc, 0 } },
+{ "mov",   2,	0xa0, X, CpuNo64,bwl_Suf|D|W,			{
Disp16|Disp32, Acc, 0 } },
 { "mov",   2,	0x88, X, 0,	 bwlq_Suf|D|W|Modrm,		{ Reg,
Reg|AnyMem, 0} },
 /* In the 64bit mode the short form mov immediate is redefined to
have
    64bit displacement value.  */
@@ -109,7 +109,7 @@ static const template i386_optab[] =
 { "mov",   2, 0x0f20, X, Cpu64,	
q_Suf|D|Modrm|IgnoreSize|NoRex64,{ Control, Reg64|InvMem, 0} },
 { "mov",   2, 0x0f21, X, Cpu386|CpuNo64, l_Suf|D|Modrm|IgnoreSize,{
Debug, Reg32|InvMem, 0} },
 { "mov",   2, 0x0f21, X, Cpu64,	
q_Suf|D|Modrm|IgnoreSize|NoRex64,{ Debug, Reg64|InvMem, 0} },
-{ "mov",   2, 0x0f24, X, Cpu386, l_Suf|D|Modrm|IgnoreSize,	{ Test,
Reg32|InvMem, 0} },
+{ "mov",   2, 0x0f24, X, Cpu386|CpuNo64,
l_Suf|D|Modrm|IgnoreSize,	{ Test, Reg32|InvMem, 0} },
 { "movabs",2,	0xa0, X, Cpu64, bwlq_Suf|D|W,			{
Disp64, Acc, 0 } },
 { "movabs",2,	0xb0, X, Cpu64,	q_Suf|W|ShortForm,		{ Imm64,
Reg64, 0 } },
 
@@ -219,8 +219,8 @@ static const template i386_optab[] =
 {"cli",	   0,	0xfa, X, 0,	 NoSuf,			{ 0, 0,
0} },
 {"clts",   0, 0x0f06, X, Cpu286, NoSuf,			{ 0, 0,
0} },
 {"cmc",	   0,	0xf5, X, 0,	 NoSuf,			{ 0, 0,
0} },
-{"lahf",   0,	0x9f, X, CpuNo64,NoSuf,			{ 0, 0, 0} },
-{"sahf",   0,	0x9e, X, CpuNo64,NoSuf,			{ 0, 0, 0} },
+{"lahf",   0,	0x9f, X, 0,	 NoSuf,			{ 0, 0, 0} },
+{"sahf",   0,	0x9e, X, 0,	 NoSuf,			{ 0, 0, 0} },
 {"pushf",  0,	0x9c, X, CpuNo64,wl_Suf|DefaultSize,	{ 0, 0, 0} },
 {"pushf",  0,	0x9c, X, Cpu64,	 wq_Suf|DefaultSize|NoRex64,{ 0, 0, 0}
},
 {"popf",   0,	0x9d, X, CpuNo64,wl_Suf|DefaultSize,	{ 0, 0, 0} },
@@ -578,7 +578,7 @@ static const template i386_optab[] =
 {"sgdt",   1, 0x0f01, 0, Cpu286|CpuNo64,
wl_Suf|Modrm,		{ WordMem, 0, 0} },
 {"sgdt",   1, 0x0f01, 0, Cpu64, q_Suf|Modrm|NoRex64,		{
LLongMem, 0, 0} },
 {"sidt",   1, 0x0f01, 1, Cpu286|CpuNo64,
wl_Suf|Modrm,		{ WordMem, 0, 0} },
-{"sidt",   1, 0x0f01, 1, Cpu64, q_Suf|Modrm,		{ LLongMem, 0,
0} },
+{"sidt",   1, 0x0f01, 1, Cpu64, q_Suf|Modrm|NoRex64,		{
LLongMem, 0, 0} },
 {"sldt",   1, 0x0f00, 0, Cpu286, wlq_Suf|Modrm,		{
WordReg|InvMem, 0, 0} },
 {"sldt",   1, 0x0f00, 0, Cpu286, w_Suf|Modrm|IgnoreSize,{ ShortMem, 0,
0} },
 {"smsw",   1, 0x0f01, 4, Cpu286, wlq_Suf|Modrm,		{
WordReg|InvMem, 0, 0} },
@@ -912,8 +912,8 @@ static const template i386_optab[] =
 /* Pentium II/Pentium Pro extensions.  */
 {"sysenter",0, 0x0f34, X, Cpu686, NoSuf,		{ 0, 0, 0} },
 {"sysexit", 0, 0x0f35, X, Cpu686, NoSuf,		{ 0, 0, 0} },
-{"fxsave",  1, 0x0fae, 0, Cpu686, FP|Modrm,		{ LLongMem, 0,
0} },
-{"fxrstor", 1, 0x0fae, 1, Cpu686, FP|Modrm,		{ LLongMem, 0,
0} },
+{"fxsave",  1, 0x0fae, 0, Cpu686, q_Suf|Modrm,		{
LLongMem, 0, 0} },
+{"fxrstor", 1, 0x0fae, 1, Cpu686, q_Suf|Modrm,		{
LLongMem, 0, 0} },
 {"rdpmc",   0, 0x0f33, X, Cpu686, NoSuf,		{ 0, 0, 0} },
 /* official undefined instr. */
 {"ud2",	    0, 0x0f0b, X, Cpu686, NoSuf,		{ 0, 0,
0} },
@@ -1316,6 +1316,7 @@ static const template i386_optab[] =
 
 {"addsubpd",  2, 0x660fd0,  X, CpuPNI,
NoSuf|IgnoreSize|Modrm,	{ RegXMM|LLongMem, RegXMM, 0 } },
 {"addsubps",  2, 0xf20fd0,  X, CpuPNI,
NoSuf|IgnoreSize|Modrm,	{ RegXMM|LLongMem, RegXMM, 0 } },
+{"cmpxchg16b",1, 0x0fc7,    1, CpuPNI|Cpu64, NoSuf|Modrm|Rex64, {
LLongMem, 0, 0} },
 {"fisttp",    1, 0xdf,      1, CpuPNI, sl_FP|Modrm,	{
ShortMem|LongMem, 0, 0} },
 {"fisttp",    1, 0xdd,      1, CpuPNI, q_FP|Modrm,	{ LLongMem, 0,
0} },
 {"fisttpll",  1, 0xdd,      1, CpuPNI, FP|Modrm,	{ LLongMem, 0,
0} },

Attachment: binutils-mainline-x86_64.patch
Description: Binary data


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