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


Reply via email to