tcg: Pass function pointer to tcg_gen_call*

For normal helpers, read the function pointer from the
structure earlier.  For plugins, this will allow the
function pointer to come from elsewhere.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-03-14 13:48:41 -10:00
parent ed30e7b1d9
commit 83a0ad2673
3 changed files with 52 additions and 38 deletions

View file

@ -14,7 +14,8 @@
extern TCGHelperInfo glue(helper_info_, name); \ extern TCGHelperInfo glue(helper_info_, name); \
static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \ static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \
{ \ { \
tcg_gen_call0(&glue(helper_info_, name), dh_retvar(ret)); \ tcg_gen_call0(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret)); \
} }
#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \ #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
@ -22,7 +23,8 @@ extern TCGHelperInfo glue(helper_info_, name); \
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1)) \ dh_arg_decl(t1, 1)) \
{ \ { \
tcg_gen_call1(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call1(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1)); \ dh_arg(t1, 1)); \
} }
@ -31,7 +33,8 @@ extern TCGHelperInfo glue(helper_info_, name); \
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2)) \ dh_arg_decl(t1, 1), dh_arg_decl(t2, 2)) \
{ \ { \
tcg_gen_call2(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call2(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1), dh_arg(t2, 2)); \ dh_arg(t1, 1), dh_arg(t2, 2)); \
} }
@ -40,7 +43,8 @@ extern TCGHelperInfo glue(helper_info_, name); \
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \ dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \
{ \ { \
tcg_gen_call3(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call3(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3)); \ dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3)); \
} }
@ -50,7 +54,8 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), \ dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), \
dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \ dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \
{ \ { \
tcg_gen_call4(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call4(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1), dh_arg(t2, 2), \ dh_arg(t1, 1), dh_arg(t2, 2), \
dh_arg(t3, 3), dh_arg(t4, 4)); \ dh_arg(t3, 3), dh_arg(t4, 4)); \
} }
@ -61,7 +66,8 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \
dh_arg_decl(t4, 4), dh_arg_decl(t5, 5)) \ dh_arg_decl(t4, 4), dh_arg_decl(t5, 5)) \
{ \ { \
tcg_gen_call5(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call5(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
dh_arg(t4, 4), dh_arg(t5, 5)); \ dh_arg(t4, 4), dh_arg(t5, 5)); \
} }
@ -72,7 +78,8 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \
dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6)) \ dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6)) \
{ \ { \
tcg_gen_call6(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call6(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6)); \ dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6)); \
} }
@ -84,7 +91,8 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \ dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \
dh_arg_decl(t7, 7)) \ dh_arg_decl(t7, 7)) \
{ \ { \
tcg_gen_call7(&glue(helper_info_, name), dh_retvar(ret), \ tcg_gen_call7(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6), \ dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6), \
dh_arg(t7, 7)); \ dh_arg(t7, 7)); \

View file

