This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
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;
}