helper-head.h (4606B)
1/* Helper file for declaring TCG helper functions. 2 Used by other helper files. 3 4 Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper 5 functions. Names should be specified without the helper_ prefix, and 6 the return and argument types specified. 3 basic types are understood 7 (i32, i64 and ptr). Additional aliases are provided for convenience and 8 to match the types used by the C helper implementation. 9 10 The target helper.h should be included in all files that use/define 11 helper functions. THis will ensure that function prototypes are 12 consistent. In addition it should be included an extra two times for 13 helper.c, defining: 14 GEN_HELPER 1 to produce op generation functions (gen_helper_*) 15 GEN_HELPER 2 to do runtime registration helper functions. 16 */ 17 18#ifndef EXEC_HELPER_HEAD_H 19#define EXEC_HELPER_HEAD_H 20 21#define HELPER(name) glue(helper_, name) 22 23/* Some types that make sense in C, but not for TCG. */ 24#define dh_alias_i32 i32 25#define dh_alias_s32 i32 26#define dh_alias_int i32 27#define dh_alias_i64 i64 28#define dh_alias_s64 i64 29#define dh_alias_f16 i32 30#define dh_alias_f32 i32 31#define dh_alias_f64 i64 32#define dh_alias_ptr ptr 33#define dh_alias_cptr ptr 34#define dh_alias_void void 35#define dh_alias_noreturn noreturn 36#define dh_alias(t) glue(dh_alias_, t) 37 38#define dh_ctype_i32 uint32_t 39#define dh_ctype_s32 int32_t 40#define dh_ctype_int int 41#define dh_ctype_i64 uint64_t 42#define dh_ctype_s64 int64_t 43#define dh_ctype_f16 uint32_t 44#define dh_ctype_f32 float32 45#define dh_ctype_f64 float64 46#define dh_ctype_ptr void * 47#define dh_ctype_cptr const void * 48#define dh_ctype_void void 49#define dh_ctype_noreturn void QEMU_NORETURN 50#define dh_ctype(t) dh_ctype_##t 51 52#ifdef NEED_CPU_H 53# ifdef TARGET_LONG_BITS 54# if TARGET_LONG_BITS == 32 55# define dh_alias_tl i32 56# else 57# define dh_alias_tl i64 58# endif 59# endif 60# define dh_alias_env ptr 61# define dh_ctype_tl target_ulong 62# define dh_ctype_env CPUArchState * 63#endif 64 65/* We can't use glue() here because it falls foul of C preprocessor 66 recursive expansion rules. */ 67#define dh_retvar_decl0_void void 68#define dh_retvar_decl0_noreturn void 69#define dh_retvar_decl0_i32 TCGv_i32 retval 70#define dh_retvar_decl0_i64 TCGv_i64 retval 71#define dh_retvar_decl0_ptr TCGv_ptr retval 72#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) 73 74#define dh_retvar_decl_void 75#define dh_retvar_decl_noreturn 76#define dh_retvar_decl_i32 TCGv_i32 retval, 77#define dh_retvar_decl_i64 TCGv_i64 retval, 78#define dh_retvar_decl_ptr TCGv_ptr retval, 79#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) 80 81#define dh_retvar_void NULL 82#define dh_retvar_noreturn NULL 83#define dh_retvar_i32 tcgv_i32_temp(retval) 84#define dh_retvar_i64 tcgv_i64_temp(retval) 85#define dh_retvar_ptr tcgv_ptr_temp(retval) 86#define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) 87 88#define dh_typecode_void 0 89#define dh_typecode_noreturn 0 90#define dh_typecode_i32 2 91#define dh_typecode_s32 3 92#define dh_typecode_i64 4 93#define dh_typecode_s64 5 94#define dh_typecode_ptr 6 95#define dh_typecode(t) glue(dh_typecode_, dh_alias(t)) 96 97#define dh_callflag_i32 0 98#define dh_callflag_s32 0 99#define dh_callflag_int 0 100#define dh_callflag_i64 0 101#define dh_callflag_s64 0 102#define dh_callflag_f16 0 103#define dh_callflag_f32 0 104#define dh_callflag_f64 0 105#define dh_callflag_ptr 0 106#define dh_callflag_cptr dh_callflag_ptr 107#define dh_callflag_void 0 108#define dh_callflag_noreturn TCG_CALL_NO_RETURN 109#define dh_callflag(t) glue(dh_callflag_, dh_alias(t)) 110 111#define dh_typemask(t, n) (dh_typecode(t) << (n * 3)) 112 113#define dh_arg(t, n) \ 114 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n)) 115 116#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) 117 118#define DEF_HELPER_0(name, ret) \ 119 DEF_HELPER_FLAGS_0(name, 0, ret) 120#define DEF_HELPER_1(name, ret, t1) \ 121 DEF_HELPER_FLAGS_1(name, 0, ret, t1) 122#define DEF_HELPER_2(name, ret, t1, t2) \ 123 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) 124#define DEF_HELPER_3(name, ret, t1, t2, t3) \ 125 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) 126#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ 127 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) 128#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ 129 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) 130#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ 131 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) 132#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \ 133 DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7) 134 135/* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ 136 137#endif /* EXEC_HELPER_HEAD_H */