x86: re-order logic in OP_XMM()
authorJan Beulich <jbeulich@suse.com>
Thu, 11 Mar 2021 15:21:48 +0000 (16:21 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 11 Mar 2021 15:21:48 +0000 (16:21 +0100)
Instead of excluding an increasing number of modes in the initial if(),
check the special modes first.

opcodes/ChangeLog
opcodes/i386-dis.c

index e31a93f7de95b38287facbb9e8a253d5e6e3645e..60a9c687250e615b1b92c8afb847d743806e3075 100644 (file)
@@ -1,3 +1,7 @@
+2021-03-11  Jan Beulich  <jbeulich@suse.com>
+
+       * i386-dis.c (OP_XMM): Re-order checks.
+
 2021-03-11  Jan Beulich  <jbeulich@suse.com>
 
        * i386-dis.c (putop): Drop need_vex check when also checking
index 10dbe7fe18301a6a1d5cc891c0ee3c987240148c..2985e8d4417e5a8ba4fd4fe015f78c9a656398b3 100644 (file)
@@ -12598,39 +12598,8 @@ OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
        reg += 16;
     }
 
-  if (need_vex
-      && bytemode != xmm_mode
-      && bytemode != xmmq_mode
-      && bytemode != evex_half_bcst_xmmq_mode
-      && bytemode != ymm_mode
-      && bytemode != tmm_mode
-      && bytemode != scalar_mode)
-    {
-      switch (vex.length)
-       {
-       case 128:
-         names = names_xmm;
-         break;
-       case 256:
-         if (vex.w
-             || bytemode != vex_vsib_q_w_dq_mode)
-           names = names_ymm;
-         else
-           names = names_xmm;
-         break;
-       case 512:
-         if (vex.w
-             || bytemode != vex_vsib_q_w_dq_mode)
-           names = names_zmm;
-         else
-           names = names_ymm;
-         break;
-       default:
-         abort ();
-       }
-    }
-  else if (bytemode == xmmq_mode
-          || bytemode == evex_half_bcst_xmmq_mode)
+  if (bytemode == xmmq_mode
+      || bytemode == evex_half_bcst_xmmq_mode)
     {
       switch (vex.length)
        {
@@ -12645,6 +12614,8 @@ OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
          abort ();
        }
     }
+  else if (bytemode == ymm_mode)
+    names = names_ymm;
   else if (bytemode == tmm_mode)
     {
       modrm.reg = reg;
@@ -12655,8 +12626,33 @@ OP_XMM (int bytemode, int sizeflag ATTRIBUTE_UNUSED)
        }
       names = names_tmm;
     }
-  else if (bytemode == ymm_mode)
-    names = names_ymm;
+  else if (need_vex
+          && bytemode != xmm_mode
+          && bytemode != scalar_mode)
+    {
+      switch (vex.length)
+       {
+       case 128:
+         names = names_xmm;
+         break;
+       case 256:
+         if (vex.w
+             || bytemode != vex_vsib_q_w_dq_mode)
+           names = names_ymm;
+         else
+           names = names_xmm;
+         break;
+       case 512:
+         if (vex.w
+             || bytemode != vex_vsib_q_w_dq_mode)
+           names = names_zmm;
+         else
+           names = names_ymm;
+         break;
+       default:
+         abort ();
+       }
+    }
   else
     names = names_xmm;
   oappend (names[reg]);