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 G_NORETURN void 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 # define dh_typecode_tl dh_typecode_i32 57 # else 58 # define dh_alias_tl i64 59 # define dh_typecode_tl dh_typecode_i64 60 # endif 61 # endif 62 # define dh_ctype_tl target_ulong 63 # define dh_alias_env ptr 64 # define dh_ctype_env CPUArchState * 65 # define dh_typecode_env dh_typecode_ptr 66 #endif 67 68 /* We can't use glue() here because it falls foul of C preprocessor 69 recursive expansion rules. */ 70 #define dh_retvar_decl0_void void 71 #define dh_retvar_decl0_noreturn void 72 #define dh_retvar_decl0_i32 TCGv_i32 retval 73 #define dh_retvar_decl0_i64 TCGv_i64 retval 74 #define dh_retvar_decl0_ptr TCGv_ptr retval 75 #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) 76 77 #define dh_retvar_decl_void 78 #define dh_retvar_decl_noreturn 79 #define dh_retvar_decl_i32 TCGv_i32 retval, 80 #define dh_retvar_decl_i64 TCGv_i64 retval, 81 #define dh_retvar_decl_ptr TCGv_ptr retval, 82 #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) 83 84 #define dh_retvar_void NULL 85 #define dh_retvar_noreturn NULL 86 #define dh_retvar_i32 tcgv_i32_temp(retval) 87 #define dh_retvar_i64 tcgv_i64_temp(retval) 88 #define dh_retvar_ptr tcgv_ptr_temp(retval) 89 #define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) 90 91 #define dh_typecode_void 0 92 #define dh_typecode_noreturn 0 93 #define dh_typecode_i32 2 94 #define dh_typecode_s32 3 95 #define dh_typecode_i64 4 96 #define dh_typecode_s64 5 97 #define dh_typecode_ptr 6 98 #define dh_typecode_int dh_typecode_s32 99 #define dh_typecode_f16 dh_typecode_i32 100 #define dh_typecode_f32 dh_typecode_i32 101 #define dh_typecode_f64 dh_typecode_i64 102 #define dh_typecode_cptr dh_typecode_ptr 103 #define dh_typecode(t) dh_typecode_##t 104 105 #define dh_callflag_i32 0 106 #define dh_callflag_i64 0 107 #define dh_callflag_ptr 0 108 #define dh_callflag_void 0 109 #define dh_callflag_noreturn TCG_CALL_NO_RETURN 110 #define dh_callflag(t) glue(dh_callflag_, dh_alias(t)) 111 112 #define dh_typemask(t, n) (dh_typecode(t) << (n * 3)) 113 114 #define dh_arg(t, n) \ 115 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n)) 116 117 #define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) 118 119 #define DEF_HELPER_0(name, ret) \ 120 DEF_HELPER_FLAGS_0(name, 0, ret) 121 #define DEF_HELPER_1(name, ret, t1) \ 122 DEF_HELPER_FLAGS_1(name, 0, ret, t1) 123 #define DEF_HELPER_2(name, ret, t1, t2) \ 124 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) 125 #define DEF_HELPER_3(name, ret, t1, t2, t3) \ 126 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) 127 #define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ 128 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) 129 #define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ 130 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) 131 #define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ 132 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) 133 #define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \ 134 DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7) 135 136 /* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ 137 138 #endif /* EXEC_HELPER_HEAD_H */ 139