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 */ 138