diff options
author | Jan Beulich <jbeulich@suse.com> | 2024-03-28 11:55:53 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2024-03-28 11:55:53 +0100 |
commit | b58829cdeff4644528ec06dfdb63ffb22910088f (patch) | |
tree | de0c1bf7eb4b024753d587bc004ffcb331a96a93 /gas/config | |
parent | ebe82bfdb3832be50bb8553784d148d5b73c0b39 (diff) | |
download | gdb-b58829cdeff4644528ec06dfdb63ffb22910088f.zip gdb-b58829cdeff4644528ec06dfdb63ffb22910088f.tar.gz gdb-b58829cdeff4644528ec06dfdb63ffb22910088f.tar.bz2 |
x86/SSE2AVX: move checking
It has always been looking a little odd to me that this was done deep
in cpu_flags_match(). Move it to match_template() itself - there's no
need to do anything complex when encountering such a template while it
cannot possibly be used.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-i386.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9f5273f..7467cef 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -1980,17 +1980,7 @@ cpu_flags_match (const insn_template *t) cpu = cpu_flags_and (any, active); if (cpu_flags_all_zero (&any) || !cpu_flags_all_zero (&cpu)) - { - if (all.bitfield.cpuavx) - { - /* We need to check SSE2AVX with AVX. */ - if (!t->opcode_modifier.sse2avx - || (sse2avx && !i.prefix[DATA_PREFIX])) - match |= CPU_FLAGS_ARCH_MATCH; - } - else - match |= CPU_FLAGS_ARCH_MATCH; - } + match |= CPU_FLAGS_ARCH_MATCH; } return match; } @@ -8542,6 +8532,15 @@ match_template (char mnem_suffix) if (i.operands != t->operands) continue; + /* Skip SSE2AVX templates when inapplicable. */ + if (t->opcode_modifier.sse2avx + && (!sse2avx || i.prefix[DATA_PREFIX])) + { + /* Another non-SSE2AVX template has to follow. */ + gas_assert (t + 1 < current_templates.end); + continue; + } + /* Check processor support. */ specific_error = progress (unsupported); if (cpu_flags_match (t) != CPU_FLAGS_PERFECT_MATCH) |