From: Jan Beulich Date: Thu, 1 Dec 2022 09:00:26 +0000 (+0100) Subject: x86: rework of match_template()'s suffix checking X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7505bb034c7c8a3d9ecf34e22777114c8bc4a93e;p=binutils-gdb.git x86: rework of match_template()'s suffix checking (Ab)using i386_opcode_modifier for this has been overkill, as the logic doesn't really require the full structure. With the removal of LONG_DOUBLE_MNEM_SUFFIX and No_ldSuf there's no good reason at all anymore to pull out such a loop invariant: We're dealing a check of a bit in the loop for a simple comparison. Do the original compares inside the loop, thus also making it easier to understand what is actually being checked. --- diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 1c68bc043af..55e2d85d04b 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -6461,7 +6461,6 @@ match_template (char mnem_suffix) i386_operand_type overlap0, overlap1, overlap2, overlap3; i386_operand_type overlap4; unsigned int found_reverse_match; - i386_opcode_modifier suffix_check; i386_operand_type operand_types [MAX_OPERANDS]; int addr_prefix_disp; unsigned int j, size_match, check_register, errline = __LINE__; @@ -6475,27 +6474,6 @@ match_template (char mnem_suffix) found_reverse_match = 0; addr_prefix_disp = -1; - /* Prepare for mnemonic suffix check. */ - memset (&suffix_check, 0, sizeof (suffix_check)); - switch (mnem_suffix) - { - case BYTE_MNEM_SUFFIX: - suffix_check.no_bsuf = 1; - break; - case WORD_MNEM_SUFFIX: - suffix_check.no_wsuf = 1; - break; - case SHORT_MNEM_SUFFIX: - suffix_check.no_ssuf = 1; - break; - case LONG_MNEM_SUFFIX: - suffix_check.no_lsuf = 1; - break; - case QWORD_MNEM_SUFFIX: - suffix_check.no_qsuf = 1; - break; - } - for (t = current_templates->start; t < current_templates->end; t++) { addr_prefix_disp = -1; @@ -6543,11 +6521,11 @@ match_template (char mnem_suffix) /* Check the suffix. */ specific_error = progress (invalid_instruction_suffix); - if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf) - || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf) - || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf) - || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf) - || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)) + if ((t->opcode_modifier.no_bsuf && mnem_suffix == BYTE_MNEM_SUFFIX) + || (t->opcode_modifier.no_wsuf && mnem_suffix == WORD_MNEM_SUFFIX) + || (t->opcode_modifier.no_lsuf && mnem_suffix == LONG_MNEM_SUFFIX) + || (t->opcode_modifier.no_ssuf && mnem_suffix == SHORT_MNEM_SUFFIX) + || (t->opcode_modifier.no_qsuf && mnem_suffix == QWORD_MNEM_SUFFIX)) continue; specific_error = progress (operand_size_mismatch);