[v1.1,1/9] x86: refine TPAUSE and UMWAIT

Message ID 6badba67-77a2-dec0-cbb3-b26db86e11be@suse.com
State New
Headers show
Series
  • [v1.1,1/9] x86: refine TPAUSE and UMWAIT
Related show

Commit Message

Jan Beulich March 5, 2020, 8:07 a.m.
Allowing 64-bit registers is misleading here: Elsewhere these get allowed
when there's no difference between either variant, because of 32-bit
destination registers having their upper halves zeroed in 64-bit mode.
Here, however, they're source registers, and hence specifying 64-bit
registers would lead to the ambiguity of whether the upper 32 bits
actually matter.

Additionally, for proper code generation in 16-bit mode, IgnoreSize is
needed on both.

And finally, just like for e.g. MONITOR/MWAIT, add variants with all
input registers explicitly specified.

gas/
2020-03-XX  Jan Beulich  <jbeulich@suse.com>

	* config/tc-i386.c (md_assemble): Also exclude tpause and umwait
	from having their operands swapped.
	* testsuite/gas/i386/waitpkg.s,
	testsuite/gas/i386/x86-64-waitpkg.s: Add tpause and umwait
	3-operand cases as well as testing of 16-bit code generation.
	* testsuite/gas/i386/waitpkg.d,
	testsuite/gas/i386/waitpkg-intel.d,
	testsuite/gas/i386/x86-64-waitpkg.d,
	testsuite/gas/i386/x86-64-waitpkg-intel.d: Adjust expectations.

opcodes/
2020-03-XX  Jan Beulich  <jbeulich@suse.com>

	* i386-opc.tbl (tpause, umwait): Add IgnoreSize. Add 3-operand
	template.
	* i386-tbl.h: Re-generate.
---
v1.1: Move 16-bit WaitPKG testing here (from "x86: add missing
      IgnoreSize"). (I'm not going to re-send the other patches of
      this series.)

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -4328,16 +4328,19 @@  md_assemble (char *line)
   /* Now we've parsed the mnemonic into a set of templates, and have the
      operands at hand.  */
 
-  /* All Intel opcodes have reversed operands except for "bound", "enter"
-     "monitor*", and "mwait*".  We also don't reverse intersegment "jmp"
-     and "call" instructions with 2 immediate operands so that the immediate
-     segment precedes the offset, as it does when in AT&T mode. */
+  /* All Intel opcodes have reversed operands except for "bound", "enter",
+     "monitor*", "mwait*", "tpause", and "umwait".  We also don't reverse
+     intersegment "jmp" and "call" instructions with 2 immediate operands so
+     that the immediate segment precedes the offset, as it does when in AT&T
+     mode.  */
   if (intel_syntax
       && i.operands > 1
       && (strcmp (mnemonic, "bound") != 0)
       && (strcmp (mnemonic, "invlpga") != 0)
       && (strncmp (mnemonic, "monitor", 7) != 0)
       && (strncmp (mnemonic, "mwait", 5) != 0)
+      && (strcmp (mnemonic, "tpause") != 0)
+      && (strcmp (mnemonic, "umwait") != 0)
       && !(operand_type_check (i.types[0], imm)
 	   && operand_type_check (i.types[1], imm)))
     swap_operands ();