@ -852,19 +852,22 @@ typedef struct TCGTargetOpDef {
bool tcg_op_supported(TCGOpcode op); bool tcg_op_supported(TCGOpcode op);
void tcg_gen_call0(TCGHelperInfo *, TCGTemp *ret); void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
void tcg_gen_call1(TCGHelperInfo *, TCGTemp *ret, TCGTemp *); void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
void tcg_gen_call2(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *); void tcg_gen_call2(void *func, TCGHelperInfo *, TCGTemp *ret,
void tcg_gen_call3(TCGHelperInfo *, TCGTemp *ret, TCGTemp *,
TCGTemp *, TCGTemp *); TCGTemp *, TCGTemp *);
void tcg_gen_call4(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *, void tcg_gen_call3(void *func, TCGHelperInfo *, TCGTemp *ret,
TCGTemp *, TCGTemp *);
void tcg_gen_call5(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
TCGTemp *, TCGTemp *, TCGTemp *); TCGTemp *, TCGTemp *, TCGTemp *);
void tcg_gen_call6(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *, void tcg_gen_call4(void *func, TCGHelperInfo *, TCGTemp *ret,
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *); TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
void tcg_gen_call7(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *, void tcg_gen_call5(void *func, TCGHelperInfo *, TCGTemp *ret,
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *); TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
void tcg_gen_call6(void *func, TCGHelperInfo *, TCGTemp *ret,
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *,
TCGTemp *, TCGTemp *);
void tcg_gen_call7(void *func, TCGHelperInfo *, TCGTemp *ret,
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *,
TCGTemp *, TCGTemp *, TCGTemp *);
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs); TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
void tcg_op_remove(TCGContext *s, TCGOp *op); void tcg_op_remove(TCGContext *s, TCGOp *op);

View file

@ -2251,7 +2251,8 @@ bool tcg_op_supported(TCGOpcode op)
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs); static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
static void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, TCGTemp **args) static void tcg_gen_callN(void *func, TCGHelperInfo *info,
TCGTemp *ret, TCGTemp **args)
{ {
TCGv_i64 extend_free[MAX_CALL_IARGS]; TCGv_i64 extend_free[MAX_CALL_IARGS];
int n_extend = 0; int n_extend = 0;
@ -2329,7 +2330,7 @@ static void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, TCGTemp **args)
g_assert_not_reached(); g_assert_not_reached();
} }
} }
op->args[pi++] = (uintptr_t)info->func; op->args[pi++] = (uintptr_t)func;
op->args[pi++] = (uintptr_t)info; op->args[pi++] = (uintptr_t)info;
tcg_debug_assert(pi == total_args); tcg_debug_assert(pi == total_args);
@ -2345,56 +2346,58 @@ static void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, TCGTemp **args)
} }
} }
void tcg_gen_call0(TCGHelperInfo *info, TCGTemp *ret) void tcg_gen_call0(void *func, TCGHelperInfo *info, TCGTemp *ret)
{ {
tcg_gen_callN(info, ret, NULL); tcg_gen_callN(func, info, ret, NULL);
} }
void tcg_gen_call1(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1) void tcg_gen_call1(void *func, TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1)
{ {
tcg_gen_callN(info, ret, &t1); tcg_gen_callN(func, info, ret, &t1);
} }
void tcg_gen_call2(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, TCGTemp *t2) void tcg_gen_call2(void *func, TCGHelperInfo *info, TCGTemp *ret,
TCGTemp *t1, TCGTemp *t2)
{ {
TCGTemp *args[2] = { t1, t2 }; TCGTemp *args[2] = { t1, t2 };
tcg_gen_callN(info, ret, args); tcg_gen_callN(func, info, ret, args);
} }
void tcg_gen_call3(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, void tcg_gen_call3(void *func, TCGHelperInfo *info, TCGTemp *ret,
TCGTemp *t2, TCGTemp *t3) TCGTemp *t1, TCGTemp *t2, TCGTemp *t3)
{ {
TCGTemp *args[3] = { t1, t2, t3 }; TCGTemp *args[3] = { t1, t2, t3 };
tcg_gen_callN(info, ret, args); tcg_gen_callN(func, info, ret, args);
} }
void tcg_gen_call4(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, void tcg_gen_call4(void *func, TCGHelperInfo *info, TCGTemp *ret,
TCGTemp *t2, TCGTemp *t3, TCGTemp *t4) TCGTemp *t1, TCGTemp *t2, TCGTemp *t3, TCGTemp *t4)
{ {
TCGTemp *args[4] = { t1, t2, t3, t4 }; TCGTemp *args[4] = { t1, t2, t3, t4 };
tcg_gen_callN(info, ret, args); tcg_gen_callN(func, info, ret, args);
} }
void tcg_gen_call5(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, void tcg_gen_call5(void *func, TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1,
TCGTemp *t2, TCGTemp *t3, TCGTemp *t4, TCGTemp *t5) TCGTemp *t2, TCGTemp *t3, TCGTemp *t4, TCGTemp *t5)
{ {
TCGTemp *args[5] = { t1, t2, t3, t4, t5 }; TCGTemp *args[5] = { t1, t2, t3, t4, t5 };
tcg_gen_callN(info, ret, args); tcg_gen_callN(func, info, ret, args);
} }
void tcg_gen_call6(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, TCGTemp *t2, void tcg_gen_call6(void *func, TCGHelperInfo *info, TCGTemp *ret,
TCGTemp *t3, TCGTemp *t4, TCGTemp *t5, TCGTemp *t6) TCGTemp *t1, TCGTemp *t2, TCGTemp *t3,
TCGTemp *t4, TCGTemp *t5, TCGTemp *t6)
{ {
TCGTemp *args[6] = { t1, t2, t3, t4, t5, t6 }; TCGTemp *args[6] = { t1, t2, t3, t4, t5, t6 };
tcg_gen_callN(info, ret, args); tcg_gen_callN(func, info, ret, args);
} }
void tcg_gen_call7(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, void tcg_gen_call7(void *func, TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1,
TCGTemp *t2, TCGTemp *t3, TCGTemp *t4, TCGTemp *t2, TCGTemp *t3, TCGTemp *t4,
TCGTemp *t5, TCGTemp *t6, TCGTemp *t7) TCGTemp *t5, TCGTemp *t6, TCGTemp *t7)
{ {
TCGTemp *args[7] = { t1, t2, t3, t4, t5, t6, t7 }; TCGTemp *args[7] = { t1, t2, t3, t4, t5, t6, t7 };
tcg_gen_callN(info, ret, args); tcg_gen_callN(func, info, ret, args);
} }
static void tcg_reg_alloc_start(TCGContext *s) static void tcg_reg_alloc_start(TCGContext *s)