aboutsummaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2025-01-17 10:28:15 +0100
committerJan Beulich <jbeulich@suse.com>2025-01-17 10:28:15 +0100
commitb88282d5738cd239f67be00d4d9b48d6afda78ca (patch)
treed969ac233cf8d4608aa5758e0053c0070ab70538 /opcodes
parent247357d23f48c503a3efe56997e73489360c4279 (diff)
downloadgdb-b88282d5738cd239f67be00d4d9b48d6afda78ca.zip
gdb-b88282d5738cd239f67be00d4d9b48d6afda78ca.tar.gz
gdb-b88282d5738cd239f67be00d4d9b48d6afda78ca.tar.bz2
x86/APX: convert runtime special case to build-time one
cpu_flags_match() is a hot path. Move the special casing that b7267244a355 ("Support Intel AMX-MOVRS") added there to i386-gen, thus affecting only build time performance.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/i386-gen.c14
-rw-r--r--opcodes/i386-tbl.h8
2 files changed, 18 insertions, 4 deletions
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index d2d9b5d..e21cc79 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -1039,6 +1039,20 @@ process_i386_cpu_flag (FILE *table, char *flag,
all[Cpu64].value = 1;
output_cpu_flags(table, all, ARRAY_SIZE (all), -1, comma, indent, lineno);
+
+ /* For APX_F extension of multiple cpuid enabled insns, we cannot use
+ APX_F(cpuid_A&cpuid_B) in the opcode table, as the result would fail
+ to be parsed. Furthermore, the result also wouldn't be quite valid.
+ However, the assembler's cpu_flags_match() will simply propagate "any"
+ to "all", zapping "any" afterwards altogether. IOW in this situation
+ both masks have "&&" meaning. Set the missing flag here. */
+ if (all[CpuAMX_TRANSPOSE].value && all[CpuAMX_MOVRS].value)
+ {
+ if (!any[CpuAPX_F].value || !any[CpuAMX_MOVRS].value)
+ fail ("%s: %d: internal error: APX_F=%d AMX_MOVRS=%d\n",
+ filename, lineno, any[CpuAPX_F].value, any[CpuAMX_MOVRS].value);
+ any[CpuAMX_TRANSPOSE].value = 1;
+ }
}
output_cpu_flags (table, any, ARRAY_SIZE (any), name != NULL,
diff --git a/opcodes/i386-tbl.h b/opcodes/i386-tbl.h
index 8f74e30..e17f56b 100644
--- a/opcodes/i386-tbl.h
+++ b/opcodes/i386-tbl.h
@@ -43193,7 +43193,7 @@ static const insn_template i386_optab[] =
0, 0, 0, 1, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0 },
{ { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
- { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+ { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
{ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0 } },
{ { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43203,7 +43203,7 @@ static const insn_template i386_optab[] =
0, 0, 0, 1, 0, 1, 0, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0 },
{ { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
- { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+ { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
{ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0 } },
{ { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43213,7 +43213,7 @@ static const insn_template i386_optab[] =
0, 0, 0, 1, 0, 1, 1, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0 },
{ { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
- { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+ { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
{ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0 } },
{ { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -43223,7 +43223,7 @@ static const insn_template i386_optab[] =
0, 0, 0, 1, 0, 1, 1, 4, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0 },
{ { 117, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 } },
- { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } },
+ { { 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0 } },
{ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0 } },
{ { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,