tcg: Split tcg_gen_callN
Make tcg_gen_callN a static function. Create tcg_gen_call[0-7] functions for use by helper-gen.h.inc. Removes a multiplicty of calls to __stack_chk_fail, saving up to 143kiB of .text space as measured on an x86_64 host. Old New Less %Change 8888680 8741816 146864 1.65% qemu-system-aarch64 5911832 5856152 55680 0.94% qemu-system-riscv64 5816728 5767512 49216 0.85% qemu-system-mips64 6707832 6659144 48688 0.73% qemu-system-ppc64 Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
177f648f0e
commit
a3a692b8bf
@ -17,7 +17,7 @@
|
||||
extern TCGHelperInfo glue(helper_info_, name); \
|
||||
static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \
|
||||
{ \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 0, NULL); \
|
||||
tcg_gen_call0(&glue(helper_info_, name), dh_retvar(ret)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
|
||||
@ -25,8 +25,8 @@ extern TCGHelperInfo glue(helper_info_, name); \
|
||||
static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
|
||||
dh_arg_decl(t1, 1)) \
|
||||
{ \
|
||||
TCGTemp *args[1] = { dh_arg(t1, 1) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 1, args); \
|
||||
tcg_gen_call1(&glue(helper_info_, name), dh_retvar(ret), \
|
||||
dh_arg(t1, 1)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
|
||||
@ -34,8 +34,8 @@ 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)) \
|
||||
{ \
|
||||
TCGTemp *args[2] = { dh_arg(t1, 1), dh_arg(t2, 2) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 2, args); \
|
||||
tcg_gen_call2(&glue(helper_info_, name), dh_retvar(ret), \
|
||||
dh_arg(t1, 1), dh_arg(t2, 2)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
|
||||
@ -43,8 +43,8 @@ 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)) \
|
||||
{ \
|
||||
TCGTemp *args[3] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 3, args); \
|
||||
tcg_gen_call3(&glue(helper_info_, name), dh_retvar(ret), \
|
||||
dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
|
||||
@ -53,9 +53,9 @@ 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)) \
|
||||
{ \
|
||||
TCGTemp *args[4] = { dh_arg(t1, 1), dh_arg(t2, 2), \
|
||||
dh_arg(t3, 3), dh_arg(t4, 4) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 4, args); \
|
||||
tcg_gen_call4(&glue(helper_info_, name), dh_retvar(ret), \
|
||||
dh_arg(t1, 1), dh_arg(t2, 2), \
|
||||
dh_arg(t3, 3), dh_arg(t4, 4)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \
|
||||
@ -64,9 +64,9 @@ 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)) \
|
||||
{ \
|
||||
TCGTemp *args[5] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
|
||||
dh_arg(t4, 4), dh_arg(t5, 5) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 5, args); \
|
||||
tcg_gen_call5(&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)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_6(name, flags, ret, t1, t2, t3, t4, t5, t6) \
|
||||
@ -75,9 +75,9 @@ 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)) \
|
||||
{ \
|
||||
TCGTemp *args[6] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \
|
||||
dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 6, args); \
|
||||
tcg_gen_call6(&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)); \
|
||||
}
|
||||
|
||||
#define DEF_HELPER_FLAGS_7(name, flags, ret, t1, t2, t3, t4, t5, t6, t7)\
|
||||
@ -87,10 +87,10 @@ 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(t7, 7)) \
|
||||
{ \
|
||||
TCGTemp *args[7] = { 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) }; \
|
||||
tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 7, args); \
|
||||
tcg_gen_call7(&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)); \
|
||||
}
|
||||
|
||||
#include "helper.h"
|
||||
|
@ -939,7 +939,19 @@ typedef struct TCGTargetOpDef {
|
||||
|
||||
bool tcg_op_supported(TCGOpcode op);
|
||||
|
||||
void tcg_gen_callN(TCGHelperInfo *, TCGTemp *ret, int nargs, TCGTemp **args);
|
||||
void tcg_gen_call0(TCGHelperInfo *, TCGTemp *ret);
|
||||
void tcg_gen_call1(TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
|
||||
void tcg_gen_call2(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *);
|
||||
void tcg_gen_call3(TCGHelperInfo *, TCGTemp *ret, TCGTemp *,
|
||||
TCGTemp *, TCGTemp *);
|
||||
void tcg_gen_call4(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
|
||||
TCGTemp *, TCGTemp *);
|
||||
void tcg_gen_call5(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
|
||||
TCGTemp *, TCGTemp *, TCGTemp *);
|
||||
void tcg_gen_call6(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
|
||||
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
|
||||
void tcg_gen_call7(TCGHelperInfo *, TCGTemp *ret, TCGTemp *, TCGTemp *,
|
||||
TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *, TCGTemp *);
|
||||
|
||||
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
|
||||
void tcg_op_remove(TCGContext *s, TCGOp *op);
|
||||
|
54
tcg/tcg.c
54
tcg/tcg.c
@ -2127,7 +2127,7 @@ bool tcg_op_supported(TCGOpcode op)
|
||||
|
||||
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
|
||||
|
||||
void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, int nargs, TCGTemp **args)
|
||||
static void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, TCGTemp **args)
|
||||
{
|
||||
TCGv_i64 extend_free[MAX_CALL_IARGS];
|
||||
int n_extend = 0;
|
||||
@ -2217,6 +2217,58 @@ void tcg_gen_callN(TCGHelperInfo *info, TCGTemp *ret, int nargs, TCGTemp **args)
|
||||
}
|
||||
}
|
||||
|
||||
void tcg_gen_call0(TCGHelperInfo *info, TCGTemp *ret)
|
||||
{
|
||||
tcg_gen_callN(info, ret, NULL);
|
||||
}
|
||||
|
||||
void tcg_gen_call1(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1)
|
||||
{
|
||||
tcg_gen_callN(info, ret, &t1);
|
||||
}
|
||||
|
||||
void tcg_gen_call2(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, TCGTemp *t2)
|
||||
{
|
||||
TCGTemp *args[2] = { t1, t2 };
|
||||
tcg_gen_callN(info, ret, args);
|
||||
}
|
||||
|
||||
void tcg_gen_call3(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1,
|
||||
TCGTemp *t2, TCGTemp *t3)
|
||||
{
|
||||
TCGTemp *args[3] = { t1, t2, t3 };
|
||||
tcg_gen_callN(info, ret, args);
|
||||
}
|
||||
|
||||
void tcg_gen_call4(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1,
|
||||
TCGTemp *t2, TCGTemp *t3, TCGTemp *t4)
|
||||
{
|
||||
TCGTemp *args[4] = { t1, t2, t3, t4 };
|
||||
tcg_gen_callN(info, ret, args);
|
||||
}
|
||||
|
||||
void tcg_gen_call5(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1,
|
||||
TCGTemp *t2, TCGTemp *t3, TCGTemp *t4, TCGTemp *t5)
|
||||
{
|
||||
TCGTemp *args[5] = { t1, t2, t3, t4, t5 };
|
||||
tcg_gen_callN(info, ret, args);
|
||||
}
|
||||
|
||||
void tcg_gen_call6(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1, TCGTemp *t2,
|
||||
TCGTemp *t3, TCGTemp *t4, TCGTemp *t5, TCGTemp *t6)
|
||||
{
|
||||
TCGTemp *args[6] = { t1, t2, t3, t4, t5, t6 };
|
||||
tcg_gen_callN(info, ret, args);
|
||||
}
|
||||
|
||||
void tcg_gen_call7(TCGHelperInfo *info, TCGTemp *ret, TCGTemp *t1,
|
||||
TCGTemp *t2, TCGTemp *t3, TCGTemp *t4,
|
||||
TCGTemp *t5, TCGTemp *t6, TCGTemp *t7)
|
||||
{
|
||||
TCGTemp *args[7] = { t1, t2, t3, t4, t5, t6, t7 };
|
||||
tcg_gen_callN(info, ret, args);
|
||||
}
|
||||
|
||||
static void tcg_reg_alloc_start(TCGContext *s)
|
||||
{
|
||||
int i, n;
|
||||
|
Loading…
Reference in New Issue
Block a user