Hi Richard, On 12/15/2017 02:07 PM, Richard Henderson wrote: > We already handle this in the backends, and the lifetime datum > for the TCGOp is already large enough. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > include/exec/helper-gen.h | 11 +++++++++++ > include/exec/helper-head.h | 2 ++ > include/exec/helper-proto.h | 5 +++++ > include/exec/helper-tcg.h | 7 +++++++ > tcg/tcg.h | 2 +- > tcg/tci.c | 12 ++++++++---- > tcg/tci/tcg-target.inc.c | 6 ++++-- > 7 files changed, 38 insertions(+), 7 deletions(-) > > diff --git a/include/exec/helper-gen.h b/include/exec/helper-gen.h > index 15204ab961..22381a1708 100644 > --- a/include/exec/helper-gen.h > +++ b/include/exec/helper-gen.h > @@ -56,6 +56,16 @@ static inline void glue(gen_helper_, > name)(dh_retvar_decl(ret) \ > tcg_gen_callN(HELPER(name), dh_retvar(ret), 5, args); \ > } > > +#define DEF_HELPER_FLAGS_6(name, flags, ret, t1, t2, t3, t4, t5, t6) \ > +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(HELPER(name), dh_retvar(ret), 6, args); \ > +} > + > #include "helper.h" > #include "trace/generated-helpers.h" > #include "trace/generated-helpers-wrappers.h" > @@ -67,6 +77,7 @@ static inline void glue(gen_helper_, > name)(dh_retvar_decl(ret) \ > #undef DEF_HELPER_FLAGS_3 > #undef DEF_HELPER_FLAGS_4 > #undef DEF_HELPER_FLAGS_5 > +#undef DEF_HELPER_FLAGS_6 > #undef GEN_HELPER > > #endif /* HELPER_GEN_H */ > diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h > index 639eefdbc0..e1fd08f2ba 100644 > --- a/include/exec/helper-head.h > +++ b/include/exec/helper-head.h > @@ -125,6 +125,8 @@ > DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) > #define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ > DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) > +#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ > + DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) > > /* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. > */ > > diff --git a/include/exec/helper-proto.h b/include/exec/helper-proto.h > index 954bef85ce..74943edb13 100644 > --- a/include/exec/helper-proto.h > +++ b/include/exec/helper-proto.h > @@ -26,6 +26,10 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), > dh_ctype(t3), \ > dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ > dh_ctype(t4), dh_ctype(t5)); > > +#define DEF_HELPER_FLAGS_6(name, flags, ret, t1, t2, t3, t4, t5, t6) \ > +dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ > + dh_ctype(t4), dh_ctype(t5), dh_ctype(t6)); > + > #include "helper.h" > #include "trace/generated-helpers.h" > #include "tcg-runtime.h" > @@ -36,5 +40,6 @@ dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), > dh_ctype(t3), \ > #undef DEF_HELPER_FLAGS_3 > #undef DEF_HELPER_FLAGS_4 > #undef DEF_HELPER_FLAGS_5 > +#undef DEF_HELPER_FLAGS_6 > > #endif /* HELPER_PROTO_H */ > diff --git a/include/exec/helper-tcg.h b/include/exec/helper-tcg.h > index b0c5bafa99..b3bdb0c399 100644 > --- a/include/exec/helper-tcg.h > +++ b/include/exec/helper-tcg.h > @@ -39,6 +39,12 @@ > | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) \ > | dh_sizemask(t5, 5) }, > > +#define DEF_HELPER_FLAGS_6(NAME, FLAGS, ret, t1, t2, t3, t4, t5, t6) \ > + { .func = HELPER(NAME), .name = str(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) | dh_sizemask(t6, 6) }, > + > #include "helper.h" > #include "trace/generated-helpers.h" > #include "tcg-runtime.h" > @@ -50,5 +56,6 @@ > #undef DEF_HELPER_FLAGS_3 > #undef DEF_HELPER_FLAGS_4 > #undef DEF_HELPER_FLAGS_5 > +#undef DEF_HELPER_FLAGS_6 > > #endif /* HELPER_TCG_H */ > diff --git a/tcg/tcg.h b/tcg/tcg.h > index 8c45f7edbc..2ce497cebf 100644 > --- a/tcg/tcg.h > +++ b/tcg/tcg.h > @@ -41,7 +41,7 @@ > #else > #define MAX_OPC_PARAM_PER_ARG 1 > #endif > -#define MAX_OPC_PARAM_IARGS 5 > +#define MAX_OPC_PARAM_IARGS 6 > #define MAX_OPC_PARAM_OARGS 1 > #define MAX_OPC_PARAM_ARGS (MAX_OPC_PARAM_IARGS + MAX_OPC_PARAM_OARGS) > > diff --git a/tcg/tci.c b/tcg/tci.c > index 63f2cd54ab..33edca1903 100644 > --- a/tcg/tci.c > +++ b/tcg/tci.c > @@ -40,11 +40,12 @@ > tcg_abort(); \ > } while (0) > > -#if MAX_OPC_PARAM_IARGS != 5 > +#if MAX_OPC_PARAM_IARGS != 6 > # error Fix needed, number of supported input arguments changed! > #endif > #if TCG_TARGET_REG_BITS == 32 > typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong, > + tcg_target_ulong, tcg_target_ulong, > tcg_target_ulong, tcg_target_ulong, > tcg_target_ulong, tcg_target_ulong, > tcg_target_ulong, tcg_target_ulong, > @@ -52,7 +53,7 @@ typedef uint64_t (*helper_function)(tcg_target_ulong, > tcg_target_ulong, > #else > typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong, > tcg_target_ulong, tcg_target_ulong, > - tcg_target_ulong); > + tcg_target_ulong, tcg_target_ulong); > #endif > > static tcg_target_ulong tci_read_reg(const tcg_target_ulong *regs, TCGReg > index) > @@ -520,7 +521,9 @@ uintptr_t tcg_qemu_tb_exec(CPUArchState *env, uint8_t > *tb_ptr) > tci_read_reg(regs, TCG_REG_R7), > tci_read_reg(regs, TCG_REG_R8), > tci_read_reg(regs, TCG_REG_R9), > - tci_read_reg(regs, TCG_REG_R10)); > + tci_read_reg(regs, TCG_REG_R10), > + tci_read_reg(regs, TCG_REG_R11), > + tci_read_reg(regs, TCG_REG_R12)); > tci_write_reg(regs, TCG_REG_R0, tmp64); > tci_write_reg(regs, TCG_REG_R1, tmp64 >> 32); > #else > @@ -528,7 +531,8 @@ uintptr_t tcg_qemu_tb_exec(CPUArchState *env, uint8_t > *tb_ptr) > tci_read_reg(regs, TCG_REG_R1), > tci_read_reg(regs, TCG_REG_R2), > tci_read_reg(regs, TCG_REG_R3), > - tci_read_reg(regs, TCG_REG_R5)); > + tci_read_reg(regs, TCG_REG_R5), > + tci_read_reg(regs, TCG_REG_R6)); > tci_write_reg(regs, TCG_REG_R0, tmp64); > #endif > break; > diff --git a/tcg/tci/tcg-target.inc.c b/tcg/tci/tcg-target.inc.c > index 913c3802a3..cc949bea85 100644 > --- a/tcg/tci/tcg-target.inc.c > +++ b/tcg/tci/tcg-target.inc.c > @@ -292,7 +292,7 @@ static const int tcg_target_reg_alloc_order[] = { > #endif > }; > > -#if MAX_OPC_PARAM_IARGS != 5 > +#if MAX_OPC_PARAM_IARGS != 6 > # error Fix needed, number of supported input arguments changed! > #endif > > @@ -305,14 +305,16 @@ static const int tcg_target_call_iarg_regs[] = { > TCG_REG_R4, > #endif > TCG_REG_R5, > + TCG_REG_R6, > #if TCG_TARGET_REG_BITS == 32 > /* 32 bit hosts need 2 * MAX_OPC_PARAM_IARGS registers. */ > - TCG_REG_R6, > TCG_REG_R7,
I think now TCG_REG_R8 belongs here... > #if TCG_TARGET_NB_REGS >= 16 > TCG_REG_R8, ^ not here. > TCG_REG_R9, > TCG_REG_R10, > + TCG_REG_R11, > + TCG_REG_R12, > #else > # error Too few input registers available > #endif >