[PATCH 3/3] x86: re-order logic in OP_XMM()

Jan Beulich jbeulich@suse.com
Wed Mar 10 08:28:24 GMT 2021


Instead of excluding an increasing number of modes in the initial if(),
check the special modes first.

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

	* i386-dis.c (OP_XMM): Re-order checks.

--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -12598,39 +12598,8 @@ OP_XMM (int bytemode, int sizeflag ATTRI
 	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 ATTRI
 	  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 ATTRI
 	}
       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]);



More information about the Binutils mailing list