--- a/gas/testsuite/gas/i386/waitpkg-intel.d
+++ b/gas/testsuite/gas/i386/waitpkg-intel.d
@@ -12,5 +12,17 @@  Disassembly of section \.text:
 [ 	]*[a-f0-9]+:[ 	]*f3 0f ae f0[ 	]*umonitor eax
 [ 	]*[a-f0-9]+:[ 	]*67 f3 0f ae f1[ 	]*umonitor cx
 [ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait ecx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f3[ 	]*umwait ebx
 [ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause ecx
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f3[ 	]*tpause ebx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f7[ 	]*umwait edi
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f7[ 	]*tpause edi
+[ 	]*[a-f0-9]+:[ 	]*67 f3 0f ae f0[ 	]*umonitor ax
+[ 	]*[a-f0-9]+:[ 	]*f3 0f ae f1[ 	]*umonitor ecx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait ecx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f3[ 	]*umwait ebx
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause ecx
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f3[ 	]*tpause ebx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f7[ 	]*umwait edi
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f7[ 	]*tpause edi
 #pass
--- a/gas/testsuite/gas/i386/waitpkg.d
+++ b/gas/testsuite/gas/i386/waitpkg.d
@@ -12,5 +12,17 @@  Disassembly of section \.text:
 [ 	]*[a-f0-9]+:[ 	]*f3 0f ae f0[ 	]*umonitor %eax
 [ 	]*[a-f0-9]+:[ 	]*67 f3 0f ae f1[ 	]*umonitor %cx
 [ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait %ecx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f3[ 	]*umwait %ebx
 [ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause %ecx
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f3[ 	]*tpause %ebx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f7[ 	]*umwait %edi
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f7[ 	]*tpause %edi
+[ 	]*[a-f0-9]+:[ 	]*67 f3 0f ae f0[ 	]*umonitor %ax
+[ 	]*[a-f0-9]+:[ 	]*f3 0f ae f1[ 	]*umonitor %ecx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait %ecx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f3[ 	]*umwait %ebx
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause %ecx
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f3[ 	]*tpause %ebx
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f7[ 	]*umwait %edi
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f7[ 	]*tpause %edi
 #pass
--- a/gas/testsuite/gas/i386/waitpkg.s
+++ b/gas/testsuite/gas/i386/waitpkg.s
@@ -2,7 +2,19 @@ 
 
 	.text
 _start:
+	.rept 2
 	umonitor %eax
 	umonitor %cx
 	umwait %ecx
+	umwait %ebx, %edx, %eax
 	tpause %ecx
+	tpause %ebx, %edx, %eax
+
+	.intel_syntax noprefix
+
+	umwait edi, edx, eax
+	tpause edi, edx, eax
+
+	.att_syntax prefix
+	.code16
+	.endr
--- a/gas/testsuite/gas/i386/x86-64-waitpkg-intel.d
+++ b/gas/testsuite/gas/i386/x86-64-waitpkg-intel.d
@@ -13,11 +13,11 @@  Disassembly of section \.text:
 [ 	]*[a-f0-9]+:[ 	]*f3 41 0f ae f2[ 	]*umonitor r10
 [ 	]*[a-f0-9]+:[ 	]*67 f3 41 0f ae f2[ 	]*umonitor r10d
 [ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait ecx
-[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait ecx
-[ 	]*[a-f0-9]+:[ 	]*f2 41 0f ae f2[ 	]*umwait r10d
 [ 	]*[a-f0-9]+:[ 	]*f2 41 0f ae f2[ 	]*umwait r10d
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f7[ 	]*umwait edi
 [ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause ecx
-[ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause ecx
-[ 	]*[a-f0-9]+:[ 	]*66 41 0f ae f2[ 	]*tpause r10d
 [ 	]*[a-f0-9]+:[ 	]*66 41 0f ae f2[ 	]*tpause r10d
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f7[ 	]*tpause edi
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f6[ 	]*umwait esi
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f6[ 	]*tpause esi
 #pass
--- a/gas/testsuite/gas/i386/x86-64-waitpkg.d
+++ b/gas/testsuite/gas/i386/x86-64-waitpkg.d
@@ -13,11 +13,11 @@  Disassembly of section \.text:
 [ 	]*[a-f0-9]+:[ 	]*f3 41 0f ae f2[ 	]*umonitor %r10
 [ 	]*[a-f0-9]+:[ 	]*67 f3 41 0f ae f2[ 	]*umonitor %r10d
 [ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait %ecx
-[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f1[ 	]*umwait %ecx
-[ 	]*[a-f0-9]+:[ 	]*f2 41 0f ae f2[ 	]*umwait %r10d
 [ 	]*[a-f0-9]+:[ 	]*f2 41 0f ae f2[ 	]*umwait %r10d
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f7[ 	]*umwait %edi
 [ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause %ecx
-[ 	]*[a-f0-9]+:[ 	]*66 0f ae f1[ 	]*tpause %ecx
-[ 	]*[a-f0-9]+:[ 	]*66 41 0f ae f2[ 	]*tpause %r10d
 [ 	]*[a-f0-9]+:[ 	]*66 41 0f ae f2[ 	]*tpause %r10d
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f7[ 	]*tpause %edi
+[ 	]*[a-f0-9]+:[ 	]*f2 0f ae f6[ 	]*umwait %esi
+[ 	]*[a-f0-9]+:[ 	]*66 0f ae f6[ 	]*tpause %esi
 #pass
--- a/gas/testsuite/gas/i386/x86-64-waitpkg.s
+++ b/gas/testsuite/gas/i386/x86-64-waitpkg.s
@@ -6,10 +6,13 @@  _start:
 	umonitor %r10
 	umonitor %r10d
 	umwait %ecx
-	umwait %rcx
-	umwait %r10
 	umwait %r10d
+	umwait %edi, %edx, %eax
 	tpause %ecx
-	tpause %rcx
-	tpause %r10
 	tpause %r10d
+	tpause %edi, %edx, %eax
+
+	.intel_syntax noprefix
+
+	umwait esi, edx, eax
+	tpause esi, edx, eax
--- a/opcodes/i386-opc.tbl
+++ b/opcodes/i386-opc.tbl
@@ -4763,10 +4763,10 @@  pconfig, 0, 0x0f01c5, None, 3, CpuPCONFI
 // WAITPKG instructions.
 
 umonitor, 1, 0xf30fae, 0x6, 2, CpuWAITPKG, Modrm|AddrPrefixOpReg, { Reg16|Reg32|Reg64 }
-
-tpause, 1, 0x660fae, 0x6, 2, CpuWAITPKG, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Reg32|Reg64 }
-
-umwait, 1, 0xf20fae, 0x6, 2, CpuWAITPKG, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Reg32|Reg64 }
+tpause, 1, 0x660fae, 0x6, 2, CpuWAITPKG, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32 }
+tpause, 3, 0x660fae, 0x6, 2, CpuWAITPKG, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, RegD|Dword, Acc|Dword }
+umwait, 1, 0xf20fae, 0x6, 2, CpuWAITPKG, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32 }
+umwait, 3, 0xf20fae, 0x6, 2, CpuWAITPKG, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, RegD|Dword, Acc|Dword }
 
 // WAITPKG instructions end.