Richard Henderson <[email protected]> writes:
> Signed-off-by: Richard Henderson <[email protected]>
> ---
<snip>
> +#define DEF_HELPER_FLAGS_0(NAME, FLAGS, ret) \
> + { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
> + .sizemask = dh_sizemask(ret, 0) },
> +
> +#define DEF_HELPER_FLAGS_1(NAME, FLAGS, ret, t1) \
> + { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
> + .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) },
> +
> +#define DEF_HELPER_FLAGS_2(NAME, FLAGS, ret, t1, t2) \
> + { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
> + .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
> + | dh_sizemask(t2, 2) },
> +
> +#define DEF_HELPER_FLAGS_3(NAME, FLAGS, ret, t1, t2, t3) \
> + { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
> + .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
> + | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) },
> +
> +#define DEF_HELPER_FLAGS_4(NAME, FLAGS, ret, t1, t2, t3, t4) \
> + { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
> + .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
> + | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) },
> +
> +#define DEF_HELPER_FLAGS_5(NAME, FLAGS, ret, t1, t2, t3, t4, t5) \
> + { .func = HELPER(NAME), .name = #NAME, .flags = FLAGS, \
> + .sizemask = dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \
> + | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) \
> + | dh_sizemask(t5, 5) },
I'll come back to this when I understand the sizemask stuff better.
>
> #include "helper.h"
> #include "tcg-runtime.h"
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index 3bbf982..d71a9bf 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -310,6 +310,8 @@ void tcg_pool_reset(TCGContext *s)
> typedef struct TCGHelperInfo {
> void *func;
> const char *name;
> + unsigned flags;
> + unsigned sizemask;
> } TCGHelperInfo;
>
> #include "exec/helper-proto.h"
> @@ -696,6 +698,11 @@ void tcg_gen_callN(TCGContext *s, void *func, unsigned
> int flags,
> int real_args;
> int nb_rets;
> TCGArg *nparam;
> + TCGHelperInfo *info;
> +
> + info = g_hash_table_lookup(s->helpers, (gpointer)func);
> + assert(info != NULL);
> + assert(info->sizemask == sizemask);
I assume g_assert vs assert is purely cosmetic? QEMU seems inconsistent
at best about this :-/
>
> #if defined(__sparc__) && !defined(__arch64__) \
> && !defined(CONFIG_TCG_INTERPRETER)
--
Alex Bennée