target/xtensa: add geometry to xtensa_get_regfile_by_name

Register file name may not uniquely identify a register file in the set
of configurations. E.g. floating point registers may have different size
in different configurations. Use register file geometry as additional
identifier.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
Max Filippov 2020-06-28 02:53:32 -07:00
parent fbcc38e4cb
commit ee659da21a
3 changed files with 31 additions and 10 deletions

View File

@ -598,7 +598,7 @@ void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
void xtensa_collect_sr_names(const XtensaConfig *config);
void xtensa_translate_init(void);
void **xtensa_get_regfile_by_name(const char *name);
void **xtensa_get_regfile_by_name(const char *name, int entries, int bits);
void xtensa_breakpoint_handler(CPUState *cs);
void xtensa_register_core(XtensaConfigList *node);
void xtensa_sim_open_console(Chardev *chr);

View File

@ -133,8 +133,10 @@ static void init_libisa(XtensaConfig *config)
config->regfile = g_new(void **, regfiles);
for (i = 0; i < regfiles; ++i) {
const char *name = xtensa_regfile_name(config->isa, i);
int entries = xtensa_regfile_num_entries(config->isa, i);
int bits = xtensa_regfile_num_bits(config->isa, i);
config->regfile[i] = xtensa_get_regfile_by_name(name);
config->regfile[i] = xtensa_get_regfile_by_name(name, entries, bits);
#ifdef DEBUG
if (config->regfile[i] == NULL) {
fprintf(stderr, "regfile '%s' not found for %s\n",

View File

@ -227,24 +227,43 @@ void xtensa_translate_init(void)
"exclusive_val");
}
void **xtensa_get_regfile_by_name(const char *name)
void **xtensa_get_regfile_by_name(const char *name, int entries, int bits)
{
char *geometry_name;
void **res;
if (xtensa_regfile_table == NULL) {
xtensa_regfile_table = g_hash_table_new(g_str_hash, g_str_equal);
/*
* AR is special. Xtensa translator uses it as a current register
* window, but configuration overlays represent it as a complete
* physical register file.
*/
g_hash_table_insert(xtensa_regfile_table,
(void *)"AR", (void *)cpu_R);
(void *)"AR 16x32", (void *)cpu_R);
g_hash_table_insert(xtensa_regfile_table,
(void *)"MR", (void *)cpu_MR);
(void *)"AR 32x32", (void *)cpu_R);
g_hash_table_insert(xtensa_regfile_table,
(void *)"FR", (void *)cpu_FR);
(void *)"AR 64x32", (void *)cpu_R);
g_hash_table_insert(xtensa_regfile_table,
(void *)"BR", (void *)cpu_BR);
(void *)"MR 4x32", (void *)cpu_MR);
g_hash_table_insert(xtensa_regfile_table,
(void *)"BR4", (void *)cpu_BR4);
(void *)"FR 16x32", (void *)cpu_FR);
g_hash_table_insert(xtensa_regfile_table,
(void *)"BR8", (void *)cpu_BR8);
(void *)"BR 16x1", (void *)cpu_BR);
g_hash_table_insert(xtensa_regfile_table,
(void *)"BR4 4x4", (void *)cpu_BR4);
g_hash_table_insert(xtensa_regfile_table,
(void *)"BR8 2x8", (void *)cpu_BR8);
}
return (void **)g_hash_table_lookup(xtensa_regfile_table, (void *)name);
geometry_name = g_strdup_printf("%s %dx%d", name, entries, bits);
res = (void **)g_hash_table_lookup(xtensa_regfile_table, geometry_name);
g_free(geometry_name);
return res;
}
static inline bool option_enabled(DisasContext *dc, int opt)