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