On 22/11/24, Richard Henderson wrote:
> On 11/20/24 19:49, Anton Johansson wrote:
> > Adds a function pointer to the TCGContext which may be set by targets via
> > the TARGET_HELPER_DISPATCHER macro. The dispatcher is function
> >
> > (void *func, TCGTemp *ret, int nargs, TCGTemp **args) -> bool
> >
> > which allows targets to hook the generation of helper calls in TCG and
> > take over translation. Specifically, this will be used by helper-to-tcg
> > to replace helper function translation, without having to modify frontends.
> >
> > Signed-off-by: Anton Johansson <[email protected]>
> > ---
> > accel/tcg/translate-all.c | 4 ++++
> > include/tcg/tcg.h | 4 ++++
> > tcg/tcg.c | 5 +++++
> > 3 files changed, 13 insertions(+)
>
> I guess I'll have to read further to understand this, but my first reaction
> is: why would we not modify how the gen_helper_* functions are defined
> instead?
Hmm this might be a better idea, and we could call the generated could
directly without having to go through a massive switch statement. What
I have in mind is something like
#if !glue(OVERRIDE_HELPER_, name) \
#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
extern TCGHelperInfo glue(helper_info_, name); \
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
dh_arg_decl(t1, 1)) \
{ \
tcg_gen_call1(glue(helper_info_,name).func, \
&glue(helper_info_,name), dh_retvar(ret), \
dh_arg(t1, 1)); \
} \
#endif
and we could emit gen_helper_* for helpers which are translated and
redefine OVERRIDE_HELPER_* to 1 (would have to be defaulted to 0
somewhere else).
//Anton