x86: minor improvements to optimize_imm() (part III)
authorJan Beulich <jbeulich@suse.com>
Mon, 31 Oct 2022 16:56:06 +0000 (17:56 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 31 Oct 2022 16:56:06 +0000 (17:56 +0100)
Earlier tidying still missed an opportunity: There's no need for the
"anyimm" static variable. Instead of using it in the loop to mask
"allowed" (which is necessary to satisfy operand_type_or()'s assertions)
simply use "mask", requiring it to be calculated first. That way the
post-loop masking by "mask" ahead of the operand_type_all_zero() can be
dropped.

gas/config/tc-i386.c
opcodes/i386-gen.c
opcodes/i386-init.h

index cccd83717d01c7f609c4717401fc6c47c07bcf5e..bea2de93d42ebc877156ee64415f4160a287aa6c 100644 (file)
@@ -1907,7 +1907,6 @@ operand_type_xor (i386_operand_type x, i386_operand_type y)
 
 static const i386_operand_type disp16_32 = OPERAND_TYPE_DISP16_32;
 static const i386_operand_type anydisp = OPERAND_TYPE_ANYDISP;
-static const i386_operand_type anyimm = OPERAND_TYPE_ANYIMM;
 static const i386_operand_type regxmm = OPERAND_TYPE_REGXMM;
 static const i386_operand_type imm8 = OPERAND_TYPE_IMM8;
 static const i386_operand_type imm8s = OPERAND_TYPE_IMM8S;
@@ -5817,13 +5816,6 @@ optimize_imm (void)
              const insn_template *t = current_templates->start;
 
              operand_type_set (&mask, 0);
-             allowed = t->operand_types[op];
-
-             while (++t < current_templates->end)
-               {
-                 allowed = operand_type_and (allowed, anyimm);
-                 allowed = operand_type_or (allowed, t->operand_types[op]);
-               }
              switch (guess_suffix)
                {
                case QWORD_MNEM_SUFFIX:
@@ -5842,7 +5834,14 @@ optimize_imm (void)
                default:
                  break;
                }
-             allowed = operand_type_and (mask, allowed);
+
+             allowed = operand_type_and (t->operand_types[op], mask);
+             while (++t < current_templates->end)
+               {
+                 allowed = operand_type_or (allowed, t->operand_types[op]);
+                 allowed = operand_type_and (allowed, mask);
+               }
+
              if (!operand_type_all_zero (&allowed))
                i.types[op] = operand_type_and (i.types[op], mask);
            }
index 33c4f9f25f68f43ab439c8b4bb2f569f527580d1..3024e61cb559534a7dd8b00d13dde7b4d267b713 100644 (file)
@@ -539,8 +539,6 @@ static initializer operand_type_init[] =
     "Imm32|Imm32S|Imm64|Disp32" },
   { "OPERAND_TYPE_IMM32_32S_64_DISP32_64",
     "Imm32|Imm32S|Imm64|Disp32|Disp64" },
-  { "OPERAND_TYPE_ANYIMM",
-    "Imm1|Imm8|Imm8S|Imm16|Imm32|Imm32S|Imm64" },
 };
 
 typedef struct bitfield
index e662ba6ec1a4c04588300cc13d1bb5ec79620f14..133827a2d2dd0d296c405a1fb09d9758c24a1398 100644 (file)
 #define OPERAND_TYPE_IMM32_32S_64_DISP32_64 \
   { { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0 } }
-
-#define OPERAND_TYPE_ANYIMM \
-  { { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0 } }