[PATCH 8/9] x86: correctly handle VMOVD with EVEX.W set outside of 64-bit mode

Jan Beulich JBeulich@suse.com
Thu Oct 11 06:59:00 GMT 2018


For the flavors having a GPR operand EVEX.W is ignored outside of 64-bit
mode. The mnemonic should therefore not be KMOVQ, the GPR operand should
not name a non-existing 64-bit register, just like is already the case
for the AVX counterparts, and the Disp8 scaling factor should be 4
rather than 8.

gas/
2018-10-10  Jan Beulich  <jbeulich@suse.com>

	* testsuite/gas/i386/evex-wig.s: Add vmovd cases.
	* testsuite/gas/i386/evex-wig.d,
	testsuite/gas/i386/evex-wig1-intel.d: Adjust expectations.

opcodes/
2018-10-10  Jan Beulich  <jbeulich@suse.com>

	* i386-dis.c (EVEX_W_0F6E_P_2, EVEX_W_0F7E_P_2): Delete.
	* i386-dis-evex.h (evex_table): Move vmov[dq} with GPR operand
	cases up one level in the hierarchy.

--- a/gas/testsuite/gas/i386/evex-wig.s
+++ b/gas/testsuite/gas/i386/evex-wig.s
@@ -35,6 +35,12 @@ _start:
 	{evex} vextractps $0, %xmm0, %eax
 	{evex} vextractps $0, %xmm0, 4(%eax)
 
+	{evex} vmovd %eax, %xmm0
+	{evex} vmovd 4(%eax), %xmm0
+
+	{evex} vmovd %xmm0, %eax
+	{evex} vmovd %xmm0, 4(%eax)
+
 	{evex} vpextrb $0, %xmm0, %eax
 	{evex} vpextrb $0, %xmm0, 1(%eax)
 
--- a/gas/testsuite/gas/i386/evex-wig1-intel.d
+++ b/gas/testsuite/gas/i386/evex-wig1-intel.d
@@ -27,6 +27,10 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	62 f1 ff 08 78 c0    	vcvttsd2usi eax,xmm0
 [ 	]*[a-f0-9]+:	62 f3 fd 08 17 c0 00 	vextractps eax,xmm0,0x0
 [ 	]*[a-f0-9]+:	62 f3 fd 08 17 40 01 00 	vextractps DWORD PTR \[eax\+0x4\],xmm0,0x0
+[ 	]*[a-f0-9]+:	62 f1 fd 08 6e c0    	vmovd  xmm0,eax
+[ 	]*[a-f0-9]+:	62 f1 fd 08 6e 40 01 	vmovd  xmm0,DWORD PTR \[eax\+0x4\]
+[ 	]*[a-f0-9]+:	62 f1 fd 08 7e c0    	vmovd  eax,xmm0
+[ 	]*[a-f0-9]+:	62 f1 fd 08 7e 40 01 	vmovd  DWORD PTR \[eax\+0x4\],xmm0
 [ 	]*[a-f0-9]+:	62 f3 fd 08 14 c0 00 	vpextrb eax,xmm0,0x0
 [ 	]*[a-f0-9]+:	62 f3 fd 08 14 40 01 00 	vpextrb BYTE PTR \[eax\+0x1\],xmm0,0x0
 [ 	]*[a-f0-9]+:	62 f3 fd 08 16 c0 00 	vpextrd eax,xmm0,0x0
--- a/gas/testsuite/gas/i386/evex-wig1.d
+++ b/gas/testsuite/gas/i386/evex-wig1.d
@@ -27,6 +27,10 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	62 f1 ff 08 78 c0    	vcvttsd2usi %xmm0,%eax
 [ 	]*[a-f0-9]+:	62 f3 fd 08 17 c0 00 	vextractps \$0x0,%xmm0,%eax
 [ 	]*[a-f0-9]+:	62 f3 fd 08 17 40 01 00 	vextractps \$0x0,%xmm0,0x4\(%eax\)
+[ 	]*[a-f0-9]+:	62 f1 fd 08 6e c0    	vmovd  %eax,%xmm0
+[ 	]*[a-f0-9]+:	62 f1 fd 08 6e 40 01 	vmovd  0x4\(%eax\),%xmm0
+[ 	]*[a-f0-9]+:	62 f1 fd 08 7e c0    	vmovd  %xmm0,%eax
+[ 	]*[a-f0-9]+:	62 f1 fd 08 7e 40 01 	vmovd  %xmm0,0x4\(%eax\)
 [ 	]*[a-f0-9]+:	62 f3 fd 08 14 c0 00 	vpextrb \$0x0,%xmm0,%eax
 [ 	]*[a-f0-9]+:	62 f3 fd 08 14 40 01 00 	vpextrb \$0x0,%xmm0,0x1\(%eax\)
 [ 	]*[a-f0-9]+:	62 f3 fd 08 16 c0 00 	vpextrd \$0x0,%xmm0,%eax
--- a/opcodes/i386-dis-evex.h
+++ b/opcodes/i386-dis-evex.h
@@ -3299,11 +3299,6 @@ static const struct dis386 evex_table[][
     { Bad_Opcode },
     { "vpunpckhqdq",	{ XM, Vex, EXx }, 0 },
   },
-  /* EVEX_W_0F6E_P_2 */
-  {
-    { "vmovd",	{ XMScalar, Ed }, 0 },
-    { "vmovq",	{ XMScalar, Eq }, 0 },
-  },
   /* EVEX_W_0F6F_P_1 */
   {
     { "vmovdqu32",	{ XM, EXEvexXNoBcst }, 0 },
@@ -3400,11 +3395,6 @@ static const struct dis386 evex_table[][
     { Bad_Opcode },
     { "vmovq",	{ XMScalar, EXxmm_mq }, 0 },
   },
-  /* EVEX_W_0F7E_P_2 */
-  {
-    { "vmovd",	{ Ed, XMScalar }, 0 },
-    { "vmovq",	{ Eq, XMScalar }, 0 },
-  },
   /* EVEX_W_0F7F_P_1 */
   {
     { "vmovdqu32",	{ EXxS, XM }, 0 },
@@ -4093,7 +4083,7 @@ static const struct dis386 evex_table[][
 #ifdef NEED_EVEX_LEN_TABLE
   /* EVEX_LEN_0F6E_P_2 */
   {
-    { VEX_W_TABLE (EVEX_W_0F6E_P_2) },
+    { "vmovK",	{ XMScalar, Edq }, 0 },
   },
 
   /* EVEX_LEN_0F7E_P_1 */
@@ -4103,7 +4093,7 @@ static const struct dis386 evex_table[][
 
   /* EVEX_LEN_0F7E_P_2 */
   {
-    { VEX_W_TABLE (EVEX_W_0F7E_P_2) },
+    { "vmovK",	{ Edq, XMScalar }, 0 },
   },
 
   /* EVEX_LEN_0FD6_P_2 */
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -2100,7 +2100,6 @@ enum
   EVEX_W_0F6B_P_2,
   EVEX_W_0F6C_P_2,
   EVEX_W_0F6D_P_2,
-  EVEX_W_0F6E_P_2,
   EVEX_W_0F6F_P_1,
   EVEX_W_0F6F_P_2,
   EVEX_W_0F6F_P_3,
@@ -2121,7 +2120,6 @@ enum
   EVEX_W_0F7B_P_2,
   EVEX_W_0F7B_P_3,
   EVEX_W_0F7E_P_1,
-  EVEX_W_0F7E_P_2,
   EVEX_W_0F7F_P_1,
   EVEX_W_0F7F_P_2,
   EVEX_W_0F7F_P_3,





More information about the Binutils mailing list