x86: correctly handle KMOVD with VEX.W set outside of 64-bit mode
authorJan Beulich <jbeulich@novell.com>
Tue, 6 Nov 2018 10:44:31 +0000 (11:44 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 6 Nov 2018 10:44:31 +0000 (11:44 +0100)
For the flavors having a GPR operand VEX.W is ignored outside of 64-bit
mode. The mnemonic should therefore not be KMOVQ.

gas/ChangeLog
gas/testsuite/gas/i386/avx-wig.d
gas/testsuite/gas/i386/avx-wig.s
opcodes/ChangeLog
opcodes/i386-dis.c

index d1170e6f32672efc5569a57adac1fed41176119b..967f6bc968305e85cca0419825c056770a2e6cd3 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-06  Jan Beulich  <jbeulich@suse.com>
+
+       * testsuite/gas/i386/avx-wig.s: Add kmovd cases.
+       * testsuite/gas/i386/avx-wig.d: Adjust expectations.
+
 2018-11-06  Jan Beulich  <jbeulich@suse.com>
 
        * testsuite/gas/i386/avx-wig.s,
index c724d09d08a6b929ebff141de62c945b8a8e354b..7a8f9473446db24dab0772a2fb9a900676b450d5 100644 (file)
@@ -22,6 +22,8 @@ Disassembly of section .text:
  +[a-f0-9]+:   c4 e2 f8 f3 10          blsmsk \(%eax\),%eax
  +[a-f0-9]+:   c4 e2 f8 f3 08          blsr   \(%eax\),%eax
  +[a-f0-9]+:   c4 e2 f8 f5 00          bzhi   %eax,\(%eax\),%eax
+ +[a-f0-9]+:   c4 e1 fb 92 c0          kmovd  %eax,%k0
+ +[a-f0-9]+:   c4 e1 fb 93 c0          kmovd  %k0,%eax
  +[a-f0-9]+:   8f e9 f8 12 c0          llwpcb %eax
  +[a-f0-9]+:   8f ea f8 12 00 00 00 00 00      lwpins \$0x0,\(%eax\),%eax
  +[a-f0-9]+:   8f ea f8 12 08 00 00 00 00      lwpval \$0x0,\(%eax\),%eax
index 3f16ede95eec6f1fabaa9b4b35f248352e792649..4d17ab43676e903e2e3747a5f651ad6e0fdfe618 100644 (file)
@@ -17,6 +17,8 @@ _start:
        blsmsk (%eax), %eax
        blsr (%eax), %eax
        bzhi %eax, (%eax), %eax
+       kmovd %eax, %k0
+       kmovd %k0, %eax
        llwpcb %eax
        lwpins $0, (%eax), %eax
        lwpval $0, (%eax), %eax
index 9f82b3f1a35d977adab1c2dcd4863b5d53cf9dfb..2212d8ec85597b46c5c0bfa26f42bb1bfc57605f 100644 (file)
@@ -1,3 +1,12 @@
+2018-11-06  Jan Beulich  <jbeulich@suse.com>
+
+       * i386-dis.c (MOD_VEX_W_0_0F92_P_3_LEN_0,
+       MOD_VEX_W_1_0F92_P_3_LEN_0): Fold into MOD_VEX_0F92_P_3_LEN_0.
+       (MOD_VEX_W_0_0F93_P_3_LEN_0, MOD_VEX_W_1_0F93_P_3_LEN_0): Fold
+       into MOD_VEX_0F93_P_3_LEN_0.
+       (vex_len_table, vex_w_table, mod_table): Move kmov[dq} with GPR
+       operand cases up one level in the hierarchy.
+
 2018-11-06  Jan Beulich  <jbeulich@suse.com>
 
        * i386-dis.c (VEX_W_0FC4_P_2, VEX_W_0FC5_P_2, VEX_W_0F3A14_P_2,
index 82c578535c7181e48f4f8504097ac9e5fb21e481..f3fbf1969c3e69087125d4d2407c91fbecf0f584 100644 (file)
@@ -903,12 +903,10 @@ enum
   MOD_VEX_W_1_0F91_P_2_LEN_0,
   MOD_VEX_W_0_0F92_P_0_LEN_0,
   MOD_VEX_W_0_0F92_P_2_LEN_0,
-  MOD_VEX_W_0_0F92_P_3_LEN_0,
-  MOD_VEX_W_1_0F92_P_3_LEN_0,
+  MOD_VEX_0F92_P_3_LEN_0,
   MOD_VEX_W_0_0F93_P_0_LEN_0,
   MOD_VEX_W_0_0F93_P_2_LEN_0,
-  MOD_VEX_W_0_0F93_P_3_LEN_0,
-  MOD_VEX_W_1_0F93_P_3_LEN_0,
+  MOD_VEX_0F93_P_3_LEN_0,
   MOD_VEX_W_0_0F98_P_0_LEN_0,
   MOD_VEX_W_1_0F98_P_0_LEN_0,
   MOD_VEX_W_0_0F98_P_2_LEN_0,
@@ -1963,10 +1961,8 @@ enum
   VEX_W_0F91_P_2_LEN_0,
   VEX_W_0F92_P_0_LEN_0,
   VEX_W_0F92_P_2_LEN_0,
-  VEX_W_0F92_P_3_LEN_0,
   VEX_W_0F93_P_0_LEN_0,
   VEX_W_0F93_P_2_LEN_0,
-  VEX_W_0F93_P_3_LEN_0,
   VEX_W_0F98_P_0_LEN_0,
   VEX_W_0F98_P_2_LEN_0,
   VEX_W_0F99_P_0_LEN_0,
@@ -9486,7 +9482,7 @@ static const struct dis386 vex_len_table[][2] = {
 
   /* VEX_LEN_0F92_P_3 */
   {
-    { VEX_W_TABLE (VEX_W_0F92_P_3_LEN_0) },
+    { MOD_TABLE (MOD_VEX_0F92_P_3_LEN_0) },
   },
 
   /* VEX_LEN_0F93_P_0 */
@@ -9501,7 +9497,7 @@ static const struct dis386 vex_len_table[][2] = {
 
   /* VEX_LEN_0F93_P_3 */
   {
-    { VEX_W_TABLE (VEX_W_0F93_P_3_LEN_0) },
+    { MOD_TABLE (MOD_VEX_0F93_P_3_LEN_0) },
   },
 
   /* VEX_LEN_0F98_P_0 */
@@ -9999,11 +9995,6 @@ static const struct dis386 vex_w_table[][2] = {
     /* VEX_W_0F92_P_2_LEN_0 */
     { MOD_TABLE (MOD_VEX_W_0_0F92_P_2_LEN_0) },
   },
-  {
-    /* VEX_W_0F92_P_3_LEN_0 */
-    { MOD_TABLE (MOD_VEX_W_0_0F92_P_3_LEN_0) },
-    { MOD_TABLE (MOD_VEX_W_1_0F92_P_3_LEN_0) },
-  },
   {
     /* VEX_W_0F93_P_0_LEN_0 */
     { MOD_TABLE (MOD_VEX_W_0_0F93_P_0_LEN_0) },
@@ -10012,11 +10003,6 @@ static const struct dis386 vex_w_table[][2] = {
     /* VEX_W_0F93_P_2_LEN_0 */
     { MOD_TABLE (MOD_VEX_W_0_0F93_P_2_LEN_0) },
   },
-  {
-    /* VEX_W_0F93_P_3_LEN_0 */
-    { MOD_TABLE (MOD_VEX_W_0_0F93_P_3_LEN_0) },
-    { MOD_TABLE (MOD_VEX_W_1_0F93_P_3_LEN_0) },
-  },
   {
     /* VEX_W_0F98_P_0_LEN_0 */
     { MOD_TABLE (MOD_VEX_W_0_0F98_P_0_LEN_0) },
@@ -10818,14 +10804,9 @@ static const struct dis386 mod_table[][2] = {
     { "kmovb",         { MaskG, Rdq }, 0 },
   },
   {
-    /* MOD_VEX_W_0_0F92_P_3_LEN_0 */
-    { Bad_Opcode },
-    { "kmovd",         { MaskG, Rdq }, 0 },
-  },
-  {
-    /* MOD_VEX_W_1_0F92_P_3_LEN_0 */
+    /* MOD_VEX_0F92_P_3_LEN_0 */
     { Bad_Opcode },
-    { "kmovq",         { MaskG, Rdq }, 0 },
+    { "kmovK",         { MaskG, Rdq }, 0 },
   },
   {
     /* MOD_VEX_W_0_0F93_P_0_LEN_0 */
@@ -10838,14 +10819,9 @@ static const struct dis386 mod_table[][2] = {
     { "kmovb",         { Gdq, MaskR }, 0 },
   },
   {
-    /* MOD_VEX_W_0_0F93_P_3_LEN_0 */
-    { Bad_Opcode },
-    { "kmovd",         { Gdq, MaskR }, 0 },
-  },
-  {
-    /* MOD_VEX_W_1_0F93_P_3_LEN_0 */
+    /* MOD_VEX_0F93_P_3_LEN_0 */
     { Bad_Opcode },
-    { "kmovq",         { Gdq, MaskR }, 0 },
+    { "kmovK",         { Gdq, MaskR }, 0 },
   },
   {
     /* MOD_VEX_W_0_0F98_P_0_LEN_0 */