mirror of https://github.com/xemu-project/xemu.git
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:
parent
fbcc38e4cb
commit
ee659da21a
|
@ -598,7 +598,7 @@ void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
|
||||||
|
|
||||||
void xtensa_collect_sr_names(const XtensaConfig *config);
|
void xtensa_collect_sr_names(const XtensaConfig *config);
|
||||||
void xtensa_translate_init(void);
|
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_breakpoint_handler(CPUState *cs);
|
||||||
void xtensa_register_core(XtensaConfigList *node);
|
void xtensa_register_core(XtensaConfigList *node);
|
||||||
void xtensa_sim_open_console(Chardev *chr);
|
void xtensa_sim_open_console(Chardev *chr);
|
||||||
|
|
|
@ -133,8 +133,10 @@ static void init_libisa(XtensaConfig *config)
|
||||||
config->regfile = g_new(void **, regfiles);
|
config->regfile = g_new(void **, regfiles);
|
||||||
for (i = 0; i < regfiles; ++i) {
|
for (i = 0; i < regfiles; ++i) {
|
||||||
const char *name = xtensa_regfile_name(config->isa, 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
|
#ifdef DEBUG
|
||||||
if (config->regfile[i] == NULL) {
|
if (config->regfile[i] == NULL) {
|
||||||
fprintf(stderr, "regfile '%s' not found for %s\n",
|
fprintf(stderr, "regfile '%s' not found for %s\n",
|
||||||
|
|
|
@ -227,24 +227,43 @@ void xtensa_translate_init(void)
|
||||||
"exclusive_val");
|
"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) {
|
if (xtensa_regfile_table == NULL) {
|
||||||
xtensa_regfile_table = g_hash_table_new(g_str_hash, g_str_equal);
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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)
|
static inline bool option_enabled(DisasContext *dc, int opt)
|
||||||
|
|
Loading…
Reference in New Issue