From 58bdf76da00a2e02d949a86e159497e4edf76b6e Mon Sep 17 00:00:00 2001 From: Dmitry Yakovlev Date: Tue, 23 Apr 2024 17:41:13 +0300 Subject: [PATCH] tcg: add support for 8-argument helpers --- include/exec/helper-gen.h.inc | 16 ++++++++++++++++ include/exec/helper-head.h.inc | 3 +++ include/exec/helper-info.c.inc | 14 ++++++++++++++ include/exec/helper-proto.h.inc | 6 ++++++ include/tcg/tcg.h | 3 +++ tcg/tcg.c | 9 +++++++++ 6 files changed, 51 insertions(+) diff --git a/include/exec/helper-gen.h.inc b/include/exec/helper-gen.h.inc index dabe138e20..c74d86ec0a 100644 --- a/include/exec/helper-gen.h.inc +++ b/include/exec/helper-gen.h.inc @@ -98,6 +98,21 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ dh_arg(t7, 7)); \ } +#define DEF_HELPER_FLAGS_8(name, flags, ret, t1, t2, t3, t4, t5, t6, t7, t8)\ +extern TCGHelperInfo glue(helper_info_, name); \ +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(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \ + dh_arg_decl(t7, 7), dh_arg_decl(t8, 8)) \ +{ \ + tcg_gen_call8(&glue(helper_info_, name), \ + &glue(helper_info_,name), dh_retvar(ret), \ + 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(t7, 7), dh_arg(t8, 8)); \ +} + + #include HELPER_H #undef DEF_HELPER_FLAGS_0 @@ -108,3 +123,4 @@ static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ #undef DEF_HELPER_FLAGS_5 #undef DEF_HELPER_FLAGS_6 #undef DEF_HELPER_FLAGS_7 +#undef DEF_HELPER_FLAGS_8 diff --git a/include/exec/helper-head.h.inc b/include/exec/helper-head.h.inc index 5ef467a79d..fbabc658dd 100644 --- a/include/exec/helper-head.h.inc +++ b/include/exec/helper-head.h.inc @@ -129,6 +129,9 @@ DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) #define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \ DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7) +#define DEF_HELPER_8(name, ret, t1, t2, t3, t4, t5, t6, t7, t8) \ + DEF_HELPER_FLAGS_8(name, 0, ret, t1, t2, t3, t4, t5, t6, t7, t8) + /* MAX_CALL_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ diff --git a/include/exec/helper-info.c.inc b/include/exec/helper-info.c.inc index c551736d49..0dc5266c47 100644 --- a/include/exec/helper-info.c.inc +++ b/include/exec/helper-info.c.inc @@ -83,6 +83,19 @@ | dh_typemask(T6, 6) | dh_typemask(T7, 7) \ }; +#define DEF_HELPER_FLAGS_8(NAME, FLAGS, RET, T1, T2, T3, T4, T5, T6, T7, T8) \ + TCGHelperInfo glue(helper_info_, NAME) = { \ + .func = HELPER(NAME), .name = str(NAME), \ + .flags = FLAGS | dh_callflag(RET), \ + .typemask = dh_typemask(RET, 0) | dh_typemask(T1, 1) \ + | dh_typemask(T2, 2) | dh_typemask(T3, 3) \ + | dh_typemask(T4, 4) | dh_typemask(T5, 5) \ + | dh_typemask(T6, 6) | dh_typemask(T7, 7) \ + | dh_typemask(T8, 8) \ + }; + + + #include HELPER_H #undef str @@ -94,3 +107,4 @@ #undef DEF_HELPER_FLAGS_5 #undef DEF_HELPER_FLAGS_6 #undef DEF_HELPER_FLAGS_7 +#undef DEF_HELPER_FLAGS_8 diff --git a/include/exec/helper-proto.h.inc b/include/exec/helper-proto.h.inc index f8e57e43ce..008a785083 100644 --- a/include/exec/helper-proto.h.inc +++ b/include/exec/helper-proto.h.inc @@ -51,6 +51,11 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ dh_ctype(t4), dh_ctype(t5), dh_ctype(t6), \ dh_ctype(t7)) DEF_HELPER_ATTR; +#define DEF_HELPER_FLAGS_8(name, flags, ret, t1, t2, t3, t4, t5, t6, t7, t8) \ +dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ + dh_ctype(t4), dh_ctype(t5), dh_ctype(t6), \ + dh_ctype(t7), dh_ctype(t8)) DEF_HELPER_ATTR; + #define IN_HELPER_PROTO #include HELPER_H @@ -65,4 +70,5 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ #undef DEF_HELPER_FLAGS_5 #undef DEF_HELPER_FLAGS_6 #undef DEF_HELPER_FLAGS_7 +#undef DEF_HELPER_FLAGS_8 #undef DEF_HELPER_ATTR diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h index 7b3c58bbd7..9b82844dab 100644 --- a/include/tcg/tcg.h +++ b/include/tcg/tcg.h @@ -851,6 +851,9 @@ void tcg_gen_call6(void *func, TCGHelperInfo *, TCGTemp *ret, void tcg_gen_call7(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *); +void tcg_gen_call8(void *func, TCGHelperInfo *, TCGTemp *ret, + TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, + TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *); TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs); void tcg_op_remove(TCGContext *s, TCGOp *op); diff --git a/tcg/tcg.c b/tcg/tcg.c index 4578b185be..6dc3072f92 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -2385,6 +2385,15 @@ void tcg_gen_call7(void *func, TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, tcg_gen_callN(func, info, ret, args); } +void tcg_gen_call8(void *func, TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, + TCGTemp *t2, TCGTemp *t3, TCGTemp *t4, + TCGTemp *t5, TCGTemp *t6, TCGTemp *t7, + TCGTemp *t8) +{ + TCGTemp *args[8] = { t1, t2, t3, t4, t5, t6, t7 , t8}; + tcg_gen_callN(func, info, ret, args); +} + static void tcg_reg_alloc_start(TCGContext *s) { int i, n;