tcg: Move ffi_cif pointer into TCGHelperInfo
Instead of requiring a separate hash table lookup, put a pointer to the CIF into TCGHelperInfo. 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-4-philmd@linaro.org>
This commit is contained in:
parent
0c22e17658
commit
f9c4bb804d
@ -25,6 +25,10 @@
|
|||||||
#ifndef TCG_INTERNAL_H
|
#ifndef TCG_INTERNAL_H
|
||||||
#define TCG_INTERNAL_H
|
#define TCG_INTERNAL_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_TCG_INTERPRETER
|
||||||
|
#include <ffi.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TCG_HIGHWATER 1024
|
#define TCG_HIGHWATER 1024
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -57,6 +61,9 @@ typedef struct TCGCallArgumentLoc {
|
|||||||
typedef struct TCGHelperInfo {
|
typedef struct TCGHelperInfo {
|
||||||
void *func;
|
void *func;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
#ifdef CONFIG_TCG_INTERPRETER
|
||||||
|
ffi_cif *cif;
|
||||||
|
#endif
|
||||||
unsigned typemask : 32;
|
unsigned typemask : 32;
|
||||||
unsigned flags : 8;
|
unsigned flags : 8;
|
||||||
unsigned nr_in : 8;
|
unsigned nr_in : 8;
|
||||||
|
30
tcg/tcg.c
30
tcg/tcg.c
@ -62,10 +62,6 @@
|
|||||||
#include "tcg/tcg-ldst.h"
|
#include "tcg/tcg-ldst.h"
|
||||||
#include "tcg-internal.h"
|
#include "tcg-internal.h"
|
||||||
|
|
||||||
#ifdef CONFIG_TCG_INTERPRETER
|
|
||||||
#include <ffi.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Forward declarations for functions declared in tcg-target.c.inc and
|
/* Forward declarations for functions declared in tcg-target.c.inc and
|
||||||
used here. */
|
used here. */
|
||||||
static void tcg_target_init(TCGContext *s);
|
static void tcg_target_init(TCGContext *s);
|
||||||
@ -553,8 +549,6 @@ static TCGHelperInfo all_helpers[] = {
|
|||||||
static GHashTable *helper_table;
|
static GHashTable *helper_table;
|
||||||
|
|
||||||
#ifdef CONFIG_TCG_INTERPRETER
|
#ifdef CONFIG_TCG_INTERPRETER
|
||||||
static GHashTable *ffi_table;
|
|
||||||
|
|
||||||
static ffi_type *typecode_to_ffi(int argmask)
|
static ffi_type *typecode_to_ffi(int argmask)
|
||||||
{
|
{
|
||||||
switch (argmask) {
|
switch (argmask) {
|
||||||
@ -577,9 +571,11 @@ static ffi_type *typecode_to_ffi(int argmask)
|
|||||||
static void init_ffi_layouts(void)
|
static void init_ffi_layouts(void)
|
||||||
{
|
{
|
||||||
/* g_direct_hash/equal for direct comparisons on uint32_t. */
|
/* g_direct_hash/equal for direct comparisons on uint32_t. */
|
||||||
ffi_table = g_hash_table_new(NULL, NULL);
|
GHashTable *ffi_table = g_hash_table_new(NULL, NULL);
|
||||||
|
|
||||||
for (int i = 0; i < ARRAY_SIZE(all_helpers); ++i) {
|
for (int i = 0; i < ARRAY_SIZE(all_helpers); ++i) {
|
||||||
uint32_t typemask = all_helpers[i].typemask;
|
TCGHelperInfo *info = &all_helpers[i];
|
||||||
|
unsigned typemask = info->typemask;
|
||||||
gpointer hash = (gpointer)(uintptr_t)typemask;
|
gpointer hash = (gpointer)(uintptr_t)typemask;
|
||||||
struct {
|
struct {
|
||||||
ffi_cif cif;
|
ffi_cif cif;
|
||||||
@ -587,8 +583,11 @@ static void init_ffi_layouts(void)
|
|||||||
} *ca;
|
} *ca;
|
||||||
ffi_status status;
|
ffi_status status;
|
||||||
int nargs;
|
int nargs;
|
||||||
|
ffi_cif *cif;
|
||||||
|
|
||||||
if (g_hash_table_lookup(ffi_table, hash)) {
|
cif = g_hash_table_lookup(ffi_table, hash);
|
||||||
|
if (cif) {
|
||||||
|
info->cif = cif;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -612,8 +611,12 @@ static void init_ffi_layouts(void)
|
|||||||
ca->cif.rtype, ca->cif.arg_types);
|
ca->cif.rtype, ca->cif.arg_types);
|
||||||
assert(status == FFI_OK);
|
assert(status == FFI_OK);
|
||||||
|
|
||||||
g_hash_table_insert(ffi_table, hash, (gpointer)&ca->cif);
|
cif = &ca->cif;
|
||||||
|
info->cif = cif;
|
||||||
|
g_hash_table_insert(ffi_table, hash, (gpointer)cif);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_hash_table_destroy(ffi_table);
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_TCG_INTERPRETER */
|
#endif /* CONFIG_TCG_INTERPRETER */
|
||||||
|
|
||||||
@ -4393,12 +4396,7 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TCG_INTERPRETER
|
#ifdef CONFIG_TCG_INTERPRETER
|
||||||
{
|
tcg_out_call(s, tcg_call_func(op), info->cif);
|
||||||
gpointer hash = (gpointer)(uintptr_t)info->typemask;
|
|
||||||
ffi_cif *cif = g_hash_table_lookup(ffi_table, hash);
|
|
||||||
assert(cif != NULL);
|
|
||||||
tcg_out_call(s, tcg_call_func(op), cif);
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
tcg_out_call(s, tcg_call_func(op));
|
tcg_out_call(s, tcg_call_func(op));
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user