mirror of https://github.com/xemu-project/xemu.git
tcg: Factor init_ffi_layouts() out of tcg_context_init()
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20221111074101.2069454-27-richard.henderson@linaro.org> [PMD: Split from bigger patch] Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20221122180804.938-3-philmd@linaro.org>
This commit is contained in:
parent
c6ef8c7b35
commit
0c22e17658
83
tcg/tcg.c
83
tcg/tcg.c
|
@ -573,7 +573,49 @@ static ffi_type *typecode_to_ffi(int argmask)
|
||||||
}
|
}
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
static void init_ffi_layouts(void)
|
||||||
|
{
|
||||||
|
/* g_direct_hash/equal for direct comparisons on uint32_t. */
|
||||||
|
ffi_table = g_hash_table_new(NULL, NULL);
|
||||||
|
for (int i = 0; i < ARRAY_SIZE(all_helpers); ++i) {
|
||||||
|
uint32_t typemask = all_helpers[i].typemask;
|
||||||
|
gpointer hash = (gpointer)(uintptr_t)typemask;
|
||||||
|
struct {
|
||||||
|
ffi_cif cif;
|
||||||
|
ffi_type *args[];
|
||||||
|
} *ca;
|
||||||
|
ffi_status status;
|
||||||
|
int nargs;
|
||||||
|
|
||||||
|
if (g_hash_table_lookup(ffi_table, hash)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ignoring the return type, find the last non-zero field. */
|
||||||
|
nargs = 32 - clz32(typemask >> 3);
|
||||||
|
nargs = DIV_ROUND_UP(nargs, 3);
|
||||||
|
|
||||||
|
ca = g_malloc0(sizeof(*ca) + nargs * sizeof(ffi_type *));
|
||||||
|
ca->cif.rtype = typecode_to_ffi(typemask & 7);
|
||||||
|
ca->cif.nargs = nargs;
|
||||||
|
|
||||||
|
if (nargs != 0) {
|
||||||
|
ca->cif.arg_types = ca->args;
|
||||||
|
for (int j = 0; j < nargs; ++j) {
|
||||||
|
int typecode = extract32(typemask, (j + 1) * 3, 3);
|
||||||
|
ca->args[j] = typecode_to_ffi(typecode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status = ffi_prep_cif(&ca->cif, FFI_DEFAULT_ABI, nargs,
|
||||||
|
ca->cif.rtype, ca->cif.arg_types);
|
||||||
|
assert(status == FFI_OK);
|
||||||
|
|
||||||
|
g_hash_table_insert(ffi_table, hash, (gpointer)&ca->cif);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TCG_INTERPRETER */
|
||||||
|
|
||||||
typedef struct TCGCumulativeArgs {
|
typedef struct TCGCumulativeArgs {
|
||||||
int arg_idx; /* tcg_gen_callN args[] */
|
int arg_idx; /* tcg_gen_callN args[] */
|
||||||
|
@ -768,44 +810,7 @@ static void tcg_context_init(unsigned max_cpus)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TCG_INTERPRETER
|
#ifdef CONFIG_TCG_INTERPRETER
|
||||||
/* g_direct_hash/equal for direct comparisons on uint32_t. */
|
init_ffi_layouts();
|
||||||
ffi_table = g_hash_table_new(NULL, NULL);
|
|
||||||
for (i = 0; i < ARRAY_SIZE(all_helpers); ++i) {
|
|
||||||
struct {
|
|
||||||
ffi_cif cif;
|
|
||||||
ffi_type *args[];
|
|
||||||
} *ca;
|
|
||||||
uint32_t typemask = all_helpers[i].typemask;
|
|
||||||
gpointer hash = (gpointer)(uintptr_t)typemask;
|
|
||||||
ffi_status status;
|
|
||||||
int nargs;
|
|
||||||
|
|
||||||
if (g_hash_table_lookup(ffi_table, hash)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ignoring the return type, find the last non-zero field. */
|
|
||||||
nargs = 32 - clz32(typemask >> 3);
|
|
||||||
nargs = DIV_ROUND_UP(nargs, 3);
|
|
||||||
|
|
||||||
ca = g_malloc0(sizeof(*ca) + nargs * sizeof(ffi_type *));
|
|
||||||
ca->cif.rtype = typecode_to_ffi(typemask & 7);
|
|
||||||
ca->cif.nargs = nargs;
|
|
||||||
|
|
||||||
if (nargs != 0) {
|
|
||||||
ca->cif.arg_types = ca->args;
|
|
||||||
for (int j = 0; j < nargs; ++j) {
|
|
||||||
int typecode = extract32(typemask, (j + 1) * 3, 3);
|
|
||||||
ca->args[j] = typecode_to_ffi(typecode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status = ffi_prep_cif(&ca->cif, FFI_DEFAULT_ABI, nargs,
|
|
||||||
ca->cif.rtype, ca->cif.arg_types);
|
|
||||||
assert(status == FFI_OK);
|
|
||||||
|
|
||||||
g_hash_table_insert(ffi_table, hash, (gpointer)&ca->cif);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tcg_target_init(s);
|
tcg_target_init(s);
|
||||||
|
|
Loading…
Reference in New Issue