[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 40/43] tcg: Factor init_ffi_layouts() out of tcg_context_init(
From: |
Richard Henderson |
Subject: |
[PATCH v5 40/43] tcg: Factor init_ffi_layouts() out of tcg_context_init() |
Date: |
Sat, 24 Dec 2022 15:57:17 -0800 |
From: Philippe Mathieu-Daudé <philmd@linaro.org>
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>
---
tcg/tcg.c | 83 +++++++++++++++++++++++++++++--------------------------
1 file changed, 44 insertions(+), 39 deletions(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 46cce228a0..3c3bb2d422 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -573,7 +573,49 @@ static ffi_type *typecode_to_ffi(int argmask)
}
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 {
int arg_idx; /* tcg_gen_callN args[] */
@@ -768,44 +810,7 @@ static void tcg_context_init(unsigned max_cpus)
}
#ifdef CONFIG_TCG_INTERPRETER
- /* g_direct_hash/equal for direct comparisons on uint32_t. */
- 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);
- }
+ init_ffi_layouts();
#endif
tcg_target_init(s);
--
2.34.1
- [PATCH v5 34/43] accel/tcg/plugin: Use copy_op in append_{udata, mem}_cb, (continued)
- [PATCH v5 34/43] accel/tcg/plugin: Use copy_op in append_{udata, mem}_cb, Richard Henderson, 2022/12/24
- [PATCH v5 33/43] accel/tcg/plugin: Avoid duplicate copy in copy_call, Richard Henderson, 2022/12/24
- [PATCH v5 39/43] tcg: Convert typecode_to_ffi from array to function, Richard Henderson, 2022/12/24
- [PATCH v5 27/43] tcg: Introduce tcg_type_size, Richard Henderson, 2022/12/24
- [PATCH v5 29/43] tcg: Replace TCG_TARGET_CALL_ALIGN_ARGS with TCG_TARGET_CALL_ARG_I64, Richard Henderson, 2022/12/24
- [PATCH v5 32/43] accel/tcg/plugin: Don't search for the function pointer index, Richard Henderson, 2022/12/24
- [PATCH v5 36/43] tcg: Vary the allocation size for TCGOp, Richard Henderson, 2022/12/24
- [PATCH v5 38/43] tcg: Reorg function calls, Richard Henderson, 2022/12/24
- [PATCH v5 19/43] tcg: Introduce paired register allocation, Richard Henderson, 2022/12/24
- [PATCH v5 31/43] tcg: Use TCG_CALL_ARG_EVEN for TCI special case, Richard Henderson, 2022/12/24
- [PATCH v5 40/43] tcg: Factor init_ffi_layouts() out of tcg_context_init(),
Richard Henderson <=
- [PATCH v5 42/43] tcg/aarch64: Merge tcg_out_callr into tcg_out_call, Richard Henderson, 2022/12/24
- [PATCH v5 41/43] tcg: Move ffi_cif pointer into TCGHelperInfo, Richard Henderson, 2022/12/24
- [PATCH v5 43/43] tcg: Add TCGHelperInfo argument to tcg_out_call, Richard Henderson, 2022/12/24