x86: correct VCVT{,U}SI2SD rounding mode handling
authorJan Beulich <jbeulich@suse.com>
Thu, 22 Jul 2021 11:02:08 +0000 (13:02 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 22 Jul 2021 11:02:08 +0000 (13:02 +0200)
With EVEX.W clear the instruction doesn't ignore the rounding mode, but
(like for other insns without rounding semantics) EVEX.b set causes #UD.
Hence the handling of EVEX.W needs to be done when processing
evex_rounding_64_mode, not at the decode stages.

Derive a new 64-bit testcase from the 32-bit one to cover the different
EVEX.W treatment in both cases.

gas/testsuite/gas/i386/evex.d
gas/testsuite/gas/i386/evex.s
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/x86-64-evex.d [new file with mode: 0644]
opcodes/i386-dis-evex-prefix.h
opcodes/i386-dis-evex-w.h
opcodes/i386-dis.c

index 2fbe295b86be3f7ffbb99f13d386c3cf1924ef72..b02bca39098edcd076dd418871495486be44777f 100644 (file)
@@ -1,5 +1,5 @@
 #objdump: -dw -Msuffix
-#name: i386 EVX insns
+#name: i386 EVEX insns
 
 .*: +file format .*
 
@@ -8,9 +8,12 @@ Disassembly of section .text:
 
 0+ <_start>:
  +[a-f0-9]+:   62 f1 d6 38 2a f0       vcvtsi2ssl %eax,\{rd-sae\},%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 57 38 2a f0       vcvtsi2sdl %eax,\(bad\),%xmm5,%xmm6
  +[a-f0-9]+:   62 f1 d7 38 2a f0       vcvtsi2sdl %eax,\(bad\),%xmm5,%xmm6
  +[a-f0-9]+:   62 f1 d6 08 7b f0       vcvtusi2ssl %eax,%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 57 08 7b f0       vcvtusi2sdl %eax,%xmm5,%xmm6
  +[a-f0-9]+:   62 f1 d7 08 7b f0       vcvtusi2sdl %eax,%xmm5,%xmm6
  +[a-f0-9]+:   62 f1 d6 38 7b f0       vcvtusi2ssl %eax,\{rd-sae\},%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 57 38 7b f0       vcvtusi2sdl %eax,\(bad\),%xmm5,%xmm6
  +[a-f0-9]+:   62 f1 d7 38 7b f0       vcvtusi2sdl %eax,\(bad\),%xmm5,%xmm6
 #pass
index a64cc573dcd0d32166ab19c8b2c6064dc71ce18c..90c635a27b6ca706e78245c876db00eb768e9547 100644 (file)
@@ -4,8 +4,11 @@
        .text
 _start:
        .byte 0x62, 0xf1, 0xd6, 0x38, 0x2a, 0xf0
+       .byte 0x62, 0xf1, 0x57, 0x38, 0x2a, 0xf0
        .byte 0x62, 0xf1, 0xd7, 0x38, 0x2a, 0xf0
        .byte 0x62, 0xf1, 0xd6, 0x08, 0x7b, 0xf0
+       .byte 0x62, 0xf1, 0x57, 0x08, 0x7b, 0xf0
        .byte 0x62, 0xf1, 0xd7, 0x08, 0x7b, 0xf0
        .byte 0x62, 0xf1, 0xd6, 0x38, 0x7b, 0xf0
+       .byte 0x62, 0xf1, 0x57, 0x38, 0x7b, 0xf0
        .byte 0x62, 0xf1, 0xd7, 0x38, 0x7b, 0xf0
index 1e0a363a803b5c667cb23941d685dedcaeb3579a..6f9543eec3a2e5e182ff1084af46334545907339 100644 (file)
@@ -929,6 +929,7 @@ if [gas_64_check] then {
     run_dump_test "x86-64-avx512er-intel"
     run_dump_test "x86-64-avx512pf"
     run_dump_test "x86-64-avx512pf-intel"
+    run_dump_test "x86-64-evex"
     run_dump_test "x86-64-evex-lig256"
     run_dump_test "x86-64-evex-lig512"
     run_dump_test "x86-64-evex-lig256-intel"
diff --git a/gas/testsuite/gas/i386/x86-64-evex.d b/gas/testsuite/gas/i386/x86-64-evex.d
new file mode 100644 (file)
index 0000000..b360aa7
--- /dev/null
@@ -0,0 +1,20 @@
+#objdump: -dw
+#name: x86-64 EVEX insns
+#source: evex.s
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <_start>:
+ +[a-f0-9]+:   62 f1 d6 38 2a f0       vcvtsi2ss %rax,\{rd-sae\},%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 57 38 2a f0       vcvtsi2sd %eax,\(bad\),%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 d7 38 2a f0       vcvtsi2sd %rax,\{rd-sae\},%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 d6 08 7b f0       vcvtusi2ss %rax,%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 57 08 7b f0       vcvtusi2sd %eax,%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 d7 08 7b f0       vcvtusi2sd %rax,%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 d6 38 7b f0       vcvtusi2ss %rax,\{rd-sae\},%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 57 38 7b f0       vcvtusi2sd %eax,\(bad\),%xmm5,%xmm6
+ +[a-f0-9]+:   62 f1 d7 38 7b f0       vcvtusi2sd %rax,\{rd-sae\},%xmm5,%xmm6
+#pass
index 2ed8f6730c5ea0a7a09a465ae404adf4755934e9..9ad9372a2213e18c800a5dca5af907a01de2d746 100644 (file)
@@ -30,7 +30,7 @@
     { Bad_Opcode },
     { "vcvtsi2ss{%LQ|}",       { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
     { Bad_Opcode },
-    { VEX_W_TABLE (EVEX_W_0F2A_P_3) },
+    { "vcvtsi2sd{%LQ|}",       { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
   },
   /* PREFIX_EVEX_0F51 */
   {
     { Bad_Opcode },
     { "vcvtusi2ss{%LQ|}",      { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
     { VEX_W_TABLE (EVEX_W_0F7B_P_2) },
-    { VEX_W_TABLE (EVEX_W_0F7B_P_3) },
+    { "vcvtusi2sd{%LQ|}",      { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
   },
   /* PREFIX_EVEX_0F7E */
   {
index 2c7d9bc2e346b78fc049a455ea1e49c63d57d467..8af4695a0049f6b7278a2169eadfa828d430d794 100644 (file)
   {
     { "vmovshdup",     { XM, EXx }, 0 },
   },
-  /* EVEX_W_0F2A_P_3 */
-  {
-    { "vcvtsi2sd{%LQ|}",       { XMScalar, VexScalar, Ed }, 0 },
-    { "vcvtsi2sd{%LQ|}",       { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
-  },
   /* EVEX_W_0F51_P_1 */
   {
     { "vsqrtss",       { XMScalar, VexScalar, EXxmm_md, EXxEVexR }, 0 },
     { "vcvtps2qq",     { XM, EXEvexHalfBcstXmmq, EXxEVexR }, 0 },
     { "vcvtpd2qq",     { XM, EXx, EXxEVexR }, 0 },
   },
-  /* EVEX_W_0F7B_P_3 */
-  {
-    { "vcvtusi2sd{%LQ|}",      { XMScalar, VexScalar, Ed }, 0 },
-    { "vcvtusi2sd{%LQ|}",      { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
-  },
   /* EVEX_W_0F7E_P_1 */
   {
     { Bad_Opcode },
index f88276ced6bcf53b545f8757fda83c8bdfb403ff..ccc49ff023f7c90ba49da87f0a35f7befac9aa80 100644 (file)
@@ -1476,7 +1476,6 @@ enum
   EVEX_W_0F12_P_3,
   EVEX_W_0F16_P_0_M_1,
   EVEX_W_0F16_P_1,
-  EVEX_W_0F2A_P_3,
   EVEX_W_0F51_P_1,
   EVEX_W_0F51_P_3,
   EVEX_W_0F58_P_1,
@@ -1521,7 +1520,6 @@ enum
   EVEX_W_0F7A_P_2,
   EVEX_W_0F7A_P_3,
   EVEX_W_0F7B_P_2,
-  EVEX_W_0F7B_P_3,
   EVEX_W_0F7E_P_1,
   EVEX_W_0F7F_P_1,
   EVEX_W_0F7F_P_2,
@@ -13724,7 +13722,7 @@ OP_Rounding (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
     switch (bytemode)
       {
       case evex_rounding_64_mode:
-       if (address_mode != mode_64bit)
+       if (address_mode != mode_64bit || !vex.w)
          {
            oappend ("(bad)");
            break;