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: PR gas/1874: mwait/monitor don't work in 64bit


On Wed, Nov 16, 2005 at 09:39:34AM -0800, H. J. Lu wrote:
> On Wed, Nov 16, 2005 at 06:31:27PM +0100, Jan Beulich wrote:
> > >>> "H. J. Lu" <hjl@lucon.org> 16.11.05 18:19:21 >>>
> > >On Wed, Nov 16, 2005 at 06:12:30PM +0100, Jan Beulich wrote:
> > >> >Are you saying "monitor %eax,%ecx,%edx" should be allowed in 64bit
> > >> >mode? Why? How will it be used?
> > >> 
> > >> Just like any other 32-bit addressing in 64-bit mode: probably
> > rarely,
> > >> but it should be allowed for whoever is able to find meaningful use
> > for
> > >> this. We also don't disallow 16-bit addressing in 32-bit mode, even
> > >> though it's unlikely to ever be used...
> > >
> > >I disagree. In 64bit mode, the correct way to use monitor is
> > >
> > >	load %rax
> > >	load %edx
> > >	load %ecx
> > >	monitor %rax, %edx, %ecx # It is the same as "monitor".
> > >
> > >It is misleading and confusing to do
> > >
> > >	load %eax
> > >	load %edx
> > >	load %ecx
> > >	monitor %eax, %edx, %ecx
> > >
> > >Assembler will generate the same opcode for those forms anyway. I
> > don't
> > >see why "monitor %eax, %edx, %ecx" has to be allowed in 64bit.
> > 
> > That's what's wrong - the second form should emit an address size
> > override.
> 
> I am trying to find out if the address size prefix will be ignored or
> not.
> 

Here is the information I got from our chip people. The address size
override prefix is honored for "monitor" in both 16 and 32bit modes.
In 64bit mode, RCX and RDX are used for "monitor", RAX and RCX are
used for "mwait". This patch implements it.


----
gas/testsuite/

2005-11-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/1874
	* gas/i386/i386.exp: Add x86-64-prescott for 64bit.

	* gas/i386/prescott.s: Test address size override for monitor.
	* gas/i386/prescott.d: Updated.

	* gas/i386/x86-64-prescott.d: New file.
	* gas/i386/x86-64-prescott.s: Likewise.

include/opcode/

2005-11-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/1874
	* i386.h (i386_optab): Add 64bit support for monitor and
	mwait. Add address size override support for monitor.

opcodes/

2005-11-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/1874
	* i386-dis.c (PNI_Fixup): Add 64bit and address size override
	support for monitor and mwait.

