aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2024-03-28 11:55:53 +0100
committerJan Beulich <jbeulich@suse.com>2024-03-28 11:55:53 +0100
commitb58829cdeff4644528ec06dfdb63ffb22910088f (patch)
treede0c1bf7eb4b024753d587bc004ffcb331a96a93 /gas
parentebe82bfdb3832be50bb8553784d148d5b73c0b39 (diff)
downloadbinutils-b58829cdeff4644528ec06dfdb63ffb22910088f.zip
binutils-b58829cdeff4644528ec06dfdb63ffb22910088f.tar.gz
binutils-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')
-rw-r--r--gas/config/tc-i386.c21
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)