15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Helper file for declaring TCG helper functions.
25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   Should be included at the start and end of target-foo/helper.h.
35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   functions.  Names should be specified without the helper_ prefix, and
65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   the return and argument types specified.  3 basic types are understood
75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   (i32, i64 and ptr).  Additional aliases are provided for convenience and
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   to match the types used by the C helper implementation.
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   The target helper.h should be included in all files that use/define
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   helper functions.  THis will ensure that function prototypes are
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   consistent.  In addition it should be included an extra two times for
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   helper.c, defining:
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    GEN_HELPER 1 to produce op generation functions (gen_helper_*)
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    GEN_HELPER 2 to do runtime registration helper functions.
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef DEF_HELPER_H
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_H 1
205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define HELPER(name) glue(helper_, name)
225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_i32 GET_TCGV_I32
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_i64 GET_TCGV_I64
255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GET_TCGV_ptr GET_TCGV_PTR
265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Some types that make sense in C, but not for TCG.  */
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_i32 i32
295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_s32 i32
305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_int i32
315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_i64 i64
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_s64 i64
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_f32 i32
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_f64 i64
355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if TARGET_LONG_BITS == 32
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_tl i32
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else
385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_tl i64
395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_ptr ptr
415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_void void
4263ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_alias_noreturn noreturn
435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias_env ptr
445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_alias(t) glue(dh_alias_, t)
455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_i32 uint32_t
475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_s32 int32_t
485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_int int
495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_i64 uint64_t
505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_s64 int64_t
515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_f32 float32
525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_f64 float64
535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_tl target_ulong
545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_ptr void *
555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype_void void
5663ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_ctype_noreturn void QEMU_NORETURN
5763ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_ctype_env CPUArchState *
585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_ctype(t) dh_ctype_##t
595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* We can't use glue() here because it falls foul of C preprocessor
615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner   recursive expansion rules.  */
625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl0_void void
6363ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_retvar_decl0_noreturn void
645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl0_i32 TCGv_i32 retval
655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl0_i64 TCGv_i64 retval
669251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner#define dh_retvar_decl0_ptr TCGv_ptr retval
675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl_void
7063ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_retvar_decl_noreturn
715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl_i32 TCGv_i32 retval,
725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl_i64 TCGv_i64 retval,
739251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner#define dh_retvar_decl_ptr TCGv_ptr retval,
745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_void TCG_CALL_DUMMY_ARG
7763ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_retvar_noreturn TCG_CALL_DUMMY_ARG
785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_i32 GET_TCGV_i32(retval)
795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_i64 GET_TCGV_i64(retval)
805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar_ptr GET_TCGV_ptr(retval)
815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_is_64bit_void 0
8463ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_is_64bit_noreturn 0
855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_is_64bit_i32 0
865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_is_64bit_i64 1
875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_is_64bit_ptr (TCG_TARGET_REG_BITS == 64)
885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
90f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_void 0
9163ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define dh_is_signed_noreturn 0
92f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_i32 0
93f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_s32 1
94f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_i64 0
95f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_s64 1
96f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_f32 0
97f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_f64 0
98f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_tl  0
99f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_int 1
100f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner/* ??? This is highly specific to the host cpu.  There are even special
101f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner   extension instructions that may be required, e.g. ia64's addp4.  But
102f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner   for now we don't support any 64-bit targets with 32-bit pointers.  */
103f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_ptr 0
104f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed_env dh_is_signed_ptr
105f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_is_signed(t) dh_is_signed_##t
106f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner
107f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define dh_sizemask(t, n) \
108f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  sizemask |= dh_is_64bit(t) << (n*2); \
109f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  sizemask |= dh_is_signed(t) << (n*2+1)
110f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner
1115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_arg(t, n) \
1125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  args[n - 1] = glue(GET_TCGV_, dh_alias(t))(glue(arg, n)); \
113f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  dh_sizemask(t, n)
1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_0(name, ret) \
1195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DEF_HELPER_FLAGS_0(name, 0, ret)
1205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_1(name, ret, t1) \
1215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DEF_HELPER_FLAGS_1(name, 0, ret, t1)
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_2(name, ret, t1, t2) \
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
1245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_3(name, ret, t1, t2, t3) \
1255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
1265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
12863ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \
12963ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner    DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5)
13063ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner
13163ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner/* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
1325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif /* DEF_HELPER_H */
1345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef GEN_HELPER
1365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Function prototypes.  */
1375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_0(name, flags, ret) \
1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerdh_ctype(ret) HELPER(name) (void);
1405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
1425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerdh_ctype(ret) HELPER(name) (dh_ctype(t1));
1435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
1455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerdh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2));
1465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
1485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerdh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3));
1495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
1515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerdh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
1525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                   dh_ctype(t4));
1535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
15463ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \
15563ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turnerdh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
15663ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner                            dh_ctype(t4), dh_ctype(t5));
15763ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner
1585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_HELPER
1595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GEN_HELPER -1
1605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif GEN_HELPER == 1
1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Gen functions.  */
1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_0(name, flags, ret) \
1655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \
1665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ \
1675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  int sizemask; \
1685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  sizemask = dh_is_64bit(ret); \
1695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 0, NULL); \
1705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
1735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1)) \
1745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ \
1755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  TCGArg args[1]; \
176f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  int sizemask = 0; \
177f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  dh_sizemask(ret, 0); \
1785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t1, 1); \
1795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 1, args); \
1805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
1835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
1845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    dh_arg_decl(t2, 2)) \
1855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ \
1865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  TCGArg args[2]; \
187f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  int sizemask = 0; \
188f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  dh_sizemask(ret, 0); \
1895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t1, 1); \
1905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t2, 2); \
1915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 2, args); \
1925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
1935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
1955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
1965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \
1975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ \
1985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  TCGArg args[3]; \
199f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  int sizemask = 0; \
200f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  dh_sizemask(ret, 0); \
2015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t1, 1); \
2025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t2, 2); \
2035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t3, 3); \
2045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 3, args); \
2055d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
2065d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2075d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
2085d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
2095d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \
2105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ \
2115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  TCGArg args[4]; \
212f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  int sizemask = 0; \
213f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner  dh_sizemask(ret, 0); \
2145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t1, 1); \
2155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t2, 2); \
2165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t3, 3); \
2175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  dh_arg(t4, 4); \
2185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 4, args); \
2195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
22163ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \
22263ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turnerstatic inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
22363ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner    dh_arg_decl(t1, 1),  dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \
22463ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner    dh_arg_decl(t4, 4), dh_arg_decl(t5, 5)) \
22563ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner{ \
22663ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  TCGArg args[5]; \
22763ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  int sizemask = 0; \
22863ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  dh_sizemask(ret, 0); \
22963ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  dh_arg(t1, 1); \
23063ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  dh_arg(t2, 2); \
23163ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  dh_arg(t3, 3); \
23263ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  dh_arg(t4, 4); \
23363ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  dh_arg(t5, 5); \
23463ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner  tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 5, args); \
23563ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner}
23663ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner
2375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_HELPER
2385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GEN_HELPER -1
2395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif GEN_HELPER == 2
2415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Register helpers.  */
2425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
24326d285dfa9f482e5b2f6d6df2bcb0eaed06cb1a9David 'Digit' Turner#define DEF_HELPER_FLAGS_0(name, flags, ret)  { HELPER(name), #name },
2445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
2465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDEF_HELPER_FLAGS_0(name, flags, ret)
2475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
2495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDEF_HELPER_FLAGS_0(name, flags, ret)
2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
2525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDEF_HELPER_FLAGS_0(name, flags, ret)
2535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerDEF_HELPER_FLAGS_0(name, flags, ret)
2565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
25763ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \
25863ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' TurnerDEF_HELPER_FLAGS_0(name, flags, ret)
25963ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner
2605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_HELPER
2615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define GEN_HELPER -1
2625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif GEN_HELPER == -1
2645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* Undefine macros.  */
2655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF_HELPER_FLAGS_0
2675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF_HELPER_FLAGS_1
2685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF_HELPER_FLAGS_2
2695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF_HELPER_FLAGS_3
2705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef DEF_HELPER_FLAGS_4
27163ee0557e9677ead2c20cfffc2f30e426ec6e8abDavid 'Digit' Turner#undef DEF_HELPER_FLAGS_5
2725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#undef GEN_HELPER
2735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
275