--- binutils/gas/testsuite/gas/i386/i386.exp.pni	2005-11-11 10:48:53.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/i386.exp	2005-11-15 15:37:50.000000000 -0800
@@ -131,6 +131,7 @@ if [expr ([istarget "i*86-*-*"] || [ista
     run_dump_test "svme64"
     run_dump_test "x86-64-vmx"
     run_dump_test "immed64"
+    run_dump_test "x86-64-prescott"
 
     # For ELF targets verify that @unwind works.
     if { ([istarget "*-*-elf*"] || [istarget "*-*-linux*"]
--- binutils/gas/testsuite/gas/i386/prescott.d.pni	2004-06-23 08:06:57.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/prescott.d	2005-11-16 11:00:18.000000000 -0800
@@ -32,5 +32,6 @@ Disassembly of section .text:
   62:	f3 0f 12 dc [ 	]*movsldup %xmm4,%xmm3
   66:	0f 01 c9 [ 	]*mwait  %eax,%ecx
   69:	0f 01 c9 [ 	]*mwait  %eax,%ecx
-  6c:	00 00 [ 	]*add    %al,\(%eax\)
+  6c:	67 0f 01 c8 [ 	]*addr16 monitor %ax,%ecx,%edx
+  70:	67 0f 01 c8 [ 	]*addr16 monitor %ax,%ecx,%edx
 	...
--- binutils/gas/testsuite/gas/i386/prescott.s.pni	2004-06-23 08:06:58.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/prescott.s	2005-11-16 10:58:30.000000000 -0800
@@ -29,4 +29,7 @@ foo:
 	mwait
 	mwait		%eax,%ecx
 
+	addr16 monitor
+	monitor	%ax,%ecx,%edx
+
 	.p2align	4,0
--- binutils/gas/testsuite/gas/i386/x86-64-prescott.d.pni	2005-11-15 15:33:49.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/x86-64-prescott.d	2005-11-16 17:35:10.000000000 -0800
@@ -0,0 +1,37 @@
+#objdump: -dw
+#name: x86-64 prescott
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+000 <foo>:
+   0:	66 0f d0 01 [ 	]*addsubpd \(%rcx\),%xmm0
+   4:	66 0f d0 ca [ 	]*addsubpd %xmm2,%xmm1
+   8:	f2 0f d0 13 [ 	]*addsubps \(%rbx\),%xmm2
+   c:	f2 0f d0 dc [ 	]*addsubps %xmm4,%xmm3
+  10:	df 88 90 90 90 90 [ 	]*fisttp 0xffffffff90909090\(%rax\)
+  16:	db 88 90 90 90 90 [ 	]*fisttpl 0xffffffff90909090\(%rax\)
+  1c:	dd 88 90 90 90 90 [ 	]*fisttpll 0xffffffff90909090\(%rax\)
+  22:	66 0f 7c 65 00 [ 	]*haddpd 0x0\(%rbp\),%xmm4
+  27:	66 0f 7c ee [ 	]*haddpd %xmm6,%xmm5
+  2b:	f2 0f 7c 37 [ 	]*haddps \(%rdi\),%xmm6
+  2f:	f2 0f 7c f8 [ 	]*haddps %xmm0,%xmm7
+  33:	66 0f 7d c1 [ 	]*hsubpd %xmm1,%xmm0
+  37:	66 0f 7d 0a [ 	]*hsubpd \(%rdx\),%xmm1
+  3b:	f2 0f 7d d2 [ 	]*hsubps %xmm2,%xmm2
+  3f:	f2 0f 7d 1c 24 [ 	]*hsubps \(%rsp\),%xmm3
+  44:	f2 0f f0 2e [ 	]*lddqu  \(%rsi\),%xmm5
+  48:	0f 01 c8 [ 	]*monitor %rax,%rcx,%rdx
+  4b:	0f 01 c8 [ 	]*monitor %rax,%rcx,%rdx
+  4e:	f2 0f 12 f7 [ 	]*movddup %xmm7,%xmm6
+  52:	f2 0f 12 38 [ 	]*movddup \(%rax\),%xmm7
+  56:	f3 0f 16 01 [ 	]*movshdup \(%rcx\),%xmm0
+  5a:	f3 0f 16 ca [ 	]*movshdup %xmm2,%xmm1
+  5e:	f3 0f 12 13 [ 	]*movsldup \(%rbx\),%xmm2
+  62:	f3 0f 12 dc [ 	]*movsldup %xmm4,%xmm3
+  66:	0f 01 c9 [ 	]*mwait  %rax,%rcx
+  69:	0f 01 c9 [ 	]*mwait  %rax,%rcx
+  6c:	67 0f 01 c8 [ 	]*addr32 monitor %eax,%rcx,%rdx
+  70:	67 0f 01 c8 [ 	]*addr32 monitor %eax,%rcx,%rdx
+	...
--- binutils/gas/testsuite/gas/i386/x86-64-prescott.s.pni	2005-11-15 15:33:47.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/x86-64-prescott.s	2005-11-16 17:31:19.000000000 -0800
@@ -0,0 +1,35 @@
+#Prescott New Instructions
+
+	.text
+foo:
+	addsubpd	(%rcx),%xmm0
+	addsubpd	%xmm2,%xmm1
+	addsubps	(%rbx),%xmm2
+	addsubps	%xmm4,%xmm3
+	fisttp		0x90909090(%rax)
+	fisttpl		0x90909090(%rax)
+	fisttpll	0x90909090(%rax)
+	haddpd		0x0(%rbp),%xmm4
+	haddpd		%xmm6,%xmm5
+	haddps		(%rdi),%xmm6
+	haddps		%xmm0,%xmm7
+	hsubpd		%xmm1,%xmm0
+	hsubpd		(%rdx),%xmm1
+	hsubps		%xmm2,%xmm2
+	hsubps		(%rsp,1),%xmm3
+	lddqu		(%rsi),%xmm5
+	monitor
+	monitor		%rax,%rcx,%rdx
+	movddup		%xmm7,%xmm6
+	movddup		(%rax),%xmm7
+	movshdup	(%rcx),%xmm0
+	movshdup	%xmm2,%xmm1
+	movsldup	(%rbx),%xmm2
+	movsldup	%xmm4,%xmm3
+	mwait
+	mwait		%rax,%rcx
+
+	addr32 monitor
+	monitor		%eax,%rcx,%rdx
+
+	.p2align	4,0
--- binutils/include/opcode/i386.h.pni	2005-07-27 08:41:15.000000000 -0700
+++ binutils/include/opcode/i386.h	2005-11-16 17:37:05.000000000 -0800
@@ -1346,14 +1346,22 @@ static const template i386_optab[] =
 {"hsubps",    2, 0xf20f7d,  X, CpuPNI, NoSuf|IgnoreSize|Modrm,	{ RegXMM|LLongMem, RegXMM, 0 } },
 {"lddqu",     2, 0xf20ff0,  X, CpuPNI, NoSuf|IgnoreSize|Modrm,	{ LLongMem, RegXMM, 0 } },
 {"monitor",   0, 0x0f01, 0xc8, CpuPNI, NoSuf|ImmExt,	{ 0, 0, 0} },
+/* Need to ensure only "monitor %ax,%ecx,%edx" is accepted. */
+{"monitor",   3, 0x670f01, 0xc8, CpuPNI|CpuNo64, NoSuf|ImmExt,	{ Reg16, Reg32, Reg32 } },
 /* Need to ensure only "monitor %eax,%ecx,%edx" is accepted. */
-{"monitor",   3, 0x0f01, 0xc8, CpuPNI, NoSuf|ImmExt,	{ Reg32, Reg32, Reg32} },
+{"monitor",   3, 0x0f01, 0xc8, CpuPNI|CpuNo64, NoSuf|ImmExt,	{ Reg32, Reg32, Reg32 } },
+/* Need to ensure only "monitor %eax,%rcx,%rdx" is accepted. */
+{"monitor",   3, 0x670f01, 0xc8, CpuPNI|Cpu64, NoSuf|ImmExt|NoRex64,	{ Reg32, Reg64, Reg64 } },
+/* Need to ensure only "monitor %rax,%rcx,%rdx" is accepted. */
+{"monitor",   3, 0x0f01, 0xc8, CpuPNI|Cpu64, NoSuf|ImmExt|NoRex64,	{ Reg64, Reg64, Reg64 } },
 {"movddup",   2, 0xf20f12,  X, CpuPNI, NoSuf|IgnoreSize|Modrm,	{ RegXMM|LLongMem, RegXMM, 0 } },
 {"movshdup",  2, 0xf30f16,  X, CpuPNI, NoSuf|IgnoreSize|Modrm,	{ RegXMM|LLongMem, RegXMM, 0 } },
 {"movsldup",  2, 0xf30f12,  X, CpuPNI, NoSuf|IgnoreSize|Modrm,	{ RegXMM|LLongMem, RegXMM, 0 } },
 {"mwait",     0, 0x0f01, 0xc9, CpuPNI, NoSuf|ImmExt,	{ 0, 0, 0} },
 /* Need to ensure only "mwait %eax,%ecx" is accepted.  */
-{"mwait",     2, 0x0f01, 0xc9, CpuPNI, NoSuf|ImmExt,	{ Reg32, Reg32, 0} },
+{"mwait",     2, 0x0f01, 0xc9, CpuPNI|CpuNo64, NoSuf|ImmExt,	{ Reg32, Reg32, 0} },
+/* Need to ensure only "mwait %rax,%rcx" is accepted.  */
+{"mwait",     2, 0x0f01, 0xc9, CpuPNI|Cpu64, NoSuf|ImmExt|NoRex64,	{ Reg64, Reg64, 0} },
 
 /* VMX instructions.  */
 {"vmcall",    0, 0x0f01, 0xc1, CpuVMX, NoSuf|ImmExt,	{ 0, 0, 0} },
--- binutils/opcodes/i386-dis.c.pni	2005-11-11 10:48:50.000000000 -0800
+++ binutils/opcodes/i386-dis.c	2005-11-16 17:31:55.000000000 -0800
@@ -4413,6 +4413,7 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSE
     {
       /* Override "sidt".  */
       char *p = obuf + strlen (obuf) - 4;
+      const char **names = mode_64bit ? names64 : names32;
 
       /* We might have a suffix when disassembling with -Msuffix.  */
       if (*p == 'i')
@@ -4423,7 +4424,7 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSE
 	  /* mwait %eax,%ecx  */
 	  strcpy (p, "mwait");
 	  if (!intel_syntax)
-	    strcpy (op1out, names32[0]);
+	    strcpy (op1out, names[0]);
 	}
       else
 	{
@@ -4431,21 +4432,21 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSE
 	  strcpy (p, "monitor");
 	  if (!intel_syntax)
 	    {
-	      if (!mode_64bit)
-		strcpy (op1out, names32[0]);
-	      else if (!(prefixes & PREFIX_ADDR))
-		strcpy (op1out, names64[0]);
+	      const char **names_with_addr_prefix;
+	      names_with_addr_prefix = mode_64bit ? names32 : names16;
+	      if (!(prefixes & PREFIX_ADDR))
+		strcpy (op1out, names[0]);
 	      else
 		{
-		  strcpy (op1out, names32[0]);
+		  strcpy (op1out, names_with_addr_prefix[0]);
 		  used_prefixes |= PREFIX_ADDR;
 		}
-	      strcpy (op3out, names32[2]);
+	      strcpy (op3out, names[2]);
 	    }
 	}
       if (!intel_syntax)
 	{
-	  strcpy (op2out, names32[1]);
+	  strcpy (op2out, names[1]);
 	  two_source_ops = 1;
 	}
 


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