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 Thu, Nov 17, 2005 at 10:30:05AM +0100, Jan Beulich wrote:
> 
> Regarding the patch, I don't think hard-coding the address size
> override for 16-bit operation of monitor is appropriate - under .code16
> this is not going to produce the desired effect (and likewise is the
> opposite 32-bit operation in 16-bit mode then missing the override). The
> base problem here is that monitor's address operand, when explicitly

The opcode is the same for both 32bit and 64bit modes. The address
 size ovverride only changes the size of EAX/RAX. I don't see how
".code16" can be used with it. As for ".code32", it works fine:

[hjl@gnu-13 gas]$ cat x.s
        .code32
        monitor %eax,%ecx,%edx
        .code64
        monitor %rax,%rcx,%rdx
[hjl@gnu-13 gas]$ ./as-new -o x.o x.s
[hjl@gnu-13 gas]$ ../binutils/objdump -d x.o

x.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <.text>:
   0:   0f 01 c8                monitor %rax,%rcx,%rdx
   3:   0f 01 c8                monitor %rax,%rcx,%rdx


> 
> Further, for the disassembly part I'd really like to see the explicit
> addr16/addr32 displaying to go away; these should only be output on
> instructions where none of the operands indicates the address size
> used.
> 

Here is the new patch to do it.


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

2005-11-17  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-17  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-17  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-17 08:29:36.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 [ 	]*monitor %ax,%ecx,%edx
+  70:	67 0f 01 c8 [ 	]*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-17 08:29:42.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 [ 	]*monitor %eax,%rcx,%rdx
+  70:	67 0f 01 c8 [ 	]*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-17 08:05:35.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-17 08:32:00.000000000 -0800
@@ -4412,18 +4412,30 @@ PNI_Fixup (int extrachar ATTRIBUTE_UNUSE
   if (mod == 3 && reg == 1 && rm <= 1)
     {
       /* Override "sidt".  */
-      char *p = obuf + strlen (obuf) - 4;
+      size_t olen = strlen (obuf);
+      char *p = obuf + olen - 4;
+      const char **names = mode_64bit ? names64 : names32;
 
       /* We might have a suffix when disassembling with -Msuffix.  */
       if (*p == 'i')
 	--p;
 
+      /* Remove "addr16/addr32" if we aren't in Intel mode.  */
+      if (!intel_syntax
+	  && (prefixes & PREFIX_ADDR)
+	  && olen >= (4 + 7)
+	  && *(p - 1) == ' '
+	  && strncmp (p - 7, "addr", 4) == 0
+	  && (strncmp (p - 3, "16", 2) == 0
+	      || strncmp (p - 3, "32", 2) == 0))
+	p -= 7;
+
       if (rm)
 	{
 	  /* mwait %eax,%ecx  */
 	  strcpy (p, "mwait");
 	  if (!intel_syntax)
-	    strcpy (op1out, names32[0]);
+	    strcpy (op1out, names[0]);
 	}
       else
 	{
@@ -4431,21 +4443,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]